update for HEAD-2003091401
[reactos.git] / ntoskrnl / cm / cm.h
index 69f6866..0ffd229 100644 (file)
 #define  REG_SOFTWARE_KEY_NAME         L"\\Registry\\Machine\\Software"
 #define  REG_SAM_KEY_NAME              L"\\Registry\\Machine\\Sam"
 #define  REG_SEC_KEY_NAME              L"\\Registry\\Machine\\Security"
-#define  REG_USERS_KEY_NAME            L"\\Registry\\User"
-#define  REG_USER_KEY_NAME             L"\\Registry\\User\\CurrentUser"
+#define  REG_USER_KEY_NAME             L"\\Registry\\User"
+#define  REG_DEFAULT_USER_KEY_NAME     L"\\Registry\\User\\.Default"
+#define  REG_CURRENT_USER_KEY_NAME     L"\\Registry\\User\\CurrentUser"
+
 #define  SYSTEM_REG_FILE               L"\\SystemRoot\\System32\\Config\\SYSTEM"
 #define  SYSTEM_LOG_FILE               L"\\SystemRoot\\System32\\Config\\SYSTEM.log"
 #define  SOFTWARE_REG_FILE             L"\\SystemRoot\\System32\\Config\\SOFTWARE"
-#define  USER_REG_FILE                 L"\\SystemRoot\\System32\\Config\\DEFAULT"
+#define  DEFAULT_USER_REG_FILE         L"\\SystemRoot\\System32\\Config\\DEFAULT"
 #define  SAM_REG_FILE                  L"\\SystemRoot\\System32\\Config\\SAM"
 #define  SEC_REG_FILE                  L"\\SystemRoot\\System32\\Config\\SECURITY"
 
 #define  REG_SYSTEM_FILE_NAME          L"\\SYSTEM"
 #define  REG_SOFTWARE_FILE_NAME                L"\\SOFTWARE"
-#define  REG_USER_FILE_NAME            L"\\DEFAULT"
+#define  REG_DEFAULT_USER_FILE_NAME    L"\\DEFAULT"
 #define  REG_SAM_FILE_NAME             L"\\SAM"
 #define  REG_SEC_FILE_NAME             L"\\SECURITY"
 
 #define  REG_VALUE_CELL_ID             0x6b76
 #define  REG_HIVE_ID                   0x66676572
 
-#define  REGISTRY_FILE_MAGIC    "REGEDIT4"
-
-#define  REG_MACHINE_STD_HANDLE_NAME  "HKEY_LOCAL_MACHINE"
-#define  REG_CLASSES_STD_HANDLE_NAME  "HKEY_CLASSES_ROOT"
-#define  REG_USERS_STD_HANDLE_NAME    "HKEY_USERS"
-#define  REG_USER_STD_HANDLE_NAME     "HKEY_CURRENT_USER"
-#define  REG_CONFIG_STD_HANDLE_NAME   "HKEY_CURRENT_CONFIG"
-#define  REG_DYN_STD_HANDLE_NAME      "HKEY_DYN_DATA"
-#define  MAX_REG_STD_HANDLE_NAME      19
 
 // BLOCK_OFFSET = offset in file after header block
 typedef ULONG BLOCK_OFFSET;
@@ -71,7 +64,7 @@ typedef struct _HIVE_HEADER
   ULONG  UpdateCounter2;
 
   /* When this hive file was last modified */
-  FILETIME  DateModified;
+  LARGE_INTEGER  DateModified;
 
   /* Registry format version ? (1?) */
   ULONG  Unused3;
@@ -120,7 +113,7 @@ typedef struct _HBIN
   ULONG  Unused1;
 
   /* When this bin was last modified */
-  FILETIME  DateModified;
+  LARGE_INTEGER  DateModified;
 
   /* ? */
   ULONG  Unused2;
@@ -140,11 +133,11 @@ typedef struct _KEY_CELL
   /* Key cell identifier "kn" (0x6b6e) */
   USHORT  Id;
 
-  /* ? */
-  USHORT  Type;
+  /* Flags */
+  USHORT  Flags;
 
   /* Time of last flush */
-  FILETIME  LastWriteTime;
+  LARGE_INTEGER  LastWriteTime;
 
   /* ? */
   ULONG  UnUsed1;
@@ -189,14 +182,19 @@ typedef struct _KEY_CELL
   UCHAR  Name[0];
 } __attribute__((packed)) KEY_CELL, *PKEY_CELL;
 
