mirror of
https://github.com/reactos/reactos.git
synced 2024-08-08 12:18:13 +00:00
- Include config/cm.h for cm based code, and remove all duplicated types and prototypes.
- Get rid of EREGISTRY_HIVE, and use CMHIVE instead. Although the current ReactOS code doesn't make use of any of the functionality it offers, it's compatible with EREGISTRY_HIVE (our version was a subset) and allows us to get rid of another ros-specifc type, as well as being able to merge code from the cm-branch much more easily. - Merge cmwraprs.c from the cm-branch, since the only differences were the filehandle fields in EREGISTRY_HIVE vs CMHIVE. - Enable the #if'ed out code in cminit.c since it now applies to CMHIVE. svn path=/trunk/; revision=29944
This commit is contained in:
parent
6b7c404e0b
commit
b308496ffa
|
@ -710,13 +710,13 @@ RegImportBinaryHive(PCHAR ChunkBase,
|
||||||
FRLDRHKEY SystemKey;
|
FRLDRHKEY SystemKey;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
LONG Error;
|
LONG Error;
|
||||||
PEREGISTRY_HIVE CmHive;
|
PCMHIVE CmHive;
|
||||||
PHHIVE Hive;
|
PHHIVE Hive;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DbgPrint((DPRINT_REGISTRY, "RegImportBinaryHive(%x, %u) called\n",ChunkBase,ChunkSize));
|
DbgPrint((DPRINT_REGISTRY, "RegImportBinaryHive(%x, %u) called\n",ChunkBase,ChunkSize));
|
||||||
|
|
||||||
CmHive = CmpAllocate(sizeof(EREGISTRY_HIVE), TRUE, 0);
|
CmHive = CmpAllocate(sizeof(CMHIVE), TRUE, 0);
|
||||||
Status = HvInitialize (&CmHive->Hive,
|
Status = HvInitialize (&CmHive->Hive,
|
||||||
HINIT_FLAT,
|
HINIT_FLAT,
|
||||||
0,
|
0,
|
||||||
|
@ -818,13 +818,13 @@ RegExportBinaryHive(PCWSTR KeyName,
|
||||||
PCHAR ChunkBase,
|
PCHAR ChunkBase,
|
||||||
ULONG* ChunkSize)
|
ULONG* ChunkSize)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive;
|
PCMHIVE CmHive;
|
||||||
PHHIVE Hive;
|
PHHIVE Hive;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DbgPrint((DPRINT_REGISTRY, "Creating binary hardware hive\n"));
|
DbgPrint((DPRINT_REGISTRY, "Creating binary hardware hive\n"));
|
||||||
|
|
||||||
CmHive = CmpAllocate(sizeof(EREGISTRY_HIVE), TRUE, 0);
|
CmHive = CmpAllocate(sizeof(CMHIVE), TRUE, 0);
|
||||||
Status = HvInitialize (&CmHive->Hive,
|
Status = HvInitialize (&CmHive->Hive,
|
||||||
HINIT_CREATE,
|
HINIT_CREATE,
|
||||||
0,
|
0,
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#ifndef _TYPEDEFS_HOST_H
|
#ifndef _TYPEDEFS_HOST_H
|
||||||
#include <ntddk.h>
|
#include <ntddk.h>
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define REG_OPTION_VOLATILE 1
|
#define REG_OPTION_VOLATILE 1
|
||||||
#define OBJ_CASE_INSENSITIVE 0x00000040L
|
#define OBJ_CASE_INSENSITIVE 0x00000040L
|
||||||
|
@ -60,6 +61,14 @@ RtlClearAllBits(
|
||||||
|
|
||||||
#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
|
#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1)
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ROUND_UP
|
#ifndef ROUND_UP
|
||||||
|
@ -75,20 +84,81 @@ RtlClearAllBits(
|
||||||
#include "hivedata.h"
|
#include "hivedata.h"
|
||||||
#include "cmdata.h"
|
#include "cmdata.h"
|
||||||
|
|
||||||
#ifndef _CM_
|
#if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H)
|
||||||
typedef struct _EREGISTRY_HIVE
|
|
||||||
|
#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;
|
HHIVE Hive;
|
||||||
|
HANDLE FileHandles[3];
|
||||||
|
LIST_ENTRY NotifyList;
|
||||||
LIST_ENTRY HiveList;
|
LIST_ENTRY HiveList;
|
||||||
UNICODE_STRING HiveFileName;
|
EX_PUSH_LOCK HiveLock;
|
||||||
UNICODE_STRING LogFileName;
|
PKTHREAD HiveLockOwner;
|
||||||
PCM_KEY_SECURITY RootSecurityCell;
|
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;
|
ULONG Flags;
|
||||||
HANDLE HiveHandle;
|
LIST_ENTRY TrustClassEntry;
|
||||||
HANDLE LogHandle;
|
ULONG FlushCount;
|
||||||
} EREGISTRY_HIVE, *PEREGISTRY_HIVE;
|
BOOLEAN HiveIsLoading;
|
||||||
|
PKTHREAD CreatorOwner;
|
||||||
|
} CMHIVE, *PCMHIVE;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Public functions.
|
* Public functions.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef __INCLUDE_CM_H
|
#ifndef __INCLUDE_CM_H
|
||||||
#define __INCLUDE_CM_H
|
#define __INCLUDE_CM_H
|
||||||
|
|
||||||
#include <cmlib.h>
|
#include "ntoskrnl/config/cm.h"
|
||||||
|
|
||||||
#ifdef DBG
|
#ifdef DBG
|
||||||
#define CHECKED 1
|
#define CHECKED 1
|
||||||
|
@ -48,19 +48,6 @@
|
||||||
#define IsNoFileHive(Hive) ((Hive)->Flags & HIVE_NO_FILE)
|
#define IsNoFileHive(Hive) ((Hive)->Flags & HIVE_NO_FILE)
|
||||||
#define IsNoSynchHive(Hive) ((Hive)->Flags & HIVE_NO_SYNCH)
|
#define IsNoSynchHive(Hive) ((Hive)->Flags & HIVE_NO_SYNCH)
|
||||||
|
|
||||||
//
|
|
||||||
// Cached Child List
|
|
||||||
//
|
|
||||||
typedef struct _CACHED_CHILD_LIST
|
|
||||||
{
|
|
||||||
ULONG Count;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
ULONG ValueList;
|
|
||||||
//struct _CM_KEY_CONTROL_BLOCK *RealKcb;
|
|
||||||
struct _KEY_OBJECT *RealKcb;
|
|
||||||
};
|
|
||||||
} CACHED_CHILD_LIST, *PCACHED_CHILD_LIST;
|
|
||||||
|
|
||||||
/* KEY_OBJECT.Flags */
|
/* KEY_OBJECT.Flags */
|
||||||
|
|
||||||
|
@ -68,97 +55,6 @@ typedef struct _CACHED_CHILD_LIST
|
||||||
attempts to access the key must not succeed */
|
attempts to access the key must not succeed */
|
||||||
#define KO_MARKED_FOR_DELETE 0x00000001
|
#define KO_MARKED_FOR_DELETE 0x00000001
|
||||||
|
|
||||||
/* Type defining the Object Manager Key Object */
|
|
||||||
typedef struct _KEY_OBJECT
|
|
||||||
{
|
|
||||||
/* Fields used by the Object Manager */
|
|
||||||
CSHORT Type;
|
|
||||||
CSHORT Size;
|
|
||||||
|
|
||||||
/* Key flags */
|
|
||||||
ULONG Flags;
|
|
||||||
|
|
||||||
/* Key name */
|
|
||||||
UNICODE_STRING Name;
|
|
||||||
|
|
||||||
/* Registry hive the key belongs to */
|
|
||||||
PEREGISTRY_HIVE RegistryHive;
|
|
||||||
|
|
||||||
/* Block offset of the key cell this key belongs in */
|
|
||||||
HCELL_INDEX KeyCellOffset;
|
|
||||||
|
|
||||||
/* CM_KEY_NODE this key belong in */
|
|
||||||
PCM_KEY_NODE KeyCell;
|
|
||||||
|
|
||||||
/* Link to the parent KEY_OBJECT for this key */
|
|
||||||
struct _KEY_OBJECT *ParentKey;
|
|
||||||
|
|
||||||
/* List entry into the global key object list */
|
|
||||||
LIST_ENTRY ListEntry;
|
|
||||||
|
|
||||||
/* Subkeys loaded in SubKeys */
|
|
||||||
ULONG SubKeyCounts;
|
|
||||||
|
|
||||||
/* Space allocated in SubKeys */
|
|
||||||
ULONG SizeOfSubKeys;
|
|
||||||
|
|
||||||
/* List of subkeys loaded */
|
|
||||||
struct _KEY_OBJECT **SubKeys;
|
|
||||||
|
|
||||||
/* Time stamp for the last access by the parse routine */
|
|
||||||
ULONG TimeStamp;
|
|
||||||
|
|
||||||
/* List entry for connected hives */
|
|
||||||
LIST_ENTRY HiveList;
|
|
||||||
|
|
||||||
CACHED_CHILD_LIST ValueCache;
|
|
||||||
} KEY_OBJECT, *PKEY_OBJECT;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Key Control Block (KCB) for old Cm (just so it can talk to New CM)
|
|
||||||
//
|
|
||||||
typedef struct _CM_KEY_CONTROL_BLOCK
|
|
||||||
{
|
|
||||||
USHORT RefCount;
|
|
||||||
USHORT Flags;
|
|
||||||
ULONG ExtFlags:8;
|
|
||||||
ULONG PrivateAlloc:1;
|
|
||||||
ULONG Delete:1;
|
|
||||||
ULONG DelayedCloseIndex:12;
|
|
||||||
ULONG TotalLevels:10;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
//CM_KEY_HASH KeyHash;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
ULONG ConvKey;
|
|
||||||
PVOID NextHash;
|
|
||||||
PHHIVE KeyHive;
|
|
||||||
HCELL_INDEX KeyCell;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
struct _CM_KEY_CONTROL_BLOCK *ParentKcb;
|
|
||||||
PVOID NameBlock;
|
|
||||||
PVOID CachedSecurity;
|
|
||||||
CACHED_CHILD_LIST ValueCache;
|
|
||||||
PVOID IndexHint;
|
|
||||||
ULONG HashKey;
|
|
||||||
ULONG SubKeyCount;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
LIST_ENTRY KeyBodyListHead;
|
|
||||||
LIST_ENTRY FreeListEntry;
|
|
||||||
};
|
|
||||||
PVOID KeyBodyArray[4];
|
|
||||||
PVOID DelayCloseEntry;
|
|
||||||
LARGE_INTEGER KcbLastWriteTime;
|
|
||||||
USHORT KcbMaxNameLen;
|
|
||||||
USHORT KcbMaxValueNameLen;
|
|
||||||
ULONG KcbMaxValueDataLen;
|
|
||||||
ULONG InDelayClose;
|
|
||||||
} CM_KEY_CONTROL_BLOCK, *PCM_KEY_CONTROL_BLOCK;
|
|
||||||
|
|
||||||
|
|
||||||
/* Bits 31-22 (top 10 bits) of the cell index is the directory index */
|
/* Bits 31-22 (top 10 bits) of the cell index is the directory index */
|
||||||
#define CmiDirectoryIndex(CellIndex)(CellIndex & 0xffc000000)
|
#define CmiDirectoryIndex(CellIndex)(CellIndex & 0xffc000000)
|
||||||
/* Bits 21-12 (middle 10 bits) of the cell index is the table index */
|
/* Bits 21-12 (middle 10 bits) of the cell index is the table index */
|
||||||
|
@ -167,12 +63,9 @@ typedef struct _CM_KEY_CONTROL_BLOCK
|
||||||
#define CmiByteOffset(Cellndex)(CellIndex & 0x00000fff)
|
#define CmiByteOffset(Cellndex)(CellIndex & 0x00000fff)
|
||||||
|
|
||||||
|
|
||||||
extern PEREGISTRY_HIVE CmiVolatileHive;
|
|
||||||
extern POBJECT_TYPE CmpKeyObjectType;
|
extern POBJECT_TYPE CmpKeyObjectType;
|
||||||
extern KSPIN_LOCK CmiKeyListLock;
|
extern KSPIN_LOCK CmiKeyListLock;
|
||||||
|
|
||||||
extern LIST_ENTRY CmpHiveListHead;
|
|
||||||
|
|
||||||
extern ERESOURCE CmpRegistryLock;
|
extern ERESOURCE CmpRegistryLock;
|
||||||
extern EX_PUSH_LOCK CmpHiveListHeadLock;
|
extern EX_PUSH_LOCK CmpHiveListHeadLock;
|
||||||
|
|
||||||
|
@ -224,24 +117,10 @@ CmiLoadHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
|
||||||
ULONG Flags);
|
ULONG Flags);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiFlushRegistryHive(PEREGISTRY_HIVE RegistryHive);
|
CmiFlushRegistryHive(PCMHIVE RegistryHive);
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxNameLength(IN PHHIVE RegistryHive, IN PCM_KEY_NODE KeyCell);
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxClassLength(IN PHHIVE RegistryHive, IN PCM_KEY_NODE KeyCell);
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxValueNameLength(IN PHHIVE RegistryHive,
|
|
||||||
IN PCM_KEY_NODE KeyCell);
|
|
||||||
|
|
||||||
ULONG
|
|
||||||
CmiGetMaxValueDataLength(IN PHHIVE RegistryHive,
|
|
||||||
IN PCM_KEY_NODE KeyCell);
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
|
CmiScanForSubKey(IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
OUT PCM_KEY_NODE *SubKeyCell,
|
OUT PCM_KEY_NODE *SubKeyCell,
|
||||||
OUT HCELL_INDEX *BlockOffset,
|
OUT HCELL_INDEX *BlockOffset,
|
||||||
|
@ -250,111 +129,20 @@ CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
|
||||||
IN ULONG Attributes);
|
IN ULONG Attributes);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiAddSubKey(IN PEREGISTRY_HIVE RegistryHive,
|
CmiScanKeyForValue(IN PCMHIVE RegistryHive,
|
||||||
IN PKEY_OBJECT ParentKey,
|
|
||||||
OUT PKEY_OBJECT SubKey,
|
|
||||||
IN PUNICODE_STRING SubKeyName,
|
|
||||||
IN ULONG TitleIndex,
|
|
||||||
IN PUNICODE_STRING Class,
|
|
||||||
IN ULONG CreateOptions);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
|
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN PUNICODE_STRING ValueName,
|
IN PUNICODE_STRING ValueName,
|
||||||
OUT PCM_KEY_VALUE *ValueCell,
|
OUT PCM_KEY_VALUE *ValueCell,
|
||||||
OUT HCELL_INDEX *VBOffset);
|
OUT HCELL_INDEX *VBOffset);
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|
||||||
IN UNICODE_STRING ValueName);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmQueryValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|
||||||
IN UNICODE_STRING ValueName,
|
|
||||||
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
|
|
||||||
IN PVOID KeyValueInformation,
|
|
||||||
IN ULONG Length,
|
|
||||||
IN PULONG ResultLength);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmEnumerateValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|
||||||
IN ULONG Index,
|
|
||||||
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
|
|
||||||
IN PVOID KeyValueInformation,
|
|
||||||
IN ULONG Length,
|
|
||||||
IN PULONG ResultLength);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|
||||||
IN PUNICODE_STRING ValueName,
|
|
||||||
IN ULONG Type,
|
|
||||||
IN PVOID Data,
|
|
||||||
IN ULONG DataSize);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|
||||||
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
|
||||||
IN PVOID KeyInformation,
|
|
||||||
IN ULONG Length,
|
|
||||||
IN PULONG ResultLength);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
|
||||||
IN ULONG Index,
|
|
||||||
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
|
||||||
IN PVOID KeyInformation,
|
|
||||||
IN ULONG Length,
|
|
||||||
IN PULONG ResultLength);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmDeleteKey(IN PCM_KEY_CONTROL_BLOCK Kcb);
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiConnectHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
|
CmiConnectHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
|
||||||
PEREGISTRY_HIVE RegistryHive);
|
PCMHIVE RegistryHive);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiInitHives(BOOLEAN SetupBoot);
|
CmiInitHives(BOOLEAN SetupBoot);
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmpDoCreate(
|
|
||||||
IN PHHIVE Hive,
|
|
||||||
IN HCELL_INDEX Cell,
|
|
||||||
IN PACCESS_STATE AccessState,
|
|
||||||
IN PUNICODE_STRING Name,
|
|
||||||
IN KPROCESSOR_MODE AccessMode,
|
|
||||||
IN PUNICODE_STRING Class,
|
|
||||||
IN ULONG CreateOptions,
|
|
||||||
IN PKEY_OBJECT Parent,
|
|
||||||
IN PVOID OriginatingHive OPTIONAL,
|
|
||||||
OUT PVOID *Object
|
|
||||||
);
|
|
||||||
|
|
||||||
HCELL_INDEX
|
|
||||||
NTAPI
|
|
||||||
CmpFindValueByName(
|
|
||||||
IN PHHIVE Hive,
|
|
||||||
IN PCM_KEY_NODE KeyNode,
|
|
||||||
IN PUNICODE_STRING Name
|
|
||||||
);
|
|
||||||
|
|
||||||
HCELL_INDEX
|
|
||||||
NTAPI
|
|
||||||
CmpFindSubKeyByName(
|
|
||||||
IN PHHIVE Hive,
|
|
||||||
IN PCM_KEY_NODE Parent,
|
|
||||||
IN PCUNICODE_STRING SearchName
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
CmiSyncHives(VOID);
|
CmiSyncHives(VOID);
|
||||||
|
|
||||||
|
@ -370,49 +158,8 @@ CmFindObject(
|
||||||
IN PVOID ParseContext
|
IN PVOID ParseContext
|
||||||
);
|
);
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmpOpenHiveFiles(IN PCUNICODE_STRING BaseName,
|
|
||||||
IN PCWSTR Extension OPTIONAL,
|
|
||||||
IN PHANDLE Primary,
|
|
||||||
IN PHANDLE Log,
|
|
||||||
IN PULONG PrimaryDisposition,
|
|
||||||
IN PULONG LogDisposition,
|
|
||||||
IN BOOLEAN CreateAllowed,
|
|
||||||
IN BOOLEAN MarkAsSystemHive,
|
|
||||||
IN BOOLEAN NoBuffering,
|
|
||||||
OUT PULONG ClusterSize OPTIONAL);
|
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
NTAPI
|
|
||||||
CmpInitHiveFromFile(IN PCUNICODE_STRING HiveName,
|
|
||||||
IN ULONG HiveFlags,
|
|
||||||
OUT PEREGISTRY_HIVE *Hive,
|
|
||||||
IN OUT PBOOLEAN New,
|
|
||||||
IN ULONG CheckFlags);
|
|
||||||
|
|
||||||
// Some Ob definitions for debug messages in Cm
|
// Some Ob definitions for debug messages in Cm
|
||||||
#define ObGetObjectPointerCount(x) OBJECT_TO_OBJECT_HEADER(x)->PointerCount
|
#define ObGetObjectPointerCount(x) OBJECT_TO_OBJECT_HEADER(x)->PointerCount
|
||||||
#define ObGetObjectHandleCount(x) OBJECT_TO_OBJECT_HEADER(x)->HandleCount
|
#define ObGetObjectHandleCount(x) OBJECT_TO_OBJECT_HEADER(x)->HandleCount
|
||||||
|
|
||||||
//
|
|
||||||
// System Control Vector
|
|
||||||
//
|
|
||||||
typedef struct _CM_SYSTEM_CONTROL_VECTOR
|
|
||||||
{
|
|
||||||
PWCHAR KeyPath;
|
|
||||||
PWCHAR ValueName;
|
|
||||||
PVOID Buffer;
|
|
||||||
PULONG BufferLength;
|
|
||||||
PULONG Type;
|
|
||||||
} CM_SYSTEM_CONTROL_VECTOR, *PCM_SYSTEM_CONTROL_VECTOR;
|
|
||||||
|
|
||||||
VOID
|
|
||||||
NTAPI
|
|
||||||
CmGetSystemControlValues(
|
|
||||||
IN PVOID SystemHiveData,
|
|
||||||
IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
|
|
||||||
);
|
|
||||||
|
|
||||||
extern CM_SYSTEM_CONTROL_VECTOR CmControlVector[];
|
|
||||||
#endif /*__INCLUDE_CM_H*/
|
#endif /*__INCLUDE_CM_H*/
|
||||||
|
|
|
@ -412,7 +412,7 @@ NtFlushKey(IN HANDLE KeyHandle)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PKEY_OBJECT KeyObject;
|
PKEY_OBJECT KeyObject;
|
||||||
PEREGISTRY_HIVE RegistryHive;
|
PCMHIVE RegistryHive;
|
||||||
KPROCESSOR_MODE PreviousMode;
|
KPROCESSOR_MODE PreviousMode;
|
||||||
|
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
|
@ -12,9 +12,7 @@
|
||||||
#include <ntoskrnl.h>
|
#include <ntoskrnl.h>
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
#include "cm.h"
|
#include "cm.h"
|
||||||
#include "../config/cm.h"
|
|
||||||
|
|
||||||
/* LOCAL MACROS *************************************************************/
|
/* LOCAL MACROS *************************************************************/
|
||||||
|
|
||||||
|
@ -29,7 +27,7 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
|
||||||
IN PCUNICODE_STRING FileName,
|
IN PCUNICODE_STRING FileName,
|
||||||
IN ULONG Flags)
|
IN ULONG Flags)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE Hive = NULL;
|
PCMHIVE Hive = NULL;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
BOOLEAN Allocate = TRUE;
|
BOOLEAN Allocate = TRUE;
|
||||||
|
|
||||||
|
@ -61,14 +59,14 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
CmCloseHiveFiles(PEREGISTRY_HIVE RegistryHive)
|
CmCloseHiveFiles(PCMHIVE RegistryHive)
|
||||||
{
|
{
|
||||||
ZwClose(RegistryHive->HiveHandle);
|
ZwClose(RegistryHive->FileHandles[HFILE_TYPE_PRIMARY]);
|
||||||
ZwClose(RegistryHive->LogHandle);
|
ZwClose(RegistryHive->FileHandles[HFILE_TYPE_LOG]);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiFlushRegistryHive(PEREGISTRY_HIVE RegistryHive)
|
CmiFlushRegistryHive(PCMHIVE RegistryHive)
|
||||||
{
|
{
|
||||||
BOOLEAN Success;
|
BOOLEAN Success;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -81,10 +79,10 @@ CmiFlushRegistryHive(PEREGISTRY_HIVE RegistryHive)
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = CmpOpenHiveFiles(&RegistryHive->HiveFileName,
|
Status = CmpOpenHiveFiles(&RegistryHive->FileFullPath,
|
||||||
L".LOG",
|
L".LOG",
|
||||||
&RegistryHive->HiveHandle,
|
&RegistryHive->FileHandles[HFILE_TYPE_PRIMARY],
|
||||||
&RegistryHive->LogHandle,
|
&RegistryHive->FileHandles[HFILE_TYPE_LOG],
|
||||||
&Disposition,
|
&Disposition,
|
||||||
&Disposition,
|
&Disposition,
|
||||||
FALSE,
|
FALSE,
|
||||||
|
@ -255,7 +253,7 @@ CmiGetMaxValueDataLength(PHHIVE Hive,
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
|
CmiScanKeyForValue(IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN PUNICODE_STRING ValueName,
|
IN PUNICODE_STRING ValueName,
|
||||||
OUT PCM_KEY_VALUE *ValueCell,
|
OUT PCM_KEY_VALUE *ValueCell,
|
||||||
|
@ -278,7 +276,7 @@ CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
|
CmiScanForSubKey(IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
OUT PCM_KEY_NODE *SubKeyCell,
|
OUT PCM_KEY_NODE *SubKeyCell,
|
||||||
OUT HCELL_INDEX *BlockOffset,
|
OUT HCELL_INDEX *BlockOffset,
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include <internal/debug.h>
|
#include <internal/debug.h>
|
||||||
|
|
||||||
#include "cm.h"
|
#include "cm.h"
|
||||||
#include "../config/cm.h"
|
|
||||||
|
|
||||||
#if defined (ALLOC_PRAGMA)
|
#if defined (ALLOC_PRAGMA)
|
||||||
#pragma alloc_text(INIT, CmInitSystem1)
|
#pragma alloc_text(INIT, CmInitSystem1)
|
||||||
|
@ -29,7 +28,7 @@
|
||||||
extern BOOLEAN ExpInTextModeSetup;
|
extern BOOLEAN ExpInTextModeSetup;
|
||||||
|
|
||||||
POBJECT_TYPE CmpKeyObjectType = NULL;
|
POBJECT_TYPE CmpKeyObjectType = NULL;
|
||||||
PEREGISTRY_HIVE CmiVolatileHive = NULL;
|
PCMHIVE CmiVolatileHive = NULL;
|
||||||
|
|
||||||
LIST_ENTRY CmpHiveListHead;
|
LIST_ENTRY CmpHiveListHead;
|
||||||
|
|
||||||
|
@ -245,7 +244,7 @@ NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
|
CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
|
||||||
IN HANDLE RootDirectory,
|
IN HANDLE RootDirectory,
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN BOOLEAN Allocate,
|
IN BOOLEAN Allocate,
|
||||||
IN PSECURITY_DESCRIPTOR SecurityDescriptor)
|
IN PSECURITY_DESCRIPTOR SecurityDescriptor)
|
||||||
{
|
{
|
||||||
|
@ -267,7 +266,7 @@ CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
|
CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
|
||||||
IN PEREGISTRY_HIVE RegistryHive)
|
IN PCMHIVE RegistryHive)
|
||||||
{
|
{
|
||||||
UNICODE_STRING RemainingPath;
|
UNICODE_STRING RemainingPath;
|
||||||
PKEY_OBJECT ParentKey;
|
PKEY_OBJECT ParentKey;
|
||||||
|
@ -671,7 +670,7 @@ CmiInitHives(BOOLEAN SetupBoot)
|
||||||
VOID
|
VOID
|
||||||
CmShutdownRegistry(VOID)
|
CmShutdownRegistry(VOID)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE Hive;
|
PCMHIVE Hive;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
|
|
||||||
DPRINT("CmShutdownRegistry() called\n");
|
DPRINT("CmShutdownRegistry() called\n");
|
||||||
|
@ -692,7 +691,7 @@ CmShutdownRegistry(VOID)
|
||||||
Entry = CmpHiveListHead.Flink;
|
Entry = CmpHiveListHead.Flink;
|
||||||
while (Entry != &CmpHiveListHead)
|
while (Entry != &CmpHiveListHead)
|
||||||
{
|
{
|
||||||
Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
|
Hive = CONTAINING_RECORD(Entry, CMHIVE, HiveList);
|
||||||
|
|
||||||
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
|
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
|
||||||
{
|
{
|
||||||
|
@ -713,7 +712,7 @@ VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
CmiHiveSyncRoutine(PVOID DeferredContext)
|
CmiHiveSyncRoutine(PVOID DeferredContext)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE Hive;
|
PCMHIVE Hive;
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
|
|
||||||
DPRINT("CmiHiveSyncRoutine() called\n");
|
DPRINT("CmiHiveSyncRoutine() called\n");
|
||||||
|
@ -726,7 +725,7 @@ CmiHiveSyncRoutine(PVOID DeferredContext)
|
||||||
Entry = CmpHiveListHead.Flink;
|
Entry = CmpHiveListHead.Flink;
|
||||||
while (Entry != &CmpHiveListHead)
|
while (Entry != &CmpHiveListHead)
|
||||||
{
|
{
|
||||||
Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
|
Hive = CONTAINING_RECORD(Entry, CMHIVE, HiveList);
|
||||||
|
|
||||||
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
|
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,7 +21,7 @@ extern LIST_ENTRY CmiKeyObjectListHead;
|
||||||
extern ULONG CmiTimer;
|
extern ULONG CmiTimer;
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
|
CmiGetLinkTarget(PCMHIVE RegistryHive,
|
||||||
PCM_KEY_NODE KeyCell,
|
PCM_KEY_NODE KeyCell,
|
||||||
PUNICODE_STRING TargetPath);
|
PUNICODE_STRING TargetPath);
|
||||||
|
|
||||||
|
@ -809,7 +809,7 @@ CmiScanKeyList(PKEY_OBJECT Parent,
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
|
CmiGetLinkTarget(PCMHIVE RegistryHive,
|
||||||
PCM_KEY_NODE KeyCell,
|
PCM_KEY_NODE KeyCell,
|
||||||
PUNICODE_STRING TargetPath)
|
PUNICODE_STRING TargetPath)
|
||||||
{
|
{
|
||||||
|
|
|
@ -93,8 +93,6 @@
|
||||||
#define CM_DELAYS_PER_PAGE \
|
#define CM_DELAYS_PER_PAGE \
|
||||||
PAGE_SIZE / sizeof(CM_DELAYED_CLOSE_ENTRY)
|
PAGE_SIZE / sizeof(CM_DELAYED_CLOSE_ENTRY)
|
||||||
|
|
||||||
#ifndef __INCLUDE_CM_H
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Value Search Results
|
// Value Search Results
|
||||||
//
|
//
|
||||||
|
@ -496,24 +494,13 @@ typedef struct _KEY_INFORMATION
|
||||||
#define REG_SYSTEM_KEY_NAME L"\\Registry\\Machine\\SYSTEM"
|
#define REG_SYSTEM_KEY_NAME L"\\Registry\\Machine\\SYSTEM"
|
||||||
#define REG_HARDWARE_KEY_NAME L"\\Registry\\Machine\\HARDWARE"
|
#define REG_HARDWARE_KEY_NAME L"\\Registry\\Machine\\HARDWARE"
|
||||||
#define IsNoFileHive(Hive) ((Hive)->Flags & HIVE_NO_FILE)
|
#define IsNoFileHive(Hive) ((Hive)->Flags & HIVE_NO_FILE)
|
||||||
typedef struct _EREGISTRY_HIVE
|
|
||||||
{
|
|
||||||
HHIVE Hive;
|
|
||||||
LIST_ENTRY HiveList;
|
|
||||||
UNICODE_STRING HiveFileName;
|
|
||||||
UNICODE_STRING LogFileName;
|
|
||||||
PCM_KEY_SECURITY RootSecurityCell;
|
|
||||||
ULONG Flags;
|
|
||||||
HANDLE HiveHandle;
|
|
||||||
HANDLE LogHandle;
|
|
||||||
} EREGISTRY_HIVE, *PEREGISTRY_HIVE;
|
|
||||||
typedef struct _KEY_OBJECT
|
typedef struct _KEY_OBJECT
|
||||||
{
|
{
|
||||||
CSHORT Type;
|
CSHORT Type;
|
||||||
CSHORT Size;
|
CSHORT Size;
|
||||||
ULONG Flags;
|
ULONG Flags;
|
||||||
UNICODE_STRING Name;
|
UNICODE_STRING Name;
|
||||||
PEREGISTRY_HIVE RegistryHive;
|
PCMHIVE RegistryHive;
|
||||||
HCELL_INDEX KeyCellOffset;
|
HCELL_INDEX KeyCellOffset;
|
||||||
PCM_KEY_NODE KeyCell;
|
PCM_KEY_NODE KeyCell;
|
||||||
struct _KEY_OBJECT *ParentKey;
|
struct _KEY_OBJECT *ParentKey;
|
||||||
|
@ -525,7 +512,7 @@ typedef struct _KEY_OBJECT
|
||||||
LIST_ENTRY HiveList;
|
LIST_ENTRY HiveList;
|
||||||
CACHED_CHILD_LIST ValueCache;
|
CACHED_CHILD_LIST ValueCache;
|
||||||
} KEY_OBJECT, *PKEY_OBJECT;
|
} KEY_OBJECT, *PKEY_OBJECT;
|
||||||
extern PEREGISTRY_HIVE CmiVolatileHive;
|
extern PCMHIVE CmiVolatileHive;
|
||||||
extern LIST_ENTRY CmiKeyObjectListHead, CmiConnectedHiveList;
|
extern LIST_ENTRY CmiKeyObjectListHead, CmiConnectedHiveList;
|
||||||
extern KTIMER CmiWorkerTimer;
|
extern KTIMER CmiWorkerTimer;
|
||||||
VOID NTAPI CmiWorkerThread(IN PVOID Param);
|
VOID NTAPI CmiWorkerThread(IN PVOID Param);
|
||||||
|
@ -755,8 +742,6 @@ CmpLinkHiveToMaster(
|
||||||
IN PSECURITY_DESCRIPTOR SecurityDescriptor
|
IN PSECURITY_DESCRIPTOR SecurityDescriptor
|
||||||
);
|
);
|
||||||
|
|
||||||
/* NOTE: This function declaration is currently duplicated in both */
|
|
||||||
/* cm/cm.h and config/cm.h. TODO: Pick one single place to declare it. */
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
CmpOpenHiveFiles(
|
CmpOpenHiveFiles(
|
||||||
|
@ -772,6 +757,16 @@ CmpOpenHiveFiles(
|
||||||
OUT PULONG ClusterSize OPTIONAL
|
OUT PULONG ClusterSize OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmpInitHiveFromFile(
|
||||||
|
IN PCUNICODE_STRING HiveName,
|
||||||
|
IN ULONG HiveFlags,
|
||||||
|
OUT PCMHIVE *Hive,
|
||||||
|
IN OUT PBOOLEAN New,
|
||||||
|
IN ULONG CheckFlags
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Registry Utility Functions
|
// Registry Utility Functions
|
||||||
//
|
//
|
||||||
|
@ -832,7 +827,7 @@ EnlistKeyBodyWithKCB(
|
||||||
#if 0
|
#if 0
|
||||||
IN PCM_KEY_BODY KeyObject,
|
IN PCM_KEY_BODY KeyObject,
|
||||||
#else
|
#else
|
||||||
IN PVOID KeyObject,
|
IN PKEY_OBJECT KeyObject,
|
||||||
#endif
|
#endif
|
||||||
IN ULONG Flags
|
IN ULONG Flags
|
||||||
);
|
);
|
||||||
|
@ -917,12 +912,28 @@ CmpFlushEntireRegistry(
|
||||||
IN BOOLEAN ForceFlush
|
IN BOOLEAN ForceFlush
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open/Create Routines
|
||||||
|
//
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmpDoCreate(
|
||||||
|
IN PHHIVE Hive,
|
||||||
|
IN HCELL_INDEX Cell,
|
||||||
|
IN PACCESS_STATE AccessState,
|
||||||
|
IN PUNICODE_STRING Name,
|
||||||
|
IN KPROCESSOR_MODE AccessMode,
|
||||||
|
IN PUNICODE_STRING Class,
|
||||||
|
IN ULONG CreateOptions,
|
||||||
|
IN PKEY_OBJECT Parent,
|
||||||
|
IN PCMHIVE OriginatingHive OPTIONAL,
|
||||||
|
OUT PVOID *Object
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cell Index Routines
|
// Cell Index Routines
|
||||||
//
|
//
|
||||||
|
|
||||||
/* NOTE: This function declaration is currently duplicated in both */
|
|
||||||
/* cm/cm.h and config/cm.h. TODO: Pick one single place to declare it. */
|
|
||||||
HCELL_INDEX
|
HCELL_INDEX
|
||||||
NTAPI
|
NTAPI
|
||||||
CmpFindSubKeyByName(
|
CmpFindSubKeyByName(
|
||||||
|
@ -1064,6 +1075,14 @@ CmpFindControlSet(
|
||||||
OUT PBOOLEAN AutoSelect
|
OUT PBOOLEAN AutoSelect
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
CmGetSystemControlValues(
|
||||||
|
IN PVOID SystemHiveData,
|
||||||
|
IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Hardware Configuration Routines
|
// Hardware Configuration Routines
|
||||||
//
|
//
|
||||||
|
@ -1154,6 +1173,71 @@ CmpFileFlush(
|
||||||
IN ULONG Length
|
IN ULONG Length
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Configuration Manager side of Registry System Calls
|
||||||
|
//
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmEnumerateValueKey(
|
||||||
|
IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
IN ULONG Index,
|
||||||
|
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
|
||||||
|
IN PVOID KeyValueInformation,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN PULONG ResultLength);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmSetValueKey(
|
||||||
|
IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
IN PUNICODE_STRING ValueName,
|
||||||
|
IN ULONG Type,
|
||||||
|
IN PVOID Data,
|
||||||
|
IN ULONG DataSize);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
||||||
|
IN PVOID KeyInformation,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN PULONG ResultLength
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
IN ULONG Index,
|
||||||
|
IN KEY_INFORMATION_CLASS KeyInformationClass,
|
||||||
|
IN PVOID KeyInformation,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN PULONG ResultLength
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmDeleteKey(
|
||||||
|
IN PCM_KEY_CONTROL_BLOCK Kcb
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmDeleteValueKey(
|
||||||
|
IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
IN UNICODE_STRING ValueName
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
CmQueryValueKey(
|
||||||
|
IN PCM_KEY_CONTROL_BLOCK Kcb,
|
||||||
|
IN UNICODE_STRING ValueName,
|
||||||
|
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
|
||||||
|
IN PVOID KeyValueInformation,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN PULONG ResultLength
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global variables accessible from all of Cm
|
// Global variables accessible from all of Cm
|
||||||
//
|
//
|
||||||
|
@ -1197,5 +1281,3 @@ extern ULONG CmpHashTableSize;
|
||||||
// Inlined functions
|
// Inlined functions
|
||||||
//
|
//
|
||||||
#include "cm_x.h"
|
#include "cm_x.h"
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1052,8 +1052,8 @@ CmDeleteKey(IN PCM_KEY_CONTROL_BLOCK Kcb)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure we're file-backed */
|
/* Make sure we're file-backed */
|
||||||
if (!(IsNoFileHive((PEREGISTRY_HIVE)Kcb->KeyHive)) ||
|
if (!(IsNoFileHive((PCMHIVE)Kcb->KeyHive)) ||
|
||||||
!(IsNoFileHive((PEREGISTRY_HIVE)Kcb->ParentKcb->KeyHive)))
|
!(IsNoFileHive((PCMHIVE)Kcb->ParentKcb->KeyHive)))
|
||||||
{
|
{
|
||||||
/* Sync up the hives */
|
/* Sync up the hives */
|
||||||
CmiSyncHives();
|
CmiSyncHives();
|
||||||
|
|
|
@ -28,12 +28,8 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
IN PCUNICODE_STRING FileName OPTIONAL,
|
IN PCUNICODE_STRING FileName OPTIONAL,
|
||||||
IN ULONG CheckFlags)
|
IN ULONG CheckFlags)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
PCMHIVE Hive;
|
PCMHIVE Hive;
|
||||||
#else
|
|
||||||
PEREGISTRY_HIVE Hive;
|
|
||||||
FILE_STANDARD_INFORMATION FileInformation;
|
FILE_STANDARD_INFORMATION FileInformation;
|
||||||
#endif
|
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
FILE_FS_SIZE_INFORMATION FileSizeInformation;
|
FILE_FS_SIZE_INFORMATION FileSizeInformation;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -89,9 +85,9 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate the hive */
|
/* Allocate the hive */
|
||||||
Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(EREGISTRY_HIVE), TAG_CM);
|
Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(CMHIVE), TAG_CM);
|
||||||
if (!Hive) return STATUS_INSUFFICIENT_RESOURCES;
|
if (!Hive) return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
#if 0
|
|
||||||
/* Setup null fields */
|
/* Setup null fields */
|
||||||
Hive->UnloadEvent = NULL;
|
Hive->UnloadEvent = NULL;
|
||||||
Hive->RootKcb = NULL;
|
Hive->RootKcb = NULL;
|
||||||
|
@ -142,11 +138,11 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
ExInitializeResourceLite(Hive->FlusherLock);
|
ExInitializeResourceLite(Hive->FlusherLock);
|
||||||
|
|
||||||
/* Setup hive locks */
|
/* Setup hive locks */
|
||||||
ExInitializePushLock(&Hive->HiveLock);
|
ExInitializePushLock((PULONG_PTR)&Hive->HiveLock);
|
||||||
Hive->HiveLockOwner = NULL;
|
Hive->HiveLockOwner = NULL;
|
||||||
ExInitializePushLock(&Hive->WriterLock);
|
ExInitializePushLock((PULONG_PTR)&Hive->WriterLock);
|
||||||
Hive->WriterLockOwner = NULL;
|
Hive->WriterLockOwner = NULL;
|
||||||
ExInitializePushLock(&Hive->SecurityLock);
|
ExInitializePushLock((PULONG_PTR)&Hive->SecurityLock);
|
||||||
Hive->HiveSecurityLockOwner = NULL;
|
Hive->HiveSecurityLockOwner = NULL;
|
||||||
|
|
||||||
/* Clear file names */
|
/* Clear file names */
|
||||||
|
@ -154,22 +150,17 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
RtlInitEmptyUnicodeString(&Hive->FileFullPath, NULL, 0);
|
RtlInitEmptyUnicodeString(&Hive->FileFullPath, NULL, 0);
|
||||||
|
|
||||||
/* Initialize the view list */
|
/* Initialize the view list */
|
||||||
CmpInitializeHiveViewList(Hive);
|
CmpInitHiveViewList(Hive);
|
||||||
|
|
||||||
/* Initailize the security cache */
|
/* Initailize the security cache */
|
||||||
CmpInitializeSecurityCache(Hive);
|
CmpInitSecurityCache(Hive);
|
||||||
|
|
||||||
/* Setup flags */
|
/* Setup flags */
|
||||||
Hive->Flags = 0;
|
Hive->Flags = 0;
|
||||||
Hive->FlushCount = 0;
|
Hive->FlushCount = 0;
|
||||||
#else
|
|
||||||
/* Clear it */
|
|
||||||
RtlZeroMemory(Hive, sizeof(EREGISTRY_HIVE));
|
|
||||||
|
|
||||||
/* Set flags */
|
/* Set flags */
|
||||||
Hive->Flags = HiveFlags;
|
Hive->Flags = HiveFlags;
|
||||||
Hive->HiveHandle = Primary;
|
|
||||||
Hive->LogHandle = Log;
|
|
||||||
|
|
||||||
/* Check how large the file is */
|
/* Check how large the file is */
|
||||||
ZwQueryInformationFile(Primary,
|
ZwQueryInformationFile(Primary,
|
||||||
|
@ -178,7 +169,6 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
sizeof(FileInformation),
|
sizeof(FileInformation),
|
||||||
FileStandardInformation);
|
FileStandardInformation);
|
||||||
Cluster = FileInformation.EndOfFile.LowPart;
|
Cluster = FileInformation.EndOfFile.LowPart;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize it */
|
/* Initialize it */
|
||||||
Status = HvInitialize(&Hive->Hive,
|
Status = HvInitialize(&Hive->Hive,
|
||||||
|
@ -197,10 +187,8 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Clear allocations and fail */
|
/* Clear allocations and fail */
|
||||||
#if 0
|
|
||||||
ExFreePool(Hive->ViewLock);
|
ExFreePool(Hive->ViewLock);
|
||||||
ExFreePool(Hive->FlusherLock);
|
ExFreePool(Hive->FlusherLock);
|
||||||
#endif
|
|
||||||
ExFreePool(Hive);
|
ExFreePool(Hive);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -215,10 +203,8 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
|
||||||
if (CmCheckRegistry((PCMHIVE)Hive, TRUE))
|
if (CmCheckRegistry((PCMHIVE)Hive, TRUE))
|
||||||
{
|
{
|
||||||
/* Free all alocations */
|
/* Free all alocations */
|
||||||
#if 0
|
|
||||||
ExFreePool(Hive->ViewLock);
|
ExFreePool(Hive->ViewLock);
|
||||||
ExFreePool(Hive->FlusherLock);
|
ExFreePool(Hive->FlusherLock);
|
||||||
#endif
|
|
||||||
ExFreePool(Hive);
|
ExFreePool(Hive);
|
||||||
return STATUS_REGISTRY_CORRUPT;
|
return STATUS_REGISTRY_CORRUPT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -267,7 +267,7 @@ CmpDoCreate(IN PHHIVE Hive,
|
||||||
if (!Class) Class = &LocalClass;
|
if (!Class) Class = &LocalClass;
|
||||||
|
|
||||||
/* Acquire the flusher lock */
|
/* Acquire the flusher lock */
|
||||||
//ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock);
|
ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock);
|
||||||
|
|
||||||
/* Check if the parent is being deleted */
|
/* Check if the parent is being deleted */
|
||||||
#define KO_MARKED_FOR_DELETE 0x00000001
|
#define KO_MARKED_FOR_DELETE 0x00000001
|
||||||
|
@ -397,6 +397,6 @@ CmpDoCreate(IN PHHIVE Hive,
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
/* Release the flusher lock and return status */
|
/* Release the flusher lock and return status */
|
||||||
//ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock);
|
ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ CmpInitHiveFromFile(IN PCUNICODE_STRING HiveName,
|
||||||
HANDLE FileHandle = NULL, LogHandle = NULL;
|
HANDLE FileHandle = NULL, LogHandle = NULL;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG Operation, FileType;
|
ULONG Operation, FileType;
|
||||||
PEREGISTRY_HIVE NewHive;
|
PCMHIVE NewHive;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
|
||||||
/* Assume failure */
|
/* Assume failure */
|
||||||
|
@ -110,24 +110,24 @@ CmpInitHiveFromFile(IN PCUNICODE_STRING HiveName,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Success, return hive */
|
/* Success, return hive */
|
||||||
*Hive = (PCMHIVE)NewHive;
|
*Hive = NewHive;
|
||||||
|
|
||||||
/* ROS: Init root key cell and prepare the hive */
|
/* ROS: Init root key cell and prepare the hive */
|
||||||
if (Operation == HINIT_CREATE) CmCreateRootNode(&NewHive->Hive, L"");
|
if (Operation == HINIT_CREATE) CmCreateRootNode(&NewHive->Hive, L"");
|
||||||
CmPrepareHive(&NewHive->Hive);
|
CmPrepareHive(&NewHive->Hive);
|
||||||
|
|
||||||
/* Duplicate the hive name */
|
/* Duplicate the hive name */
|
||||||
NewHive->HiveFileName.Buffer = ExAllocatePoolWithTag(PagedPool,
|
NewHive->FileFullPath.Buffer = ExAllocatePoolWithTag(PagedPool,
|
||||||
HiveName->Length,
|
HiveName->Length,
|
||||||
TAG_CM);
|
TAG_CM);
|
||||||
if (NewHive->HiveFileName.Buffer)
|
if (NewHive->FileFullPath.Buffer)
|
||||||
{
|
{
|
||||||
/* Copy the string */
|
/* Copy the string */
|
||||||
RtlCopyMemory(NewHive->HiveFileName.Buffer,
|
RtlCopyMemory(NewHive->FileFullPath.Buffer,
|
||||||
HiveName->Buffer,
|
HiveName->Buffer,
|
||||||
HiveName->Length);
|
HiveName->Length);
|
||||||
NewHive->HiveFileName.Length = HiveName->Length;
|
NewHive->FileFullPath.Length = HiveName->Length;
|
||||||
NewHive->HiveFileName.MaximumLength = HiveName->MaximumLength;
|
NewHive->FileFullPath.MaximumLength = HiveName->MaximumLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ROS: Close the hive files */
|
/* ROS: Close the hive files */
|
||||||
|
@ -434,7 +434,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
BOOLEAN Allocate;
|
BOOLEAN Allocate;
|
||||||
UNICODE_STRING KeyName;
|
UNICODE_STRING KeyName;
|
||||||
PEREGISTRY_HIVE SystemHive = NULL;
|
PCMHIVE SystemHive = NULL;
|
||||||
UNICODE_STRING HiveName = RTL_CONSTANT_STRING(L"SYSTEM");
|
UNICODE_STRING HiveName = RTL_CONSTANT_STRING(L"SYSTEM");
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||||
PAGED_CODE();
|
PAGED_CODE();
|
||||||
|
@ -479,7 +479,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
CmPrepareHive(&SystemHive->Hive);
|
CmPrepareHive(&SystemHive->Hive);
|
||||||
|
|
||||||
/* Set the hive filename */
|
/* Set the hive filename */
|
||||||
RtlCreateUnicodeString(&SystemHive->HiveFileName, SYSTEM_REG_FILE);
|
RtlCreateUnicodeString(&SystemHive->FileFullPath, SYSTEM_REG_FILE);
|
||||||
|
|
||||||
/* We imported, no need to create a new hive */
|
/* We imported, no need to create a new hive */
|
||||||
Allocate = FALSE;
|
Allocate = FALSE;
|
||||||
|
@ -756,7 +756,7 @@ CmInitSystem1(VOID)
|
||||||
LARGE_INTEGER DueTime;
|
LARGE_INTEGER DueTime;
|
||||||
HANDLE ThreadHandle;
|
HANDLE ThreadHandle;
|
||||||
CLIENT_ID ThreadId;
|
CLIENT_ID ThreadId;
|
||||||
PEREGISTRY_HIVE HardwareHive;
|
PCMHIVE HardwareHive;
|
||||||
PVOID BaseAddress;
|
PVOID BaseAddress;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
PSECURITY_DESCRIPTOR SecurityDescriptor;
|
||||||
|
|
|
@ -77,8 +77,8 @@ CmpFileRead(IN PHHIVE RegistryHive,
|
||||||
OUT PVOID Buffer,
|
OUT PVOID Buffer,
|
||||||
IN SIZE_T BufferLength)
|
IN SIZE_T BufferLength)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
|
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
|
||||||
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
|
HANDLE HiveHandle = CmHive->FileHandles[FileType];
|
||||||
LARGE_INTEGER _FileOffset;
|
LARGE_INTEGER _FileOffset;
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -97,8 +97,8 @@ CmpFileWrite(IN PHHIVE RegistryHive,
|
||||||
IN PVOID Buffer,
|
IN PVOID Buffer,
|
||||||
IN SIZE_T BufferLength)
|
IN SIZE_T BufferLength)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
|
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
|
||||||
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
|
HANDLE HiveHandle = CmHive->FileHandles[FileType];
|
||||||
LARGE_INTEGER _FileOffset;
|
LARGE_INTEGER _FileOffset;
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -116,8 +116,8 @@ CmpFileSetSize(IN PHHIVE RegistryHive,
|
||||||
IN ULONG FileSize,
|
IN ULONG FileSize,
|
||||||
IN ULONG OldFileSize)
|
IN ULONG OldFileSize)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
|
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
|
||||||
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
|
HANDLE HiveHandle = CmHive->FileHandles[FileType];
|
||||||
FILE_END_OF_FILE_INFORMATION EndOfFileInfo;
|
FILE_END_OF_FILE_INFORMATION EndOfFileInfo;
|
||||||
FILE_ALLOCATION_INFORMATION FileAllocationInfo;
|
FILE_ALLOCATION_INFORMATION FileAllocationInfo;
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
@ -149,8 +149,8 @@ CmpFileFlush(IN PHHIVE RegistryHive,
|
||||||
IN OUT PLARGE_INTEGER FileOffset,
|
IN OUT PLARGE_INTEGER FileOffset,
|
||||||
IN ULONG Length)
|
IN ULONG Length)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
|
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
|
||||||
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
|
HANDLE HiveHandle = CmHive->FileHandles[FileType];
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
BOOL
|
BOOL
|
||||||
ExportBinaryHive(
|
ExportBinaryHive(
|
||||||
IN PCSTR FileName,
|
IN PCSTR FileName,
|
||||||
IN PEREGISTRY_HIVE Hive)
|
IN PCMHIVE Hive)
|
||||||
{
|
{
|
||||||
FILE *File;
|
FILE *File;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
|
@ -49,7 +49,7 @@ ExportBinaryHive(
|
||||||
|
|
||||||
fseek (File, 0, SEEK_SET);
|
fseek (File, 0, SEEK_SET);
|
||||||
|
|
||||||
Hive->HiveHandle = (HANDLE)File;
|
Hive->FileHandles[HFILE_TYPE_PRIMARY] = (HANDLE)File;
|
||||||
ret = HvWriteHive(&Hive->Hive);
|
ret = HvWriteHive(&Hive->Hive);
|
||||||
fclose (File);
|
fclose (File);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
BOOL
|
BOOL
|
||||||
ExportBinaryHive(
|
ExportBinaryHive(
|
||||||
IN PCSTR FileName,
|
IN PCSTR FileName,
|
||||||
IN PEREGISTRY_HIVE Hive);
|
IN PCMHIVE Hive);
|
||||||
|
|
||||||
#endif /* __BINHIVE_H__ */
|
#endif /* __BINHIVE_H__ */
|
||||||
|
|
||||||
|
|
|
@ -67,8 +67,8 @@ CmpFileWrite(
|
||||||
IN PVOID Buffer,
|
IN PVOID Buffer,
|
||||||
IN SIZE_T BufferLength)
|
IN SIZE_T BufferLength)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
|
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
|
||||||
FILE *File = CmHive->HiveHandle;
|
FILE *File = CmHive->FileHandles[HFILE_TYPE_PRIMARY];
|
||||||
if (0 != fseek (File, *FileOffset, SEEK_SET))
|
if (0 != fseek (File, *FileOffset, SEEK_SET))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return BufferLength == fwrite (Buffer, 1, BufferLength, File);
|
return BufferLength == fwrite (Buffer, 1, BufferLength, File);
|
||||||
|
@ -94,20 +94,20 @@ CmpFileFlush(
|
||||||
PLARGE_INTEGER FileOffset,
|
PLARGE_INTEGER FileOffset,
|
||||||
ULONG Length)
|
ULONG Length)
|
||||||
{
|
{
|
||||||
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
|
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
|
||||||
FILE *File = CmHive->HiveHandle;
|
FILE *File = CmHive->FileHandles[HFILE_TYPE_PRIMARY];
|
||||||
return 0 == fflush (File);
|
return 0 == fflush (File);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiInitializeTempHive(
|
CmiInitializeTempHive(
|
||||||
IN OUT PEREGISTRY_HIVE Hive)
|
IN OUT PCMHIVE Hive)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
RtlZeroMemory (
|
RtlZeroMemory (
|
||||||
Hive,
|
Hive,
|
||||||
sizeof(EREGISTRY_HIVE));
|
sizeof(CMHIVE));
|
||||||
|
|
||||||
DPRINT("Hive 0x%p\n", Hive);
|
DPRINT("Hive 0x%p\n", Hive);
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ CmiInitializeTempHive(
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
CmiAddKeyToHashTable(
|
CmiAddKeyToHashTable(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN OUT PCM_KEY_FAST_INDEX HashCell,
|
IN OUT PCM_KEY_FAST_INDEX HashCell,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN HSTORAGE_TYPE StorageType,
|
IN HSTORAGE_TYPE StorageType,
|
||||||
|
@ -189,7 +189,7 @@ CmiAddKeyToHashTable(
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
CmiAllocateHashTableCell (
|
CmiAllocateHashTableCell (
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
OUT PCM_KEY_FAST_INDEX *HashBlock,
|
OUT PCM_KEY_FAST_INDEX *HashBlock,
|
||||||
OUT HCELL_INDEX *HBOffset,
|
OUT HCELL_INDEX *HBOffset,
|
||||||
IN USHORT SubKeyCount,
|
IN USHORT SubKeyCount,
|
||||||
|
@ -223,7 +223,7 @@ CmiAllocateHashTableCell (
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiAddSubKey(
|
CmiAddSubKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE ParentKeyCell,
|
IN PCM_KEY_NODE ParentKeyCell,
|
||||||
IN HCELL_INDEX ParentKeyCellOffset,
|
IN HCELL_INDEX ParentKeyCellOffset,
|
||||||
IN PCUNICODE_STRING SubKeyName,
|
IN PCUNICODE_STRING SubKeyName,
|
||||||
|
@ -513,7 +513,7 @@ CmiCompareKeyNamesI(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanForSubKey(
|
CmiScanForSubKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN PCUNICODE_STRING SubKeyName,
|
IN PCUNICODE_STRING SubKeyName,
|
||||||
IN ULONG Attributes,
|
IN ULONG Attributes,
|
||||||
|
@ -611,7 +611,7 @@ CmiGetPackedNameLength(
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
CmiAllocateValueCell(
|
CmiAllocateValueCell(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
OUT PCM_KEY_VALUE *ValueCell,
|
OUT PCM_KEY_VALUE *ValueCell,
|
||||||
OUT HCELL_INDEX *VBOffset,
|
OUT HCELL_INDEX *VBOffset,
|
||||||
IN PCUNICODE_STRING ValueName,
|
IN PCUNICODE_STRING ValueName,
|
||||||
|
@ -666,7 +666,7 @@ CmiAllocateValueCell(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiAddValueKey(
|
CmiAddValueKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN HCELL_INDEX KeyCellOffset,
|
IN HCELL_INDEX KeyCellOffset,
|
||||||
IN PCUNICODE_STRING ValueName,
|
IN PCUNICODE_STRING ValueName,
|
||||||
|
@ -780,7 +780,7 @@ CmiComparePackedNames(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanForValueKey(
|
CmiScanForValueKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN PCUNICODE_STRING ValueName,
|
IN PCUNICODE_STRING ValueName,
|
||||||
OUT PCM_KEY_VALUE *pValueCell,
|
OUT PCM_KEY_VALUE *pValueCell,
|
||||||
|
|
|
@ -28,11 +28,11 @@
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiInitializeTempHive(
|
CmiInitializeTempHive(
|
||||||
IN OUT PEREGISTRY_HIVE Hive);
|
IN OUT PCMHIVE Hive);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiAddSubKey(
|
CmiAddSubKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE ParentKeyCell,
|
IN PCM_KEY_NODE ParentKeyCell,
|
||||||
IN HCELL_INDEX ParentKeyCellOffset,
|
IN HCELL_INDEX ParentKeyCellOffset,
|
||||||
IN PCUNICODE_STRING SubKeyName,
|
IN PCUNICODE_STRING SubKeyName,
|
||||||
|
@ -42,7 +42,7 @@ CmiAddSubKey(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanForSubKey(
|
CmiScanForSubKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN PCUNICODE_STRING SubKeyName,
|
IN PCUNICODE_STRING SubKeyName,
|
||||||
IN ULONG Attributes,
|
IN ULONG Attributes,
|
||||||
|
@ -51,7 +51,7 @@ CmiScanForSubKey(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiAddValueKey(
|
CmiAddValueKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN HCELL_INDEX KeyCellOffset,
|
IN HCELL_INDEX KeyCellOffset,
|
||||||
IN PCUNICODE_STRING ValueName,
|
IN PCUNICODE_STRING ValueName,
|
||||||
|
@ -60,7 +60,7 @@ CmiAddValueKey(
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
CmiScanForValueKey(
|
CmiScanForValueKey(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN PCM_KEY_NODE KeyCell,
|
IN PCM_KEY_NODE KeyCell,
|
||||||
IN PCUNICODE_STRING ValueName,
|
IN PCUNICODE_STRING ValueName,
|
||||||
OUT PCM_KEY_VALUE *pValueCell,
|
OUT PCM_KEY_VALUE *pValueCell,
|
||||||
|
|
|
@ -40,17 +40,17 @@
|
||||||
#define REG_DATA_SIZE_MASK 0x7FFFFFFF
|
#define REG_DATA_SIZE_MASK 0x7FFFFFFF
|
||||||
#define REG_DATA_IN_OFFSET 0x80000000
|
#define REG_DATA_IN_OFFSET 0x80000000
|
||||||
|
|
||||||
static EREGISTRY_HIVE RootHive;
|
static CMHIVE RootHive;
|
||||||
static MEMKEY RootKey;
|
static MEMKEY RootKey;
|
||||||
EREGISTRY_HIVE DefaultHive; /* \Registry\User\.DEFAULT */
|
CMHIVE DefaultHive; /* \Registry\User\.DEFAULT */
|
||||||
EREGISTRY_HIVE SamHive; /* \Registry\Machine\SAM */
|
CMHIVE SamHive; /* \Registry\Machine\SAM */
|
||||||
EREGISTRY_HIVE SecurityHive; /* \Registry\Machine\SECURITY */
|
CMHIVE SecurityHive; /* \Registry\Machine\SECURITY */
|
||||||
EREGISTRY_HIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
|
CMHIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
|
||||||
EREGISTRY_HIVE SystemHive; /* \Registry\Machine\SYSTEM */
|
CMHIVE SystemHive; /* \Registry\Machine\SYSTEM */
|
||||||
|
|
||||||
static MEMKEY
|
static MEMKEY
|
||||||
CreateInMemoryStructure(
|
CreateInMemoryStructure(
|
||||||
IN PEREGISTRY_HIVE RegistryHive,
|
IN PCMHIVE RegistryHive,
|
||||||
IN HCELL_INDEX KeyCellOffset,
|
IN HCELL_INDEX KeyCellOffset,
|
||||||
IN PCUNICODE_STRING KeyName)
|
IN PCUNICODE_STRING KeyName)
|
||||||
{
|
{
|
||||||
|
@ -569,7 +569,7 @@ RegDeleteValueA(
|
||||||
static BOOL
|
static BOOL
|
||||||
ConnectRegistry(
|
ConnectRegistry(
|
||||||
IN HKEY RootKey,
|
IN HKEY RootKey,
|
||||||
IN PEREGISTRY_HIVE HiveToConnect,
|
IN PCMHIVE HiveToConnect,
|
||||||
IN LPCWSTR Path)
|
IN LPCWSTR Path)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -599,7 +599,7 @@ ConnectRegistry(
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
MyExportBinaryHive (PCHAR FileName,
|
MyExportBinaryHive (PCHAR FileName,
|
||||||
PEREGISTRY_HIVE RootHive)
|
PCMHIVE RootHive)
|
||||||
{
|
{
|
||||||
FILE *File;
|
FILE *File;
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
|
@ -614,7 +614,7 @@ MyExportBinaryHive (PCHAR FileName,
|
||||||
|
|
||||||
fseek (File, 0, SEEK_SET);
|
fseek (File, 0, SEEK_SET);
|
||||||
|
|
||||||
RootHive->HiveHandle = (HANDLE)File;
|
RootHive->FileHandles[HFILE_TYPE_PRIMARY] = (HANDLE)File;
|
||||||
ret = HvWriteHive(&RootHive->Hive);
|
ret = HvWriteHive(&RootHive->Hive);
|
||||||
fclose (File);
|
fclose (File);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -41,7 +41,7 @@ typedef struct _REG_KEY
|
||||||
/* Information on hard disk structure */
|
/* Information on hard disk structure */
|
||||||
HCELL_INDEX KeyCellOffset;
|
HCELL_INDEX KeyCellOffset;
|
||||||
PCM_KEY_NODE KeyCell;
|
PCM_KEY_NODE KeyCell;
|
||||||
PEREGISTRY_HIVE RegistryHive;
|
PCMHIVE RegistryHive;
|
||||||
|
|
||||||
/* Used when linking to another key */
|
/* Used when linking to another key */
|
||||||
struct _REG_KEY* LinkedKey;
|
struct _REG_KEY* LinkedKey;
|
||||||
|
@ -50,11 +50,11 @@ typedef struct _REG_KEY
|
||||||
#define HKEY_TO_MEMKEY(hKey) ((MEMKEY)(hKey))
|
#define HKEY_TO_MEMKEY(hKey) ((MEMKEY)(hKey))
|
||||||
#define MEMKEY_TO_HKEY(memKey) ((HKEY)(memKey))
|
#define MEMKEY_TO_HKEY(memKey) ((HKEY)(memKey))
|
||||||
|
|
||||||
extern EREGISTRY_HIVE DefaultHive; /* \Registry\User\.DEFAULT */
|
extern CMHIVE DefaultHive; /* \Registry\User\.DEFAULT */
|
||||||
extern EREGISTRY_HIVE SamHive; /* \Registry\Machine\SAM */
|
extern CMHIVE SamHive; /* \Registry\Machine\SAM */
|
||||||
extern EREGISTRY_HIVE SecurityHive; /* \Registry\Machine\SECURITY */
|
extern CMHIVE SecurityHive; /* \Registry\Machine\SECURITY */
|
||||||
extern EREGISTRY_HIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
|
extern CMHIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
|
||||||
extern EREGISTRY_HIVE SystemHive; /* \Registry\Machine\SYSTEM */
|
extern CMHIVE SystemHive; /* \Registry\Machine\SYSTEM */
|
||||||
|
|
||||||
#define ERROR_SUCCESS 0L
|
#define ERROR_SUCCESS 0L
|
||||||
#define ERROR_UNSUCCESSFUL 1L
|
#define ERROR_UNSUCCESSFUL 1L
|
||||||
|
@ -127,3 +127,4 @@ RegInitializeRegistry(VOID);
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue