-/*\r
- * PROJECT: registry manipulation library\r
- * LICENSE: GPL - See COPYING in the top level directory\r
- * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>\r
- * Copyright 2001 - 2005 Eric Kohl\r
- */\r
-\r
-#ifndef CMLIB_H\r
-#define CMLIB_H\r
-\r
-#define WIN32_NO_STATUS\r
-#include <ntddk.h>\r
-#include "hivedata.h"\r
-#include "cmdata.h"\r
-\r
-#ifndef ROUND_UP\r
-#define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b))\r
-#define ROUND_DOWN(a,b) (((a)/(b))*(b))\r
-#endif\r
-\r
-#define CMAPI NTAPI\r
-\r
-struct _HHIVE;\r
-\r
-typedef PVOID (CMAPI *PGET_CELL_ROUTINE)(\r
- struct _HHIVE *Hive,\r
- HCELL_INDEX Cell);\r
-\r
-typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)(\r
- struct _HHIVE *Hive,\r
- HCELL_INDEX Cell);\r
-\r
-typedef PVOID (CMAPI *PALLOCATE_ROUTINE)(\r
- SIZE_T Size,\r
- BOOLEAN Paged);\r
-\r
-typedef VOID (CMAPI *PFREE_ROUTINE)(\r
- PVOID Ptr);\r
-\r
-typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)(\r
- struct _HHIVE *RegistryHive,\r
- ULONG FileType,\r
- ULONGLONG FileOffset,\r
- PVOID Buffer,\r
- SIZE_T BufferLength);\r
-\r
-typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)(\r
- struct _HHIVE *RegistryHive,\r
- ULONG FileType,\r
- ULONGLONG FileOffset,\r
- PVOID Buffer,\r
- SIZE_T BufferLength);\r
-\r
-typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)(\r
- struct _HHIVE *RegistryHive,\r
- ULONG FileType,\r
- ULONGLONG FileSize);\r
-\r
-typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)(\r
- struct _HHIVE *RegistryHive,\r
- ULONG FileType);\r
-\r
-typedef struct _HMAP_ENTRY\r
-{\r
- ULONG_PTR Bin;\r
- ULONG_PTR Block;\r
- struct _CM_VIEW_OF_FILE *CmHive;\r
- ULONG MemAlloc;\r
-} HMAP_ENTRY, *PHMAP_ENTRY;\r
-\r
-typedef struct _HMAP_TABLE\r
-{\r
- HMAP_ENTRY Table[512];\r
-} HMAP_TABLE, *PHMAP_TABLE;\r
-\r
-typedef struct _HMAP_DIRECTORY\r
-{\r
- PHMAP_TABLE Directory[2048];\r
-} HMAP_DIRECTORY, *PHMAP_DIRECTORY;\r
-\r
-typedef struct _DUAL\r
-{\r
- ULONG Length;\r
- PHMAP_DIRECTORY Map;\r
- PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir;\r
- ULONG Guard;\r
- HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24];\r
- ULONG FreeSummary;\r
- LIST_ENTRY FreeBins;\r
-} DUAL, *PDUAL;\r
-\r
-typedef struct _HHIVE\r
-{\r
- ULONG Signature;\r
- PGET_CELL_ROUTINE GetCellRoutine;\r
- PRELEASE_CELL_ROUTINE ReleaseCellRoutine;\r
- PALLOCATE_ROUTINE Allocate;\r
- PFREE_ROUTINE Free;\r
- PFILE_READ_ROUTINE FileRead;\r
- PFILE_WRITE_ROUTINE FileWrite;\r
- PFILE_SET_SIZE_ROUTINE FileSetSize;\r
- PFILE_FLUSH_ROUTINE FileFlush;\r
- PHBASE_BLOCK HiveHeader;\r
- RTL_BITMAP DirtyVector;\r
- ULONG DirtyCount;\r
- ULONG DirtyAlloc;\r
- ULONG BaseBlockAlloc;\r
- ULONG Cluster;\r
- BOOLEAN Flat;\r
- BOOLEAN ReadOnly;\r
- BOOLEAN Log;\r
- BOOLEAN DirtyFlag;\r
- ULONG HvBinHeadersUse;\r
- ULONG HvFreeCellsUse;\r
- ULONG HvUsedcellsUse;\r
- ULONG CmUsedCellsUse;\r
- ULONG HiveFlags;\r
- ULONG LogSize;\r
- ULONG RefreshCount;\r
- ULONG StorageTypeCount;\r
- ULONG Version;\r
- DUAL Storage[HvMaxStorageType];\r
-} HHIVE, *PHHIVE;\r
-\r
-#ifndef _CM_\r
-typedef struct _EREGISTRY_HIVE\r
-{\r
- HHIVE Hive;\r
- LIST_ENTRY HiveList;\r
- UNICODE_STRING HiveFileName;\r
- UNICODE_STRING LogFileName;\r
- PCM_KEY_SECURITY RootSecurityCell;\r
- ULONG Flags;\r
- HANDLE HiveHandle;\r
- HANDLE LogHandle;\r
-} EREGISTRY_HIVE, *PEREGISTRY_HIVE;\r
-#endif\r
-\r
-/*\r
- * Public functions.\r
- */\r
-\r
-#define HV_OPERATION_CREATE_HIVE 0\r
-#define HV_OPERATION_MEMORY 1\r
-#define HV_OPERATION_MEMORY_INPLACE 3\r
-\r
-NTSTATUS CMAPI\r
-HvInitialize(\r
- PHHIVE RegistryHive,\r
- ULONG Operation,\r
- ULONG_PTR HiveData OPTIONAL,\r
- ULONG Cluster OPTIONAL,\r
- ULONG Flags,\r
- ULONG FileType,\r
- PALLOCATE_ROUTINE Allocate,\r
- PFREE_ROUTINE Free,\r
- PFILE_READ_ROUTINE FileRead,\r
- PFILE_WRITE_ROUTINE FileWrite,\r
- PFILE_SET_SIZE_ROUTINE FileSetSize,\r
- PFILE_FLUSH_ROUTINE FileFlush,\r
- IN PUNICODE_STRING FileName);\r
-\r
-VOID CMAPI \r
-HvFree(\r
- PHHIVE RegistryHive);\r
-\r
-PVOID CMAPI\r
-HvGetCell(\r
- PHHIVE RegistryHive,\r
- HCELL_INDEX CellOffset);\r
-\r
-#define HvReleaseCell(h, c) \\r
- if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)\r
-\r
-LONG CMAPI\r
-HvGetCellSize(\r
- PHHIVE RegistryHive,\r
- PVOID Cell);\r
-\r
-HCELL_INDEX CMAPI\r
-HvAllocateCell(\r
- PHHIVE RegistryHive,\r
- SIZE_T Size,\r
- HV_STORAGE_TYPE Storage);\r
-\r
-HCELL_INDEX CMAPI\r
-HvReallocateCell(\r
- PHHIVE RegistryHive,\r
- HCELL_INDEX CellOffset,\r
- ULONG Size);\r
-\r
-VOID CMAPI\r
-HvFreeCell(\r
- PHHIVE RegistryHive,\r
- HCELL_INDEX CellOffset);\r
-\r
-VOID CMAPI\r
-HvMarkCellDirty(\r
- PHHIVE RegistryHive,\r
- HCELL_INDEX CellOffset);\r
-\r
-BOOLEAN CMAPI\r
-HvSyncHive(\r
- PHHIVE RegistryHive);\r
-\r
-BOOLEAN CMAPI\r
-HvWriteHive(\r
- PHHIVE RegistryHive);\r
-\r
-BOOLEAN CMAPI\r
-CmCreateRootNode(\r
- PHHIVE Hive,\r
- PCWSTR Name);\r
-\r
-VOID CMAPI\r
-CmPrepareHive(\r
- PHHIVE RegistryHive);\r
-\r
-/*\r
- * Private functions.\r
- */\r
-\r
-PHBIN CMAPI\r
-HvpAddBin(\r
- PHHIVE RegistryHive,\r
- ULONG Size,\r
- HV_STORAGE_TYPE Storage);\r
-\r
-NTSTATUS CMAPI\r
-HvpCreateHiveFreeCellList(\r
- PHHIVE Hive);\r
-\r
-ULONG CMAPI\r
-HvpHiveHeaderChecksum(\r
- PHBASE_BLOCK HiveHeader);\r
-\r
-#endif /* CMLIB_H */\r
+/*
+ * PROJECT: registry manipulation library
+ * LICENSE: GPL - See COPYING in the top level directory
+ * COPYRIGHT: Copyright 2005 Filip Navara <navaraf@reactos.org>
+ * Copyright 2001 - 2005 Eric Kohl
+ */
+
+#ifndef CMLIB_H
+#define CMLIB_H
+
+//
+// Debug support switch
+//
+#define _CMLIB_DEBUG_ 1
+
+#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
+ //
+ // 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 <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
+
+//
+// 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
+
+#define TAG_CM 0x68742020
+
+#define CMAPI NTAPI
+
+#include <wchar.h>
+#include "hivedata.h"
+#include "cmdata.h"
+
+#if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
+
+#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
+
+//
+// Use Count Log and Entry
+//
+typedef struct _CM_USE_COUNT_LOG_ENTRY
+{
+ HCELL_INDEX Cell;
+ PVOID Stack[7];
+} CM_USE_COUNT_LOG_ENTRY, *PCM_USE_COUNT_LOG_ENTRY;
+
+typedef struct _CM_USE_COUNT_LOG
+{
+ 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;
+ 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.
+ */
+NTSTATUS CMAPI
+HvInitialize(
+ PHHIVE RegistryHive,
+ ULONG Operation,
+ ULONG HiveType,
+ ULONG HiveFlags,
+ PVOID HiveData OPTIONAL,
+ PALLOCATE_ROUTINE Allocate,
+ PFREE_ROUTINE Free,
+ PFILE_SET_SIZE_ROUTINE FileSetSize,
+ PFILE_WRITE_ROUTINE FileWrite,
+ PFILE_READ_ROUTINE FileRead,
+ PFILE_FLUSH_ROUTINE FileFlush,
+ ULONG Cluster OPTIONAL,
+ PUNICODE_STRING FileName);
+
+VOID CMAPI
+HvFree(
+ PHHIVE RegistryHive);
+
+PVOID CMAPI
+HvGetCell(
+ PHHIVE RegistryHive,
+ HCELL_INDEX CellOffset);
+
+#define HvReleaseCell(h, c) \
+ if (h->ReleaseCellRoutine) h->ReleaseCellRoutine(h, c)
+
+LONG CMAPI
+HvGetCellSize(
+ PHHIVE RegistryHive,
+ PVOID Cell);
+
+HCELL_INDEX CMAPI
+HvAllocateCell(
+ PHHIVE RegistryHive,
+ SIZE_T Size,
+ HSTORAGE_TYPE Storage,
+ IN HCELL_INDEX Vicinity);
+
+BOOLEAN CMAPI
+HvIsCellAllocated(
+ IN PHHIVE RegistryHive,
+ IN HCELL_INDEX CellIndex
+);
+
+HCELL_INDEX CMAPI
+HvReallocateCell(
+ PHHIVE RegistryHive,
+ HCELL_INDEX CellOffset,
+ ULONG Size);
+
+VOID CMAPI
+HvFreeCell(
+ PHHIVE RegistryHive,
+ HCELL_INDEX CellOffset);
+
+BOOLEAN CMAPI
+HvMarkCellDirty(
+ PHHIVE RegistryHive,
+ HCELL_INDEX CellOffset,
+ BOOLEAN HoldingLock);
+
+BOOLEAN CMAPI
+HvIsCellDirty(
+ IN PHHIVE Hive,
+ IN HCELL_INDEX Cell
+);
+
+BOOLEAN CMAPI
+HvSyncHive(
+ PHHIVE RegistryHive);
+
+BOOLEAN CMAPI
+HvWriteHive(
+ PHHIVE RegistryHive);
+
+BOOLEAN CMAPI
+CmCreateRootNode(
+ PHHIVE Hive,
+ PCWSTR Name);
+
+VOID CMAPI
+CmPrepareHive(
+ PHHIVE RegistryHive);
+
+/*
+ * Private functions.
+ */
+
+PHBIN CMAPI
+HvpAddBin(
+ PHHIVE RegistryHive,
+ ULONG Size,
+ HSTORAGE_TYPE Storage);
+
+NTSTATUS CMAPI
+HvpCreateHiveFreeCellList(
+ PHHIVE Hive);
+
+ULONG CMAPI
+HvpHiveHeaderChecksum(
+ PHBASE_BLOCK HiveHeader);
+
+#endif /* CMLIB_H */