- DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Proto...
[reactos.git] / reactos / lib / cmlib / cmlib.h
index 1554d38..ca289e7 100644 (file)
-/*\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
-#include <ddk/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\r
-\r
-typedef struct _BLOCK_LIST_ENTRY\r
-{\r
-   PHBIN Bin;\r
-   PVOID Block;\r
-} BLOCK_LIST_ENTRY, *PBLOCK_LIST_ENTRY;\r
-\r
-struct _REGISTRY_HIVE;\r
-\r
-typedef PVOID (CMAPI *PHV_ALLOCATE)(\r
-   ULONG Size,\r
-   BOOLEAN Paged);\r
-\r
-typedef VOID (CMAPI *PHV_FREE)(\r
-   PVOID Ptr);\r
-\r
-typedef BOOLEAN (CMAPI *PHV_FILE_READ)(\r
-   struct _REGISTRY_HIVE *RegistryHive,\r
-   ULONG FileType,\r
-   ULONG FileOffset,\r
-   PVOID Buffer,\r
-   ULONG BufferLength);\r
-\r
-typedef BOOLEAN (CMAPI *PHV_FILE_WRITE)(\r
-   struct _REGISTRY_HIVE *RegistryHive,\r
-   ULONG FileType,\r
-   ULONG FileOffset,\r
-   PVOID Buffer,\r
-   ULONG BufferLength);\r
-\r
-typedef BOOLEAN (CMAPI *PHV_FILE_SET_SIZE)(\r
-   struct _REGISTRY_HIVE *RegistryHive,\r
-   ULONG FileType,\r
-   ULONG FileSize);\r
-\r
-typedef BOOLEAN (CMAPI *PHV_FILE_FLUSH)(\r
-   struct _REGISTRY_HIVE *RegistryHive,\r
-   ULONG FileType);\r
-\r
-typedef struct _REGISTRY_HIVE\r
-{\r
-   PHIVE_HEADER HiveHeader;\r
-   BOOLEAN ReadOnly;\r
-   BOOLEAN Flat;\r
-   RTL_BITMAP DirtyBitmap;\r
-   struct\r
-   {\r
-      ULONG BlockListSize;\r
-      PBLOCK_LIST_ENTRY BlockList;\r
-      HCELL_INDEX FreeListOffset[24];\r
-   } Storage[HvMaxStorageType];\r
-\r
-   PHV_ALLOCATE Allocate;\r
-   PHV_FREE Free;\r
-   PHV_FILE_READ FileRead;\r
-   PHV_FILE_WRITE FileWrite;\r
-   PHV_FILE_SET_SIZE FileSetSize;\r
-   PHV_FILE_FLUSH FileFlush;\r
-   PVOID Opaque;\r
-} REGISTRY_HIVE, *PREGISTRY_HIVE;\r
-\r
-/*\r
- * Public functions.\r
- */\r
-\r
-#define HV_OPERATION_CREATE_HIVE    1\r
-#define HV_OPERATION_MEMORY         2\r
-#define HV_OPERATION_MEMORY_INPLACE 3\r
-\r
-NTSTATUS CMAPI\r
-HvInitialize(\r
-   PREGISTRY_HIVE *RegistryHive,\r
-   ULONG Operation,\r
-   ULONG_PTR ChunkBase,\r
-   SIZE_T ChunkSize,\r
-   PHV_ALLOCATE Allocate,\r
-   PHV_FREE Free,\r
-   PHV_FILE_READ FileRead,\r
-   PHV_FILE_WRITE FileWrite,\r
-   PHV_FILE_SET_SIZE FileSetSize,\r
-   PHV_FILE_FLUSH FileFlush,\r
-   PVOID Opaque);\r
-\r
-VOID CMAPI \r
-HvFree(\r
-   PREGISTRY_HIVE RegistryHive);\r
-\r
-PVOID CMAPI\r
-HvGetCell(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   HCELL_INDEX CellOffset);\r
-\r
-LONG CMAPI\r
-HvGetCellSize(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   PVOID Cell);\r
-\r
-HCELL_INDEX CMAPI\r
-HvAllocateCell(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   ULONG Size,\r
-   HV_STORAGE_TYPE Storage);\r
-\r
-HCELL_INDEX CMAPI\r
-HvReallocateCell(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   HCELL_INDEX CellOffset,\r
-   ULONG Size);\r
-\r
-VOID CMAPI\r
-HvFreeCell(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   HCELL_INDEX CellOffset);\r
-\r
-VOID CMAPI\r
-HvMarkCellDirty(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   HCELL_INDEX CellOffset);\r
-\r
-BOOLEAN CMAPI\r
-HvSyncHive(\r
-   PREGISTRY_HIVE RegistryHive);\r
-\r
-BOOLEAN CMAPI\r
-HvWriteHive(\r
-   PREGISTRY_HIVE RegistryHive);\r
-\r
-BOOLEAN CMAPI\r
-CmCreateRootNode(\r
-   PREGISTRY_HIVE Hive,\r
-   PCWSTR Name);\r
-\r
-VOID CMAPI\r
-CmPrepareHive(\r
-   PREGISTRY_HIVE RegistryHive);\r
-\r
-/*\r
- * Private functions.\r
- */\r
-\r
-PHBIN CMAPI\r
-HvpAddBin(\r
-   PREGISTRY_HIVE RegistryHive,\r
-   ULONG Size,\r
-   HV_STORAGE_TYPE Storage);\r
-\r
-NTSTATUS CMAPI\r
-HvpCreateHiveFreeCellList(\r
-   PREGISTRY_HIVE Hive);\r
-\r
-ULONG CMAPI\r
-HvpHiveHeaderChecksum(\r
-   PHIVE_HEADER 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 */