#ifndef CMLIB_H
#define CMLIB_H
-#ifdef CMLIB_HOST
-#include <host/typedefs.h>
-#include <stdio.h>
-#include <string.h>
-
-// Definitions copied from <ntstatus.h>
-// We only want to include host headers, so we define them manually
-#define STATUS_SUCCESS ((NTSTATUS)0x00000000)
-#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
-#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
-#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
-#define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
-#define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
-#define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
-
-#endif
+//
+// Debug support switch
+//
+#define _CMLIB_DEBUG_ 1
-#ifndef _TYPEDEFS_HOST_H
- #include <ntddk.h>
+#ifdef CMLIB_HOST
+ #include <host/typedefs.h>
+ #include <stdio.h>
+ #include <string.h>
+
+ // Definitions copied from <ntstatus.h>
+ // We only want to include host headers, so we define them manually
+ #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
+ #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
+ #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
+ #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
+ #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C)
+ #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C)
+ #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009)
+
+ #define REG_OPTION_VOLATILE 1
+ #define OBJ_CASE_INSENSITIVE 0x00000040L
+ #define USHORT_MAX USHRT_MAX
+
+ VOID NTAPI
+ KeQuerySystemTime(
+ OUT PLARGE_INTEGER CurrentTime);
+
+ VOID NTAPI
+ RtlInitializeBitMap(
+ IN PRTL_BITMAP BitMapHeader,
+ IN PULONG BitMapBuffer,
+ IN ULONG SizeOfBitMap);
+
+ ULONG NTAPI
+ RtlFindSetBits(
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG NumberToFind,
+ IN ULONG HintIndex);
+
+ VOID NTAPI
+ RtlSetBits(
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG StartingIndex,
+ IN ULONG NumberToSet);
+
+ VOID NTAPI
+ RtlClearAllBits(
+ IN PRTL_BITMAP BitMapHeader);
+
+ #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
+ #define UNREFERENCED_PARAMETER(P) {(P)=(P);}
+
+ #define PKTHREAD PVOID
+ #define PKGUARDED_MUTEX PVOID
+ #define PERESOURCE PVOID
+ #define PFILE_OBJECT PVOID
+ #define PKEVENT PVOID
+ #define PWORK_QUEUE_ITEM PVOID
+ #define EX_PUSH_LOCK PULONG_PTR
+
+ /* For <host/wcsfuncs.h> */
+ #define USE_HOST_WCSFUNCS
+
+ #define CMLTRACE(x, ...)
#else
- #define REG_OPTION_VOLATILE 1
- #define OBJ_CASE_INSENSITIVE 0x00000040L
- #define USHORT_MAX USHRT_MAX
-
-VOID NTAPI
-KeQuerySystemTime(
- OUT PLARGE_INTEGER CurrentTime);
-
-VOID NTAPI
-RtlInitializeBitMap(
- IN PRTL_BITMAP BitMapHeader,
- IN PULONG BitMapBuffer,
- IN ULONG SizeOfBitMap);
-
-ULONG NTAPI
-RtlFindSetBits(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG NumberToFind,
- IN ULONG HintIndex);
-
-VOID NTAPI
-RtlSetBits(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG StartingIndex,
- IN ULONG NumberToSet);
-
-VOID NTAPI
-RtlClearAllBits(
- IN PRTL_BITMAP BitMapHeader);
-
-#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
-
+ //
+ // Debug/Tracing support
+ //
+ #if _CMLIB_DEBUG_
+ #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented
+ #define CMLTRACE DbgPrintEx
+ #else
+ #define CMLTRACE(x, ...) \
+ if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__)
+ #endif
+ #else
+ #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__)
+ #endif
+
+ #include <ntdef.h>
+ #undef DECLSPEC_IMPORT
+ #define DECLSPEC_IMPORT
+ #include <ntddk.h>
#endif
-#include <wchar.h>
-#include "hivedata.h"
-#include "cmdata.h"
+#include <host/wcsfuncs.h>
+
+//
+// These define the Debug Masks Supported
+//
+#define CMLIB_HCELL_DEBUG 0x01
#ifndef ROUND_UP
#define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))
#define ROUND_DOWN(a,b) (((a)/(b))*(b))
#endif
-#define CMAPI NTAPI
+//
+// PAGE_SIZE definition
+//
+#ifndef PAGE_SIZE
+#if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm)
+#define PAGE_SIZE 0x1000
+#else
+#error Local PAGE_SIZE definition required when built as host
+#endif
+#endif
-struct _HHIVE;
+#define TAG_CM 0x68742020
-typedef PVOID (CMAPI *PGET_CELL_ROUTINE)(
- struct _HHIVE *Hive,
- HCELL_INDEX Cell);
+#define CMAPI NTAPI
-typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)(
- struct _HHIVE *Hive,
- HCELL_INDEX Cell);
+#include <wchar.h>
+#include "hivedata.h"
+#include "cmdata.h"
-typedef PVOID (CMAPI *PALLOCATE_ROUTINE)(
- SIZE_T Size,
- BOOLEAN Paged);
-
-typedef VOID (CMAPI *PFREE_ROUTINE)(
- PVOID Ptr);
-
-typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)(
- struct _HHIVE *RegistryHive,
- ULONG FileType,
- ULONGLONG FileOffset,
- PVOID Buffer,
- SIZE_T BufferLength);
-
-typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)(
- struct _HHIVE *RegistryHive,
- ULONG FileType,
- ULONGLONG FileOffset,
- PVOID Buffer,
- SIZE_T BufferLength);
-
-typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)(
- struct _HHIVE *RegistryHive,
- ULONG FileType,
- ULONGLONG FileSize);
-
-typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)(
- struct _HHIVE *RegistryHive,
- ULONG FileType);
-
-typedef struct _HMAP_ENTRY
-{
- ULONG_PTR Bin;
- ULONG_PTR Block;
- struct _CM_VIEW_OF_FILE *CmHive;
- ULONG MemAlloc;
-} HMAP_ENTRY, *PHMAP_ENTRY;
+#if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
-typedef struct _HMAP_TABLE
-{
- HMAP_ENTRY Table[512];
-} HMAP_TABLE, *PHMAP_TABLE;
+#define PCM_KEY_SECURITY_CACHE_ENTRY PVOID
+#define PCM_KEY_CONTROL_BLOCK PVOID
+#define CMP_SECURITY_HASH_LISTS 64
+#define PCM_CELL_REMAP_BLOCK PVOID
-typedef struct _HMAP_DIRECTORY
+//
+// Use Count Log and Entry
+//
+typedef struct _CM_USE_COUNT_LOG_ENTRY
{
- PHMAP_TABLE Directory[2048];
-} HMAP_DIRECTORY, *PHMAP_DIRECTORY;
+ HCELL_INDEX Cell;
+ PVOID Stack[7];
+} CM_USE_COUNT_LOG_ENTRY, *PCM_USE_COUNT_LOG_ENTRY;
-typedef struct _DUAL
-{
- ULONG Length;
- PHMAP_DIRECTORY Map;
- PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir;
- ULONG Guard;
- HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24];
- ULONG FreeSummary;
- LIST_ENTRY FreeBins;
-} DUAL, *PDUAL;
-
-typedef struct _HHIVE
+typedef struct _CM_USE_COUNT_LOG
{
- ULONG Signature;
- PGET_CELL_ROUTINE GetCellRoutine;
- PRELEASE_CELL_ROUTINE ReleaseCellRoutine;
- PALLOCATE_ROUTINE Allocate;
- PFREE_ROUTINE Free;
- PFILE_READ_ROUTINE FileRead;
- PFILE_WRITE_ROUTINE FileWrite;
- PFILE_SET_SIZE_ROUTINE FileSetSize;
- PFILE_FLUSH_ROUTINE FileFlush;
- PHBASE_BLOCK HiveHeader;
- RTL_BITMAP DirtyVector;
- ULONG DirtyCount;
- ULONG DirtyAlloc;
- ULONG BaseBlockAlloc;
- ULONG Cluster;
- BOOLEAN Flat;
- BOOLEAN ReadOnly;
- BOOLEAN Log;
- BOOLEAN DirtyFlag;
- ULONG HvBinHeadersUse;
- ULONG HvFreeCellsUse;
- ULONG HvUsedcellsUse;
- ULONG CmUsedCellsUse;
- ULONG HiveFlags;
- ULONG LogSize;
- ULONG RefreshCount;
- ULONG StorageTypeCount;
- ULONG Version;
- DUAL Storage[HvMaxStorageType];
-} HHIVE, *PHHIVE;
-
-#ifndef _CM_
-typedef struct _EREGISTRY_HIVE
+ USHORT Next;
+ USHORT Size;
+ CM_USE_COUNT_LOG_ENTRY Log[32];
+} CM_USE_COUNT_LOG, *PCM_USE_COUNT_LOG;
+
+//
+// Configuration Manager Hive Structure
+//
+typedef struct _CMHIVE
{
- HHIVE Hive;
- LIST_ENTRY HiveList;
- UNICODE_STRING HiveFileName;
- UNICODE_STRING LogFileName;
- PCM_KEY_SECURITY RootSecurityCell;
- ULONG Flags;
- HANDLE HiveHandle;
- HANDLE LogHandle;
-} EREGISTRY_HIVE, *PEREGISTRY_HIVE;
+ HHIVE Hive;
+ HANDLE FileHandles[3];
+ LIST_ENTRY NotifyList;
+ LIST_ENTRY HiveList;
+ EX_PUSH_LOCK HiveLock;
+ PKTHREAD HiveLockOwner;
+ PKGUARDED_MUTEX ViewLock;
+ PKTHREAD ViewLockOwner;
+ EX_PUSH_LOCK WriterLock;
+ PKTHREAD WriterLockOwner;
+ PERESOURCE FlusherLock;
+ EX_PUSH_LOCK SecurityLock;
+ PKTHREAD HiveSecurityLockOwner;
+ LIST_ENTRY LRUViewListHead;
+ LIST_ENTRY PinViewListHead;
+ PFILE_OBJECT FileObject;
+ UNICODE_STRING FileFullPath;
+ UNICODE_STRING FileUserName;
+ USHORT MappedViews;
+ USHORT PinnedViews;
+ ULONG UseCount;
+ ULONG SecurityCount;
+ ULONG SecurityCacheSize;
+ LONG SecurityHitHint;
+ PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache;
+ LIST_ENTRY SecurityHash[CMP_SECURITY_HASH_LISTS];
+ PKEVENT UnloadEvent;
+ PCM_KEY_CONTROL_BLOCK RootKcb;
+ BOOLEAN Frozen;
+ PWORK_QUEUE_ITEM UnloadWorkItem;
+ BOOLEAN GrowOnlyMode;
+ ULONG GrowOffset;
+ LIST_ENTRY KcbConvertListHead;
+ LIST_ENTRY KnodeConvertListHead;
+ PCM_CELL_REMAP_BLOCK CellRemapArray;
+ CM_USE_COUNT_LOG UseCountLog;
+ CM_USE_COUNT_LOG LockHiveLog;
+ ULONG Flags;
+ LIST_ENTRY TrustClassEntry;
+ ULONG FlushCount;
+ BOOLEAN HiveIsLoading;
+ PKTHREAD CreatorOwner;
+} CMHIVE, *PCMHIVE;
+
#endif
+extern ULONG CmlibTraceLevel;
+
/*
* Public functions.
*/
-
-#define HV_OPERATION_CREATE_HIVE 0
-#define HV_OPERATION_MEMORY 1
-#define HV_OPERATION_MEMORY_INPLACE 3
-
NTSTATUS CMAPI
HvInitialize(
- PHHIVE RegistryHive,
+ PHHIVE RegistryHive,
ULONG Operation,
ULONG HiveType,
ULONG HiveFlags,
- ULONG_PTR HiveData OPTIONAL,
- ULONG Cluster OPTIONAL,
+ PVOID HiveData OPTIONAL,
PALLOCATE_ROUTINE Allocate,
PFREE_ROUTINE Free,
- PFILE_READ_ROUTINE FileRead,
- PFILE_WRITE_ROUTINE FileWrite,
PFILE_SET_SIZE_ROUTINE FileSetSize,
+ PFILE_WRITE_ROUTINE FileWrite,
+ PFILE_READ_ROUTINE FileRead,
PFILE_FLUSH_ROUTINE FileFlush,
- IN PUNICODE_STRING FileName);
+ ULONG Cluster OPTIONAL,
+ PUNICODE_STRING FileName);
-VOID CMAPI
+VOID CMAPI
HvFree(
PHHIVE RegistryHive);
HvAllocateCell(
PHHIVE RegistryHive,
SIZE_T Size,
- HV_STORAGE_TYPE Storage);
+ HSTORAGE_TYPE Storage,
+ IN HCELL_INDEX Vicinity);
BOOLEAN CMAPI
HvIsCellAllocated(
PHHIVE RegistryHive,
HCELL_INDEX CellOffset);
-VOID CMAPI
+BOOLEAN CMAPI
HvMarkCellDirty(
PHHIVE RegistryHive,
- HCELL_INDEX CellOffset);
+ HCELL_INDEX CellOffset,
+ BOOLEAN HoldingLock);
BOOLEAN CMAPI
HvIsCellDirty(
HvpAddBin(
PHHIVE RegistryHive,
ULONG Size,
- HV_STORAGE_TYPE Storage);
+ HSTORAGE_TYPE Storage);
NTSTATUS CMAPI
HvpCreateHiveFreeCellList(