- 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:
Aleksey Bragin 2007-10-28 22:38:20 +00:00
parent 6b7c404e0b
commit b308496ffa
19 changed files with 282 additions and 399 deletions

View file

@ -710,13 +710,13 @@ RegImportBinaryHive(PCHAR ChunkBase,
FRLDRHKEY SystemKey;
ULONG i;
LONG Error;
PEREGISTRY_HIVE CmHive;
PCMHIVE CmHive;
PHHIVE Hive;
NTSTATUS Status;
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,
HINIT_FLAT,
0,
@ -818,13 +818,13 @@ RegExportBinaryHive(PCWSTR KeyName,
PCHAR ChunkBase,
ULONG* ChunkSize)
{
PEREGISTRY_HIVE CmHive;
PCMHIVE CmHive;
PHHIVE Hive;
NTSTATUS Status;
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,
HINIT_CREATE,
0,

View file

@ -27,6 +27,7 @@
#ifndef _TYPEDEFS_HOST_H
#include <ntddk.h>
#else
#define REG_OPTION_VOLATILE 1
#define OBJ_CASE_INSENSITIVE 0x00000040L
@ -60,6 +61,14 @@ RtlClearAllBits(
#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
#ifndef ROUND_UP
@ -75,26 +84,87 @@ RtlClearAllBits(
#include "hivedata.h"
#include "cmdata.h"
#ifndef _CM_
typedef struct _EREGISTRY_HIVE
#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
{
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;
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
/*
* Public functions.
*/
NTSTATUS CMAPI
HvInitialize(
PHHIVE RegistryHive,
PHHIVE RegistryHive,
ULONG Operation,
ULONG HiveType,
ULONG HiveFlags,

View file

@ -1,7 +1,7 @@
#ifndef __INCLUDE_CM_H
#define __INCLUDE_CM_H
#include <cmlib.h>
#include "ntoskrnl/config/cm.h"
#ifdef DBG
#define CHECKED 1
@ -48,19 +48,6 @@
#define IsNoFileHive(Hive) ((Hive)->Flags & HIVE_NO_FILE)
#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 */
@ -68,97 +55,6 @@ typedef struct _CACHED_CHILD_LIST
attempts to access the key must not succeed */
#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 */
#define CmiDirectoryIndex(CellIndex)(CellIndex & 0xffc000000)
/* 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)
extern PEREGISTRY_HIVE CmiVolatileHive;
extern POBJECT_TYPE CmpKeyObjectType;
extern KSPIN_LOCK CmiKeyListLock;
extern LIST_ENTRY CmpHiveListHead;
extern ERESOURCE CmpRegistryLock;
extern EX_PUSH_LOCK CmpHiveListHeadLock;
@ -224,24 +117,10 @@ CmiLoadHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
ULONG Flags);
NTSTATUS
CmiFlushRegistryHive(PEREGISTRY_HIVE 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);
CmiFlushRegistryHive(PCMHIVE RegistryHive);
NTSTATUS
CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
CmiScanForSubKey(IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
OUT PCM_KEY_NODE *SubKeyCell,
OUT HCELL_INDEX *BlockOffset,
@ -250,111 +129,20 @@ CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
IN ULONG Attributes);
NTSTATUS
CmiAddSubKey(IN PEREGISTRY_HIVE 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,
CmiScanKeyForValue(IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *ValueCell,
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
CmiConnectHive(POBJECT_ATTRIBUTES KeyObjectAttributes,
PEREGISTRY_HIVE RegistryHive);
PCMHIVE RegistryHive);
NTSTATUS
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
CmiSyncHives(VOID);
@ -370,49 +158,8 @@ CmFindObject(
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
#define ObGetObjectPointerCount(x) OBJECT_TO_OBJECT_HEADER(x)->PointerCount
#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*/

View file

@ -412,7 +412,7 @@ NtFlushKey(IN HANDLE KeyHandle)
{
NTSTATUS Status;
PKEY_OBJECT KeyObject;
PEREGISTRY_HIVE RegistryHive;
PCMHIVE RegistryHive;
KPROCESSOR_MODE PreviousMode;
PAGED_CODE();

View file

@ -12,9 +12,7 @@
#include <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
#include "cm.h"
#include "../config/cm.h"
/* LOCAL MACROS *************************************************************/
@ -29,7 +27,7 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
IN PCUNICODE_STRING FileName,
IN ULONG Flags)
{
PEREGISTRY_HIVE Hive = NULL;
PCMHIVE Hive = NULL;
NTSTATUS Status;
BOOLEAN Allocate = TRUE;
@ -61,14 +59,14 @@ CmiLoadHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
}
VOID
CmCloseHiveFiles(PEREGISTRY_HIVE RegistryHive)
CmCloseHiveFiles(PCMHIVE RegistryHive)
{
ZwClose(RegistryHive->HiveHandle);
ZwClose(RegistryHive->LogHandle);
ZwClose(RegistryHive->FileHandles[HFILE_TYPE_PRIMARY]);
ZwClose(RegistryHive->FileHandles[HFILE_TYPE_LOG]);
}
NTSTATUS
CmiFlushRegistryHive(PEREGISTRY_HIVE RegistryHive)
CmiFlushRegistryHive(PCMHIVE RegistryHive)
{
BOOLEAN Success;
NTSTATUS Status;
@ -81,10 +79,10 @@ CmiFlushRegistryHive(PEREGISTRY_HIVE RegistryHive)
return(STATUS_SUCCESS);
}
Status = CmpOpenHiveFiles(&RegistryHive->HiveFileName,
Status = CmpOpenHiveFiles(&RegistryHive->FileFullPath,
L".LOG",
&RegistryHive->HiveHandle,
&RegistryHive->LogHandle,
&RegistryHive->FileHandles[HFILE_TYPE_PRIMARY],
&RegistryHive->FileHandles[HFILE_TYPE_LOG],
&Disposition,
&Disposition,
FALSE,
@ -255,7 +253,7 @@ CmiGetMaxValueDataLength(PHHIVE Hive,
}
NTSTATUS
CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
CmiScanKeyForValue(IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *ValueCell,
@ -278,7 +276,7 @@ CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
}
NTSTATUS
CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
CmiScanForSubKey(IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
OUT PCM_KEY_NODE *SubKeyCell,
OUT HCELL_INDEX *BlockOffset,

View file

@ -18,7 +18,6 @@
#include <internal/debug.h>
#include "cm.h"
#include "../config/cm.h"
#if defined (ALLOC_PRAGMA)
#pragma alloc_text(INIT, CmInitSystem1)
@ -29,7 +28,7 @@
extern BOOLEAN ExpInTextModeSetup;
POBJECT_TYPE CmpKeyObjectType = NULL;
PEREGISTRY_HIVE CmiVolatileHive = NULL;
PCMHIVE CmiVolatileHive = NULL;
LIST_ENTRY CmpHiveListHead;
@ -245,7 +244,7 @@ NTSTATUS
NTAPI
CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
IN HANDLE RootDirectory,
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN BOOLEAN Allocate,
IN PSECURITY_DESCRIPTOR SecurityDescriptor)
{
@ -267,7 +266,7 @@ CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
NTSTATUS
CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
IN PEREGISTRY_HIVE RegistryHive)
IN PCMHIVE RegistryHive)
{
UNICODE_STRING RemainingPath;
PKEY_OBJECT ParentKey;
@ -671,7 +670,7 @@ CmiInitHives(BOOLEAN SetupBoot)
VOID
CmShutdownRegistry(VOID)
{
PEREGISTRY_HIVE Hive;
PCMHIVE Hive;
PLIST_ENTRY Entry;
DPRINT("CmShutdownRegistry() called\n");
@ -692,7 +691,7 @@ CmShutdownRegistry(VOID)
Entry = CmpHiveListHead.Flink;
while (Entry != &CmpHiveListHead)
{
Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
Hive = CONTAINING_RECORD(Entry, CMHIVE, HiveList);
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
{
@ -713,7 +712,7 @@ VOID
NTAPI
CmiHiveSyncRoutine(PVOID DeferredContext)
{
PEREGISTRY_HIVE Hive;
PCMHIVE Hive;
PLIST_ENTRY Entry;
DPRINT("CmiHiveSyncRoutine() called\n");
@ -726,7 +725,7 @@ CmiHiveSyncRoutine(PVOID DeferredContext)
Entry = CmpHiveListHead.Flink;
while (Entry != &CmpHiveListHead)
{
Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
Hive = CONTAINING_RECORD(Entry, CMHIVE, HiveList);
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
{

View file

@ -21,7 +21,7 @@ extern LIST_ENTRY CmiKeyObjectListHead;
extern ULONG CmiTimer;
static NTSTATUS
CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
CmiGetLinkTarget(PCMHIVE RegistryHive,
PCM_KEY_NODE KeyCell,
PUNICODE_STRING TargetPath);
@ -809,7 +809,7 @@ CmiScanKeyList(PKEY_OBJECT Parent,
}
static NTSTATUS
CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
CmiGetLinkTarget(PCMHIVE RegistryHive,
PCM_KEY_NODE KeyCell,
PUNICODE_STRING TargetPath)
{

View file

@ -93,8 +93,6 @@
#define CM_DELAYS_PER_PAGE \
PAGE_SIZE / sizeof(CM_DELAYED_CLOSE_ENTRY)
#ifndef __INCLUDE_CM_H
//
// Value Search Results
//
@ -496,24 +494,13 @@ typedef struct _KEY_INFORMATION
#define REG_SYSTEM_KEY_NAME L"\\Registry\\Machine\\SYSTEM"
#define REG_HARDWARE_KEY_NAME L"\\Registry\\Machine\\HARDWARE"
#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
{
CSHORT Type;
CSHORT Size;
ULONG Flags;
UNICODE_STRING Name;
PEREGISTRY_HIVE RegistryHive;
PCMHIVE RegistryHive;
HCELL_INDEX KeyCellOffset;
PCM_KEY_NODE KeyCell;
struct _KEY_OBJECT *ParentKey;
@ -525,7 +512,7 @@ typedef struct _KEY_OBJECT
LIST_ENTRY HiveList;
CACHED_CHILD_LIST ValueCache;
} KEY_OBJECT, *PKEY_OBJECT;
extern PEREGISTRY_HIVE CmiVolatileHive;
extern PCMHIVE CmiVolatileHive;
extern LIST_ENTRY CmiKeyObjectListHead, CmiConnectedHiveList;
extern KTIMER CmiWorkerTimer;
VOID NTAPI CmiWorkerThread(IN PVOID Param);
@ -755,8 +742,6 @@ CmpLinkHiveToMaster(
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
NTAPI
CmpOpenHiveFiles(
@ -772,6 +757,16 @@ CmpOpenHiveFiles(
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
//
@ -832,7 +827,7 @@ EnlistKeyBodyWithKCB(
#if 0
IN PCM_KEY_BODY KeyObject,
#else
IN PVOID KeyObject,
IN PKEY_OBJECT KeyObject,
#endif
IN ULONG Flags
);
@ -917,12 +912,28 @@ CmpFlushEntireRegistry(
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
//
/* 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
NTAPI
CmpFindSubKeyByName(
@ -1064,6 +1075,14 @@ CmpFindControlSet(
OUT PBOOLEAN AutoSelect
);
VOID
NTAPI
CmGetSystemControlValues(
IN PVOID SystemHiveData,
IN PCM_SYSTEM_CONTROL_VECTOR ControlVector
);
//
// Hardware Configuration Routines
//
@ -1154,6 +1173,71 @@ CmpFileFlush(
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
//
@ -1197,5 +1281,3 @@ extern ULONG CmpHashTableSize;
// Inlined functions
//
#include "cm_x.h"
#endif

View file

@ -1052,8 +1052,8 @@ CmDeleteKey(IN PCM_KEY_CONTROL_BLOCK Kcb)
}
/* Make sure we're file-backed */
if (!(IsNoFileHive((PEREGISTRY_HIVE)Kcb->KeyHive)) ||
!(IsNoFileHive((PEREGISTRY_HIVE)Kcb->ParentKcb->KeyHive)))
if (!(IsNoFileHive((PCMHIVE)Kcb->KeyHive)) ||
!(IsNoFileHive((PCMHIVE)Kcb->ParentKcb->KeyHive)))
{
/* Sync up the hives */
CmiSyncHives();

View file

@ -28,12 +28,8 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
IN PCUNICODE_STRING FileName OPTIONAL,
IN ULONG CheckFlags)
{
#if 0
PCMHIVE Hive;
#else
PEREGISTRY_HIVE Hive;
FILE_STANDARD_INFORMATION FileInformation;
#endif
IO_STATUS_BLOCK IoStatusBlock;
FILE_FS_SIZE_INFORMATION FileSizeInformation;
NTSTATUS Status;
@ -89,9 +85,9 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
}
/* 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 0
/* Setup null fields */
Hive->UnloadEvent = NULL;
Hive->RootKcb = NULL;
@ -142,11 +138,11 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
ExInitializeResourceLite(Hive->FlusherLock);
/* Setup hive locks */
ExInitializePushLock(&Hive->HiveLock);
ExInitializePushLock((PULONG_PTR)&Hive->HiveLock);
Hive->HiveLockOwner = NULL;
ExInitializePushLock(&Hive->WriterLock);
ExInitializePushLock((PULONG_PTR)&Hive->WriterLock);
Hive->WriterLockOwner = NULL;
ExInitializePushLock(&Hive->SecurityLock);
ExInitializePushLock((PULONG_PTR)&Hive->SecurityLock);
Hive->HiveSecurityLockOwner = NULL;
/* Clear file names */
@ -154,22 +150,17 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
RtlInitEmptyUnicodeString(&Hive->FileFullPath, NULL, 0);
/* Initialize the view list */
CmpInitializeHiveViewList(Hive);
CmpInitHiveViewList(Hive);
/* Initailize the security cache */
CmpInitializeSecurityCache(Hive);
CmpInitSecurityCache(Hive);
/* Setup flags */
Hive->Flags = 0;
Hive->FlushCount = 0;
#else
/* Clear it */
RtlZeroMemory(Hive, sizeof(EREGISTRY_HIVE));
/* Set flags */
Hive->Flags = HiveFlags;
Hive->HiveHandle = Primary;
Hive->LogHandle = Log;
/* Check how large the file is */
ZwQueryInformationFile(Primary,
@ -178,7 +169,6 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
sizeof(FileInformation),
FileStandardInformation);
Cluster = FileInformation.EndOfFile.LowPart;
#endif
/* Initialize it */
Status = HvInitialize(&Hive->Hive,
@ -197,10 +187,8 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
if (!NT_SUCCESS(Status))
{
/* Clear allocations and fail */
#if 0
ExFreePool(Hive->ViewLock);
ExFreePool(Hive->FlusherLock);
#endif
ExFreePool(Hive);
return Status;
}
@ -215,10 +203,8 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive,
if (CmCheckRegistry((PCMHIVE)Hive, TRUE))
{
/* Free all alocations */
#if 0
ExFreePool(Hive->ViewLock);
ExFreePool(Hive->FlusherLock);
#endif
ExFreePool(Hive);
return STATUS_REGISTRY_CORRUPT;
}

View file

@ -267,7 +267,7 @@ CmpDoCreate(IN PHHIVE Hive,
if (!Class) Class = &LocalClass;
/* Acquire the flusher lock */
//ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock);
ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock);
/* Check if the parent is being deleted */
#define KO_MARKED_FOR_DELETE 0x00000001
@ -397,6 +397,6 @@ CmpDoCreate(IN PHHIVE Hive,
Exit:
/* Release the flusher lock and return status */
//ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock);
ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock);
return Status;
}

View file

@ -32,7 +32,7 @@ CmpInitHiveFromFile(IN PCUNICODE_STRING HiveName,
HANDLE FileHandle = NULL, LogHandle = NULL;
NTSTATUS Status;
ULONG Operation, FileType;
PEREGISTRY_HIVE NewHive;
PCMHIVE NewHive;
PAGED_CODE();
/* Assume failure */
@ -110,24 +110,24 @@ CmpInitHiveFromFile(IN PCUNICODE_STRING HiveName,
}
/* Success, return hive */
*Hive = (PCMHIVE)NewHive;
*Hive = NewHive;
/* ROS: Init root key cell and prepare the hive */
if (Operation == HINIT_CREATE) CmCreateRootNode(&NewHive->Hive, L"");
CmPrepareHive(&NewHive->Hive);
/* Duplicate the hive name */
NewHive->HiveFileName.Buffer = ExAllocatePoolWithTag(PagedPool,
NewHive->FileFullPath.Buffer = ExAllocatePoolWithTag(PagedPool,
HiveName->Length,
TAG_CM);
if (NewHive->HiveFileName.Buffer)
if (NewHive->FileFullPath.Buffer)
{
/* Copy the string */
RtlCopyMemory(NewHive->HiveFileName.Buffer,
RtlCopyMemory(NewHive->FileFullPath.Buffer,
HiveName->Buffer,
HiveName->Length);
NewHive->HiveFileName.Length = HiveName->Length;
NewHive->HiveFileName.MaximumLength = HiveName->MaximumLength;
NewHive->FileFullPath.Length = HiveName->Length;
NewHive->FileFullPath.MaximumLength = HiveName->MaximumLength;
}
/* ROS: Close the hive files */
@ -434,7 +434,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
NTSTATUS Status;
BOOLEAN Allocate;
UNICODE_STRING KeyName;
PEREGISTRY_HIVE SystemHive = NULL;
PCMHIVE SystemHive = NULL;
UNICODE_STRING HiveName = RTL_CONSTANT_STRING(L"SYSTEM");
PSECURITY_DESCRIPTOR SecurityDescriptor;
PAGED_CODE();
@ -479,7 +479,7 @@ CmpInitializeSystemHive(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
CmPrepareHive(&SystemHive->Hive);
/* 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 */
Allocate = FALSE;
@ -756,7 +756,7 @@ CmInitSystem1(VOID)
LARGE_INTEGER DueTime;
HANDLE ThreadHandle;
CLIENT_ID ThreadId;
PEREGISTRY_HIVE HardwareHive;
PCMHIVE HardwareHive;
PVOID BaseAddress;
ULONG Length;
PSECURITY_DESCRIPTOR SecurityDescriptor;

View file

@ -77,8 +77,8 @@ CmpFileRead(IN PHHIVE RegistryHive,
OUT PVOID Buffer,
IN SIZE_T BufferLength)
{
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
HANDLE HiveHandle = CmHive->FileHandles[FileType];
LARGE_INTEGER _FileOffset;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
@ -97,8 +97,8 @@ CmpFileWrite(IN PHHIVE RegistryHive,
IN PVOID Buffer,
IN SIZE_T BufferLength)
{
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
HANDLE HiveHandle = CmHive->FileHandles[FileType];
LARGE_INTEGER _FileOffset;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
@ -116,8 +116,8 @@ CmpFileSetSize(IN PHHIVE RegistryHive,
IN ULONG FileSize,
IN ULONG OldFileSize)
{
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
HANDLE HiveHandle = CmHive->FileHandles[FileType];
FILE_END_OF_FILE_INFORMATION EndOfFileInfo;
FILE_ALLOCATION_INFORMATION FileAllocationInfo;
IO_STATUS_BLOCK IoStatusBlock;
@ -149,8 +149,8 @@ CmpFileFlush(IN PHHIVE RegistryHive,
IN OUT PLARGE_INTEGER FileOffset,
IN ULONG Length)
{
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
HANDLE HiveHandle = CmHive->FileHandles[FileType];
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;

View file

@ -32,7 +32,7 @@
BOOL
ExportBinaryHive(
IN PCSTR FileName,
IN PEREGISTRY_HIVE Hive)
IN PCMHIVE Hive)
{
FILE *File;
BOOL ret;
@ -49,7 +49,7 @@ ExportBinaryHive(
fseek (File, 0, SEEK_SET);
Hive->HiveHandle = (HANDLE)File;
Hive->FileHandles[HFILE_TYPE_PRIMARY] = (HANDLE)File;
ret = HvWriteHive(&Hive->Hive);
fclose (File);
return ret;

View file

@ -29,7 +29,7 @@
BOOL
ExportBinaryHive(
IN PCSTR FileName,
IN PEREGISTRY_HIVE Hive);
IN PCMHIVE Hive);
#endif /* __BINHIVE_H__ */

View file

@ -67,8 +67,8 @@ CmpFileWrite(
IN PVOID Buffer,
IN SIZE_T BufferLength)
{
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
FILE *File = CmHive->HiveHandle;
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
FILE *File = CmHive->FileHandles[HFILE_TYPE_PRIMARY];
if (0 != fseek (File, *FileOffset, SEEK_SET))
return FALSE;
return BufferLength == fwrite (Buffer, 1, BufferLength, File);
@ -94,20 +94,20 @@ CmpFileFlush(
PLARGE_INTEGER FileOffset,
ULONG Length)
{
PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;
FILE *File = CmHive->HiveHandle;
PCMHIVE CmHive = (PCMHIVE)RegistryHive;
FILE *File = CmHive->FileHandles[HFILE_TYPE_PRIMARY];
return 0 == fflush (File);
}
NTSTATUS
CmiInitializeTempHive(
IN OUT PEREGISTRY_HIVE Hive)
IN OUT PCMHIVE Hive)
{
NTSTATUS Status;
RtlZeroMemory (
Hive,
sizeof(EREGISTRY_HIVE));
sizeof(CMHIVE));
DPRINT("Hive 0x%p\n", Hive);
@ -149,7 +149,7 @@ CmiInitializeTempHive(
static NTSTATUS
CmiAddKeyToHashTable(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN OUT PCM_KEY_FAST_INDEX HashCell,
IN PCM_KEY_NODE KeyCell,
IN HSTORAGE_TYPE StorageType,
@ -189,7 +189,7 @@ CmiAddKeyToHashTable(
static NTSTATUS
CmiAllocateHashTableCell (
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
OUT PCM_KEY_FAST_INDEX *HashBlock,
OUT HCELL_INDEX *HBOffset,
IN USHORT SubKeyCount,
@ -223,7 +223,7 @@ CmiAllocateHashTableCell (
NTSTATUS
CmiAddSubKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE ParentKeyCell,
IN HCELL_INDEX ParentKeyCellOffset,
IN PCUNICODE_STRING SubKeyName,
@ -513,7 +513,7 @@ CmiCompareKeyNamesI(
NTSTATUS
CmiScanForSubKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING SubKeyName,
IN ULONG Attributes,
@ -611,7 +611,7 @@ CmiGetPackedNameLength(
static NTSTATUS
CmiAllocateValueCell(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
OUT PCM_KEY_VALUE *ValueCell,
OUT HCELL_INDEX *VBOffset,
IN PCUNICODE_STRING ValueName,
@ -666,7 +666,7 @@ CmiAllocateValueCell(
NTSTATUS
CmiAddValueKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN HCELL_INDEX KeyCellOffset,
IN PCUNICODE_STRING ValueName,
@ -780,7 +780,7 @@ CmiComparePackedNames(
NTSTATUS
CmiScanForValueKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *pValueCell,

View file

@ -28,11 +28,11 @@
NTSTATUS
CmiInitializeTempHive(
IN OUT PEREGISTRY_HIVE Hive);
IN OUT PCMHIVE Hive);
NTSTATUS
CmiAddSubKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE ParentKeyCell,
IN HCELL_INDEX ParentKeyCellOffset,
IN PCUNICODE_STRING SubKeyName,
@ -42,7 +42,7 @@ CmiAddSubKey(
NTSTATUS
CmiScanForSubKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING SubKeyName,
IN ULONG Attributes,
@ -51,7 +51,7 @@ CmiScanForSubKey(
NTSTATUS
CmiAddValueKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN HCELL_INDEX KeyCellOffset,
IN PCUNICODE_STRING ValueName,
@ -60,7 +60,7 @@ CmiAddValueKey(
NTSTATUS
CmiScanForValueKey(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *pValueCell,

View file

@ -40,17 +40,17 @@
#define REG_DATA_SIZE_MASK 0x7FFFFFFF
#define REG_DATA_IN_OFFSET 0x80000000
static EREGISTRY_HIVE RootHive;
static CMHIVE RootHive;
static MEMKEY RootKey;
EREGISTRY_HIVE DefaultHive; /* \Registry\User\.DEFAULT */
EREGISTRY_HIVE SamHive; /* \Registry\Machine\SAM */
EREGISTRY_HIVE SecurityHive; /* \Registry\Machine\SECURITY */
EREGISTRY_HIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
EREGISTRY_HIVE SystemHive; /* \Registry\Machine\SYSTEM */
CMHIVE DefaultHive; /* \Registry\User\.DEFAULT */
CMHIVE SamHive; /* \Registry\Machine\SAM */
CMHIVE SecurityHive; /* \Registry\Machine\SECURITY */
CMHIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
CMHIVE SystemHive; /* \Registry\Machine\SYSTEM */
static MEMKEY
CreateInMemoryStructure(
IN PEREGISTRY_HIVE RegistryHive,
IN PCMHIVE RegistryHive,
IN HCELL_INDEX KeyCellOffset,
IN PCUNICODE_STRING KeyName)
{
@ -569,7 +569,7 @@ RegDeleteValueA(
static BOOL
ConnectRegistry(
IN HKEY RootKey,
IN PEREGISTRY_HIVE HiveToConnect,
IN PCMHIVE HiveToConnect,
IN LPCWSTR Path)
{
NTSTATUS Status;
@ -599,7 +599,7 @@ ConnectRegistry(
static BOOL
MyExportBinaryHive (PCHAR FileName,
PEREGISTRY_HIVE RootHive)
PCMHIVE RootHive)
{
FILE *File;
BOOL ret;
@ -614,7 +614,7 @@ MyExportBinaryHive (PCHAR FileName,
fseek (File, 0, SEEK_SET);
RootHive->HiveHandle = (HANDLE)File;
RootHive->FileHandles[HFILE_TYPE_PRIMARY] = (HANDLE)File;
ret = HvWriteHive(&RootHive->Hive);
fclose (File);
return ret;

View file

@ -41,7 +41,7 @@ typedef struct _REG_KEY
/* Information on hard disk structure */
HCELL_INDEX KeyCellOffset;
PCM_KEY_NODE KeyCell;
PEREGISTRY_HIVE RegistryHive;
PCMHIVE RegistryHive;
/* Used when linking to another key */
struct _REG_KEY* LinkedKey;
@ -50,11 +50,11 @@ typedef struct _REG_KEY
#define HKEY_TO_MEMKEY(hKey) ((MEMKEY)(hKey))
#define MEMKEY_TO_HKEY(memKey) ((HKEY)(memKey))
extern EREGISTRY_HIVE DefaultHive; /* \Registry\User\.DEFAULT */
extern EREGISTRY_HIVE SamHive; /* \Registry\Machine\SAM */
extern EREGISTRY_HIVE SecurityHive; /* \Registry\Machine\SECURITY */
extern EREGISTRY_HIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
extern EREGISTRY_HIVE SystemHive; /* \Registry\Machine\SYSTEM */
extern CMHIVE DefaultHive; /* \Registry\User\.DEFAULT */
extern CMHIVE SamHive; /* \Registry\Machine\SAM */
extern CMHIVE SecurityHive; /* \Registry\Machine\SECURITY */
extern CMHIVE SoftwareHive; /* \Registry\Machine\SOFTWARE */
extern CMHIVE SystemHive; /* \Registry\Machine\SYSTEM */
#define ERROR_SUCCESS 0L
#define ERROR_UNSUCCESSFUL 1L
@ -127,3 +127,4 @@ RegInitializeRegistry(VOID);
/* EOF */