-/* KEY_CELL.Type constants */
-#define  REG_LINK_KEY_CELL_TYPE        0x10
-#define  REG_KEY_CELL_TYPE             0x20
-#define  REG_ROOT_KEY_CELL_TYPE        0x2c
+/* KEY_CELL.Flags constants */
+#define  REG_KEY_ROOT_CELL                 0x0C
+#define  REG_KEY_LINK_CELL                 0x10
+#define  REG_KEY_NAME_PACKED               0x20
 
 
-// hash record :
-// HashValue=four letters of value's name
+/*
+ * Hash record
+ *
+ * HashValue :
+ *     packed name: four letters of value's name
+ *     otherwise: Zero!
+ */
 typedef struct _HASH_RECORD
 {
   BLOCK_OFFSET  KeyOffset;
@@ -211,6 +209,7 @@ typedef struct _HASH_TABLE_CELL
   HASH_RECORD  Table[0];
 } __attribute__((packed)) HASH_TABLE_CELL, *PHASH_TABLE_CELL;
 
+
 typedef struct _VALUE_LIST_CELL
 {
   LONG  CellSize;
@@ -263,16 +262,20 @@ typedef struct _REGISTRY_HIVE
 } REGISTRY_HIVE, *PREGISTRY_HIVE;
 
 /* REGISTRY_HIVE.Flags constants */
-/* When set, the hive is volatile. It will not be sync'ed to disk. */
-#define HIVE_VOLATILE   0x00000001
 /* When set, the hive uses pointers instead of offsets. */
-#define HIVE_POINTER    0x00000002
-/* When set, the hive is temporary. It will not be sync'ed to disk. */
-#define HIVE_TEMPORARY  0x00000004
+#define HIVE_POINTER    0x00000001
+
+/* When set, the hive is not backed by a file.
+   Therefore, it can not be flushed to disk. */
+#define HIVE_NO_FILE    0x00000002
+
+/* When set, a modified (dirty) hive is not synchronized automatically.
+   Explicit synchronization (save/flush) works. */
+#define HIVE_NO_SYNCH   0x00000004
 
-#define IsVolatileHive(Hive)(Hive->Flags & HIVE_VOLATILE)
-#define IsPointerHive(Hive)(Hive->Flags & HIVE_POINTER)
-#define IsTemporaryHive(Hive)(Hive->Flags & HIVE_TEMPORARY)
+#define IsPointerHive(Hive)  ((Hive)->Flags & HIVE_POINTER)
+#define IsNoFileHive(Hive)  ((Hive)->Flags & HIVE_NO_FILE)
+#define IsNoSynchHive(Hive)  ((Hive)->Flags & HIVE_NO_SYNCH)
 
 
 #define IsFreeCell(Cell)(Cell->CellSize >= 0)
@@ -296,11 +299,8 @@ typedef struct _KEY_OBJECT
   /* Key flags */
   ULONG Flags;
 
-  /* Length of Name */
-  USHORT NameSize;
-
-  /* Name of key */
-  PCHAR Name;
+  /* Key name */
+  UNICODE_STRING Name;
 
   /* Registry hive the key belongs to */
   PREGISTRY_HIVE RegistryHive;
@@ -393,21 +393,48 @@ CmiObjectSecurity(PVOID ObjectBody,
                  PSECURITY_DESCRIPTOR SecurityDescriptor,
                  PULONG BufferLength);
 
+NTSTATUS STDCALL
+CmiObjectQueryName (PVOID ObjectBody,
+                   POBJECT_NAME_INFORMATION ObjectNameInfo,
+                   ULONG Length,
+                   PULONG ReturnLength);
+
+NTSTATUS
+CmiImportHiveBins(PREGISTRY_HIVE Hive,
+                 PUCHAR ChunkPtr);
+
+VOID
+CmiFreeHiveBins(PREGISTRY_HIVE Hive);
+
+NTSTATUS
+CmiCreateHiveFreeCellList(PREGISTRY_HIVE Hive);
+
 VOID
-CmiAddKeyToList(PKEY_OBJECT ParentKey,
-  IN PKEY_OBJECT  NewKey);
+CmiFreeHiveFreeCellList(PREGISTRY_HIVE Hive);
 
 NTSTATUS
-CmiRemoveKeyFromList(IN PKEY_OBJECT  NewKey);
+CmiCreateHiveBitmap(PREGISTRY_HIVE Hive);
+
+
+VOID
+CmiAddKeyToList(IN PKEY_OBJECT ParentKey,
+               IN PKEY_OBJECT NewKey);
+
+NTSTATUS
+CmiRemoveKeyFromList(IN PKEY_OBJECT NewKey);
+
+PKEY_OBJECT
+CmiScanKeyList(IN PKEY_OBJECT Parent,
+              IN PUNICODE_STRING KeyName,
+              IN ULONG Attributes);
 
-PKEY_OBJECT  CmiScanKeyList(IN PKEY_OBJECT Parent,
-  IN PCHAR  KeyNameBuf,
-  IN ULONG  Attributes);
+NTSTATUS
+CmiCreateVolatileHive(PREGISTRY_HIVE *RegistryHive);
 
 NTSTATUS
