X-Git-Url: http://git.jankratochvil.net/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fcm%2Fcm.h;h=0ffd2290225afc16f7718b8ceb60e1c3e4c260f9;hp=69f6866583a4885b5af33adcd75b7a9a43d81b79;hb=HEAD;hpb=7c0db166f81fbe8c8b913d7f26048e337d383605 diff --git a/ntoskrnl/cm/cm.h b/ntoskrnl/cm/cm.h index 69f6866..0ffd229 100644 --- a/ntoskrnl/cm/cm.h +++ b/ntoskrnl/cm/cm.h @@ -18,18 +18,20 @@ #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" @@ -45,15 +47,6 @@ #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*/