#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;
ULONG UpdateCounter2;
/* When this hive file was last modified */
- FILETIME DateModified;
+ LARGE_INTEGER DateModified;
/* Registry format version ? (1?) */
ULONG Unused3;
ULONG Unused1;
/* When this bin was last modified */
- FILETIME DateModified;
+ LARGE_INTEGER DateModified;
/* ? */
ULONG Unused2;
/* Key cell identifier "kn" (0x6b6e) */
USHORT Id;
- /* ? */
- USHORT Type;
+ /* Flags */
+ USHORT Flags;
/* Time of last flush */
- FILETIME LastWriteTime;
+ LARGE_INTEGER LastWriteTime;
/* ? */
ULONG UnUsed1;
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;
HASH_RECORD Table[0];
} __attribute__((packed)) HASH_TABLE_CELL, *PHASH_TABLE_CELL;
+
typedef struct _VALUE_LIST_CELL
{
LONG CellSize;
} 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)
/* 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;
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);
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,
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,
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);
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*/