-CmiCreateRegistryHive(PWSTR Filename,
-  PREGISTRY_HIVE *RegistryHive,
-  BOOLEAN CreateNew);
+CmiLoadHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
+           PUNICODE_STRING FileName,
+           ULONG Flags);
 
 NTSTATUS
 CmiRemoveRegistryHive(PREGISTRY_HIVE RegistryHive);
@@ -416,12 +443,10 @@ NTSTATUS
 CmiFlushRegistryHive(PREGISTRY_HIVE RegistryHive);
 
 ULONG
-CmiGetMaxNameLength(IN PREGISTRY_HIVE  RegistryHive,
-  IN PKEY_CELL  KeyCell);
+CmiGetMaxNameLength(IN PKEY_OBJECT KeyObject);
 
 ULONG
-CmiGetMaxClassLength(IN PREGISTRY_HIVE  RegistryHive,
-  IN PKEY_CELL  KeyCell);
+CmiGetMaxClassLength(IN PKEY_OBJECT KeyObject);
 
 ULONG
 CmiGetMaxValueNameLength(IN PREGISTRY_HIVE  RegistryHive,
@@ -433,22 +458,21 @@ CmiGetMaxValueDataLength(IN PREGISTRY_HIVE  RegistryHive,
 
 NTSTATUS
 CmiScanForSubKey(IN PREGISTRY_HIVE  RegistryHive,
-  IN PKEY_CELL  KeyCell,
-  OUT PKEY_CELL  *SubKeyCell,
-  OUT BLOCK_OFFSET *BlockOffset,
-  IN PCHAR  KeyName,
-  IN ACCESS_MASK  DesiredAccess,
-  IN ULONG Attributes);
+                IN PKEY_CELL  KeyCell,
+                OUT PKEY_CELL  *SubKeyCell,
+                OUT BLOCK_OFFSET *BlockOffset,
+                IN PUNICODE_STRING KeyName,
+                IN ACCESS_MASK  DesiredAccess,
+                IN ULONG Attributes);
 
 NTSTATUS
 CmiAddSubKey(IN PREGISTRY_HIVE  RegistryHive,
-  IN PKEY_OBJECT Parent,
-  OUT PKEY_OBJECT SubKey,
-  IN PWSTR  NewSubKeyName,
-  IN USHORT  NewSubKeyNameSize,
-  IN ULONG  TitleIndex,
-  IN PUNICODE_STRING  Class,
-  IN ULONG  CreateOptions);
+            IN PKEY_OBJECT Parent,
+            OUT PKEY_OBJECT SubKey,
+            IN PUNICODE_STRING SubKeyName,
+            IN ULONG  TitleIndex,
+            IN PUNICODE_STRING  Class,
+            IN ULONG  CreateOptions);
 
 NTSTATUS
 CmiRemoveSubKey(IN PREGISTRY_HIVE RegistryHive,
@@ -545,8 +569,12 @@ CmiAddFree(PREGISTRY_HIVE  RegistryHive,
           BOOLEAN MergeFreeBlocks);
 
 NTSTATUS
-CmiConnectHive(PREGISTRY_HIVE RegistryHive,
-              PUNICODE_STRING KeyName);
+CmiConnectHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
+              PREGISTRY_HIVE RegistryHive);
+
+NTSTATUS
+CmiDisconnectHive (POBJECT_ATTRIBUTES KeyObjectAttributes,
+                  PREGISTRY_HIVE *RegistryHive);
 
 NTSTATUS
 CmiInitHives(BOOLEAN SetupBoot);
@@ -566,7 +594,38 @@ CmiCopyPackedName(PWCHAR NameBuffer,
                  PCHAR PackedNameBuffer,
                  ULONG PackedNameSize);
 
+BOOLEAN
+CmiCompareHash(PUNICODE_STRING KeyName,
+              PCHAR HashString);
+
+BOOLEAN
+CmiCompareHashI(PUNICODE_STRING KeyName,
+               PCHAR HashString);
+
+BOOLEAN
+CmiCompareKeyNames(PUNICODE_STRING KeyName,
+                  PKEY_CELL KeyCell);
+
+BOOLEAN
+CmiCompareKeyNamesI(PUNICODE_STRING KeyName,
+                   PKEY_CELL KeyCell);
+
+
 VOID
 CmiSyncHives(VOID);
 
+
+NTSTATUS
+CmiCreateTempHive(PREGISTRY_HIVE *RegistryHive);
+
+NTSTATUS
+CmiCopyKey (PREGISTRY_HIVE DstHive,
+           PKEY_CELL DstKeyCell,
+           PREGISTRY_HIVE SrcHive,
+           PKEY_CELL SrcKeyCell);
+
+NTSTATUS
+CmiSaveTempHive (PREGISTRY_HIVE Hive,
+                HANDLE FileHandle);
+
 #endif /*__INCLUDE_CM_H*/