- 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
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,
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,
#ifndef _TYPEDEFS_HOST_H
#include <ntddk.h>
+
#else
#define REG_OPTION_VOLATILE 1
#define OBJ_CASE_INSENSITIVE 0x00000040L
#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
#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
+{
+ 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;
- LIST_ENTRY HiveList;
- UNICODE_STRING HiveFileName;
- UNICODE_STRING LogFileName;
- PCM_KEY_SECURITY RootSecurityCell;
- ULONG Flags;
- HANDLE HiveHandle;
- HANDLE LogHandle;
-} EREGISTRY_HIVE, *PEREGISTRY_HIVE;
+ 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,
#ifndef __INCLUDE_CM_H
#define __INCLUDE_CM_H
-#include <cmlib.h>
+#include "ntoskrnl/config/cm.h"
#ifdef DBG
#define CHECKED 1
#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 */
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 */
#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;
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,
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);
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*/
{
NTSTATUS Status;
PKEY_OBJECT KeyObject;
- PEREGISTRY_HIVE RegistryHive;
+ PCMHIVE RegistryHive;
KPROCESSOR_MODE PreviousMode;
PAGED_CODE();
#include <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
-
#include "cm.h"
-#include "../config/cm.h"
/* LOCAL MACROS *************************************************************/
IN PCUNICODE_STRING FileName,
IN ULONG Flags)
{
- PEREGISTRY_HIVE Hive = NULL;
+ PCMHIVE Hive = NULL;
NTSTATUS Status;
BOOLEAN Allocate = TRUE;
}
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;
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,
}
NTSTATUS
-CmiScanKeyForValue(IN PEREGISTRY_HIVE RegistryHive,
+CmiScanKeyForValue(IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *ValueCell,
}
NTSTATUS
-CmiScanForSubKey(IN PEREGISTRY_HIVE RegistryHive,
+CmiScanForSubKey(IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
OUT PCM_KEY_NODE *SubKeyCell,
OUT HCELL_INDEX *BlockOffset,
#include <internal/debug.h>
#include "cm.h"
-#include "../config/cm.h"
#if defined (ALLOC_PRAGMA)
#pragma alloc_text(INIT, CmInitSystem1)
extern BOOLEAN ExpInTextModeSetup;
POBJECT_TYPE CmpKeyObjectType = NULL;
-PEREGISTRY_HIVE CmiVolatileHive = NULL;
+PCMHIVE CmiVolatileHive = NULL;
LIST_ENTRY CmpHiveListHead;
NTAPI
CmpLinkHiveToMaster(IN PUNICODE_STRING LinkName,
IN HANDLE RootDirectory,
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN BOOLEAN Allocate,
IN PSECURITY_DESCRIPTOR SecurityDescriptor)
{
NTSTATUS
CmiConnectHive(IN POBJECT_ATTRIBUTES KeyObjectAttributes,
- IN PEREGISTRY_HIVE RegistryHive)
+ IN PCMHIVE RegistryHive)
{
UNICODE_STRING RemainingPath;
PKEY_OBJECT ParentKey;
VOID
CmShutdownRegistry(VOID)
{
- PEREGISTRY_HIVE Hive;
+ PCMHIVE Hive;
PLIST_ENTRY Entry;
DPRINT("CmShutdownRegistry() called\n");
Entry = CmpHiveListHead.Flink;
while (Entry != &CmpHiveListHead)
{
- Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
+ Hive = CONTAINING_RECORD(Entry, CMHIVE, HiveList);
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
{
NTAPI
CmiHiveSyncRoutine(PVOID DeferredContext)
{
- PEREGISTRY_HIVE Hive;
+ PCMHIVE Hive;
PLIST_ENTRY Entry;
DPRINT("CmiHiveSyncRoutine() called\n");
Entry = CmpHiveListHead.Flink;
while (Entry != &CmpHiveListHead)
{
- Hive = CONTAINING_RECORD(Entry, EREGISTRY_HIVE, HiveList);
+ Hive = CONTAINING_RECORD(Entry, CMHIVE, HiveList);
if (!(IsNoFileHive(Hive) || IsNoSynchHive(Hive)))
{
extern ULONG CmiTimer;
static NTSTATUS
-CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
+CmiGetLinkTarget(PCMHIVE RegistryHive,
PCM_KEY_NODE KeyCell,
PUNICODE_STRING TargetPath);
}
static NTSTATUS
-CmiGetLinkTarget(PEREGISTRY_HIVE RegistryHive,
+CmiGetLinkTarget(PCMHIVE RegistryHive,
PCM_KEY_NODE KeyCell,
PUNICODE_STRING TargetPath)
{
#define CM_DELAYS_PER_PAGE \\r
PAGE_SIZE / sizeof(CM_DELAYED_CLOSE_ENTRY)\r
\r
-#ifndef __INCLUDE_CM_H\r
-\r
//\r
// Value Search Results\r
//\r
#define REG_SYSTEM_KEY_NAME L"\\Registry\\Machine\\SYSTEM"\r
#define REG_HARDWARE_KEY_NAME L"\\Registry\\Machine\\HARDWARE"\r
#define IsNoFileHive(Hive) ((Hive)->Flags & HIVE_NO_FILE)\r
-typedef struct _EREGISTRY_HIVE\r
-{\r
- HHIVE Hive;\r
- LIST_ENTRY HiveList;\r
- UNICODE_STRING HiveFileName;\r
- UNICODE_STRING LogFileName;\r
- PCM_KEY_SECURITY RootSecurityCell;\r
- ULONG Flags;\r
- HANDLE HiveHandle;\r
- HANDLE LogHandle;\r
-} EREGISTRY_HIVE, *PEREGISTRY_HIVE;\r
typedef struct _KEY_OBJECT\r
{\r
CSHORT Type;\r
CSHORT Size;\r
ULONG Flags;\r
UNICODE_STRING Name;\r
- PEREGISTRY_HIVE RegistryHive;\r
+ PCMHIVE RegistryHive;\r
HCELL_INDEX KeyCellOffset;\r
PCM_KEY_NODE KeyCell;\r
struct _KEY_OBJECT *ParentKey;\r
LIST_ENTRY HiveList;\r
CACHED_CHILD_LIST ValueCache;\r
} KEY_OBJECT, *PKEY_OBJECT;\r
-extern PEREGISTRY_HIVE CmiVolatileHive;\r
+extern PCMHIVE CmiVolatileHive;\r
extern LIST_ENTRY CmiKeyObjectListHead, CmiConnectedHiveList;\r
extern KTIMER CmiWorkerTimer;\r
VOID NTAPI CmiWorkerThread(IN PVOID Param);\r
IN PSECURITY_DESCRIPTOR SecurityDescriptor\r
);\r
\r
-/* NOTE: This function declaration is currently duplicated in both */\r
-/* cm/cm.h and config/cm.h. TODO: Pick one single place to declare it. */\r
NTSTATUS\r
NTAPI\r
CmpOpenHiveFiles(\r
OUT PULONG ClusterSize OPTIONAL\r
);\r
\r
+NTSTATUS\r
+NTAPI\r
+CmpInitHiveFromFile(\r
+ IN PCUNICODE_STRING HiveName,\r
+ IN ULONG HiveFlags,\r
+ OUT PCMHIVE *Hive,\r
+ IN OUT PBOOLEAN New,\r
+ IN ULONG CheckFlags\r
+);\r
+\r
//\r
// Registry Utility Functions\r
//\r
#if 0\r
IN PCM_KEY_BODY KeyObject,\r
#else\r
- IN PVOID KeyObject,\r
+ IN PKEY_OBJECT KeyObject,\r
#endif\r
IN ULONG Flags\r
);\r
IN BOOLEAN ForceFlush\r
);\r
\r
+//\r
+// Open/Create Routines\r
+//\r
+NTSTATUS\r
+NTAPI\r
+CmpDoCreate(\r
+ IN PHHIVE Hive,\r
+ IN HCELL_INDEX Cell,\r
+ IN PACCESS_STATE AccessState,\r
+ IN PUNICODE_STRING Name,\r
+ IN KPROCESSOR_MODE AccessMode,\r
+ IN PUNICODE_STRING Class,\r
+ IN ULONG CreateOptions,\r
+ IN PKEY_OBJECT Parent,\r
+ IN PCMHIVE OriginatingHive OPTIONAL,\r
+ OUT PVOID *Object\r
+);\r
+\r
//\r
// Cell Index Routines\r
//\r
\r
-/* NOTE: This function declaration is currently duplicated in both */\r
-/* cm/cm.h and config/cm.h. TODO: Pick one single place to declare it. */\r
HCELL_INDEX\r
NTAPI\r
CmpFindSubKeyByName(\r
OUT PBOOLEAN AutoSelect\r
);\r
\r
+VOID\r
+NTAPI\r
+CmGetSystemControlValues(\r
+ IN PVOID SystemHiveData,\r
+ IN PCM_SYSTEM_CONTROL_VECTOR ControlVector\r
+);\r
+\r
+\r
//\r
// Hardware Configuration Routines\r
//\r
IN ULONG Length\r
);\r
\r
+//\r
+// Configuration Manager side of Registry System Calls\r
+//\r
+NTSTATUS\r
+NTAPI\r
+CmEnumerateValueKey(\r
+ IN PCM_KEY_CONTROL_BLOCK Kcb,\r
+ IN ULONG Index,\r
+ IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,\r
+ IN PVOID KeyValueInformation,\r
+ IN ULONG Length,\r
+ IN PULONG ResultLength);\r
+\r
+NTSTATUS\r
+NTAPI\r
+CmSetValueKey(\r
+ IN PCM_KEY_CONTROL_BLOCK Kcb,\r
+ IN PUNICODE_STRING ValueName,\r
+ IN ULONG Type,\r
+ IN PVOID Data,\r
+ IN ULONG DataSize);\r
+\r
+NTSTATUS\r
+NTAPI\r
+CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb,\r
+ IN KEY_INFORMATION_CLASS KeyInformationClass,\r
+ IN PVOID KeyInformation,\r
+ IN ULONG Length,\r
+ IN PULONG ResultLength\r
+);\r
+\r
+NTSTATUS\r
+NTAPI\r
+CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb,\r
+ IN ULONG Index,\r
+ IN KEY_INFORMATION_CLASS KeyInformationClass,\r
+ IN PVOID KeyInformation,\r
+ IN ULONG Length,\r
+ IN PULONG ResultLength\r
+);\r
+\r
+NTSTATUS\r
+NTAPI\r
+CmDeleteKey(\r
+ IN PCM_KEY_CONTROL_BLOCK Kcb\r
+);\r
+\r
+NTSTATUS\r
+NTAPI\r
+CmDeleteValueKey(\r
+ IN PCM_KEY_CONTROL_BLOCK Kcb,\r
+ IN UNICODE_STRING ValueName\r
+);\r
+\r
+NTSTATUS\r
+NTAPI\r
+CmQueryValueKey(\r
+ IN PCM_KEY_CONTROL_BLOCK Kcb,\r
+ IN UNICODE_STRING ValueName,\r
+ IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,\r
+ IN PVOID KeyValueInformation,\r
+ IN ULONG Length,\r
+ IN PULONG ResultLength\r
+);\r
+\r
//\r
// Global variables accessible from all of Cm\r
//\r
// Inlined functions\r
//\r
#include "cm_x.h"\r
-\r
-#endif\r
}\r
\r
/* Make sure we're file-backed */\r
- if (!(IsNoFileHive((PEREGISTRY_HIVE)Kcb->KeyHive)) ||\r
- !(IsNoFileHive((PEREGISTRY_HIVE)Kcb->ParentKcb->KeyHive)))\r
+ if (!(IsNoFileHive((PCMHIVE)Kcb->KeyHive)) ||\r
+ !(IsNoFileHive((PCMHIVE)Kcb->ParentKcb->KeyHive)))\r
{\r
/* Sync up the hives */\r
CmiSyncHives();\r
IN PCUNICODE_STRING FileName OPTIONAL,\r
IN ULONG CheckFlags)\r
{\r
-#if 0\r
PCMHIVE Hive;\r
-#else\r
- PEREGISTRY_HIVE Hive;\r
FILE_STANDARD_INFORMATION FileInformation;\r
-#endif\r
IO_STATUS_BLOCK IoStatusBlock;\r
FILE_FS_SIZE_INFORMATION FileSizeInformation;\r
NTSTATUS Status;\r
}\r
\r
/* Allocate the hive */\r
- Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(EREGISTRY_HIVE), TAG_CM);\r
+ Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(CMHIVE), TAG_CM);\r
if (!Hive) return STATUS_INSUFFICIENT_RESOURCES;\r
-#if 0\r
+\r
/* Setup null fields */\r
Hive->UnloadEvent = NULL;\r
Hive->RootKcb = NULL;\r
ExInitializeResourceLite(Hive->FlusherLock);\r
\r
/* Setup hive locks */\r
- ExInitializePushLock(&Hive->HiveLock);\r
+ ExInitializePushLock((PULONG_PTR)&Hive->HiveLock);\r
Hive->HiveLockOwner = NULL;\r
- ExInitializePushLock(&Hive->WriterLock);\r
+ ExInitializePushLock((PULONG_PTR)&Hive->WriterLock);\r
Hive->WriterLockOwner = NULL;\r
- ExInitializePushLock(&Hive->SecurityLock);\r
+ ExInitializePushLock((PULONG_PTR)&Hive->SecurityLock);\r
Hive->HiveSecurityLockOwner = NULL;\r
\r
/* Clear file names */\r
RtlInitEmptyUnicodeString(&Hive->FileFullPath, NULL, 0);\r
\r
/* Initialize the view list */\r
- CmpInitializeHiveViewList(Hive);\r
+ CmpInitHiveViewList(Hive);\r
\r
/* Initailize the security cache */\r
- CmpInitializeSecurityCache(Hive);\r
+ CmpInitSecurityCache(Hive);\r
\r
/* Setup flags */\r
Hive->Flags = 0;\r
Hive->FlushCount = 0;\r
-#else\r
- /* Clear it */\r
- RtlZeroMemory(Hive, sizeof(EREGISTRY_HIVE));\r
\r
/* Set flags */\r
Hive->Flags = HiveFlags;\r
- Hive->HiveHandle = Primary;\r
- Hive->LogHandle = Log;\r
\r
/* Check how large the file is */\r
ZwQueryInformationFile(Primary,\r
sizeof(FileInformation),\r
FileStandardInformation);\r
Cluster = FileInformation.EndOfFile.LowPart;\r
-#endif\r
\r
/* Initialize it */\r
Status = HvInitialize(&Hive->Hive,\r
if (!NT_SUCCESS(Status))\r
{\r
/* Clear allocations and fail */\r
-#if 0\r
ExFreePool(Hive->ViewLock);\r
ExFreePool(Hive->FlusherLock);\r
-#endif\r
ExFreePool(Hive);\r
return Status;\r
}\r
if (CmCheckRegistry((PCMHIVE)Hive, TRUE))\r
{\r
/* Free all alocations */\r
-#if 0\r
ExFreePool(Hive->ViewLock);\r
ExFreePool(Hive->FlusherLock);\r
-#endif\r
ExFreePool(Hive);\r
return STATUS_REGISTRY_CORRUPT;\r
}\r
if (!Class) Class = &LocalClass;\r
\r
/* Acquire the flusher lock */\r
- //ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock);\r
+ ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock);\r
\r
/* Check if the parent is being deleted */\r
#define KO_MARKED_FOR_DELETE 0x00000001\r
\r
Exit:\r
/* Release the flusher lock and return status */\r
- //ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock);\r
+ ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock);\r
return Status;\r
}\r
HANDLE FileHandle = NULL, LogHandle = NULL;\r
NTSTATUS Status;\r
ULONG Operation, FileType;\r
- PEREGISTRY_HIVE NewHive;\r
+ PCMHIVE NewHive;\r
PAGED_CODE();\r
\r
/* Assume failure */\r
}\r
\r
/* Success, return hive */\r
- *Hive = (PCMHIVE)NewHive;\r
+ *Hive = NewHive;\r
\r
/* ROS: Init root key cell and prepare the hive */\r
if (Operation == HINIT_CREATE) CmCreateRootNode(&NewHive->Hive, L"");\r
CmPrepareHive(&NewHive->Hive);\r
\r
/* Duplicate the hive name */\r
- NewHive->HiveFileName.Buffer = ExAllocatePoolWithTag(PagedPool,\r
+ NewHive->FileFullPath.Buffer = ExAllocatePoolWithTag(PagedPool,\r
HiveName->Length,\r
TAG_CM);\r
- if (NewHive->HiveFileName.Buffer)\r
+ if (NewHive->FileFullPath.Buffer)\r
{\r
/* Copy the string */\r
- RtlCopyMemory(NewHive->HiveFileName.Buffer,\r
+ RtlCopyMemory(NewHive->FileFullPath.Buffer,\r
HiveName->Buffer,\r
HiveName->Length);\r
- NewHive->HiveFileName.Length = HiveName->Length;\r
- NewHive->HiveFileName.MaximumLength = HiveName->MaximumLength;\r
+ NewHive->FileFullPath.Length = HiveName->Length;\r
+ NewHive->FileFullPath.MaximumLength = HiveName->MaximumLength;\r
}\r
\r
/* ROS: Close the hive files */\r
NTSTATUS Status;\r
BOOLEAN Allocate;\r
UNICODE_STRING KeyName;\r
- PEREGISTRY_HIVE SystemHive = NULL;\r
+ PCMHIVE SystemHive = NULL;\r
UNICODE_STRING HiveName = RTL_CONSTANT_STRING(L"SYSTEM");\r
PSECURITY_DESCRIPTOR SecurityDescriptor;\r
PAGED_CODE();\r
CmPrepareHive(&SystemHive->Hive);\r
\r
/* Set the hive filename */\r
- RtlCreateUnicodeString(&SystemHive->HiveFileName, SYSTEM_REG_FILE);\r
+ RtlCreateUnicodeString(&SystemHive->FileFullPath, SYSTEM_REG_FILE);\r
\r
/* We imported, no need to create a new hive */\r
Allocate = FALSE;\r
LARGE_INTEGER DueTime;\r
HANDLE ThreadHandle;\r
CLIENT_ID ThreadId;\r
- PEREGISTRY_HIVE HardwareHive;\r
+ PCMHIVE HardwareHive;\r
PVOID BaseAddress;\r
ULONG Length;\r
PSECURITY_DESCRIPTOR SecurityDescriptor;\r
OUT PVOID Buffer,\r
IN SIZE_T BufferLength)\r
{\r
- PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;\r
- HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;\r
+ PCMHIVE CmHive = (PCMHIVE)RegistryHive;\r
+ HANDLE HiveHandle = CmHive->FileHandles[FileType];\r
LARGE_INTEGER _FileOffset;\r
IO_STATUS_BLOCK IoStatusBlock;\r
NTSTATUS Status;\r
IN PVOID Buffer,\r
IN SIZE_T BufferLength)\r
{\r
- PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;\r
- HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;\r
+ PCMHIVE CmHive = (PCMHIVE)RegistryHive;\r
+ HANDLE HiveHandle = CmHive->FileHandles[FileType];\r
LARGE_INTEGER _FileOffset;\r
IO_STATUS_BLOCK IoStatusBlock;\r
NTSTATUS Status;\r
IN ULONG FileSize,\r
IN ULONG OldFileSize)\r
{\r
- PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;\r
- HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;\r
+ PCMHIVE CmHive = (PCMHIVE)RegistryHive;\r
+ HANDLE HiveHandle = CmHive->FileHandles[FileType];\r
FILE_END_OF_FILE_INFORMATION EndOfFileInfo;\r
FILE_ALLOCATION_INFORMATION FileAllocationInfo;\r
IO_STATUS_BLOCK IoStatusBlock;\r
IN OUT PLARGE_INTEGER FileOffset,\r
IN ULONG Length)\r
{\r
- PEREGISTRY_HIVE CmHive = (PEREGISTRY_HIVE)RegistryHive;\r
- HANDLE HiveHandle = FileType == HFILE_TYPE_PRIMARY ? CmHive->HiveHandle : CmHive->LogHandle;\r
+ PCMHIVE CmHive = (PCMHIVE)RegistryHive;\r
+ HANDLE HiveHandle = CmHive->FileHandles[FileType];\r
IO_STATUS_BLOCK IoStatusBlock;\r
NTSTATUS Status;\r
\r
BOOL
ExportBinaryHive(
IN PCSTR FileName,
- IN PEREGISTRY_HIVE Hive)
+ IN PCMHIVE Hive)
{
FILE *File;
BOOL ret;
fseek (File, 0, SEEK_SET);
- Hive->HiveHandle = (HANDLE)File;
+ Hive->FileHandles[HFILE_TYPE_PRIMARY] = (HANDLE)File;
ret = HvWriteHive(&Hive->Hive);
fclose (File);
return ret;
BOOL
ExportBinaryHive(
IN PCSTR FileName,
- IN PEREGISTRY_HIVE Hive);
+ IN PCMHIVE Hive);
#endif /* __BINHIVE_H__ */
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);
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);
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,
static NTSTATUS
CmiAllocateHashTableCell (
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
OUT PCM_KEY_FAST_INDEX *HashBlock,
OUT HCELL_INDEX *HBOffset,
IN USHORT SubKeyCount,
NTSTATUS
CmiAddSubKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE ParentKeyCell,
IN HCELL_INDEX ParentKeyCellOffset,
IN PCUNICODE_STRING SubKeyName,
NTSTATUS
CmiScanForSubKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING SubKeyName,
IN ULONG Attributes,
static NTSTATUS
CmiAllocateValueCell(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
OUT PCM_KEY_VALUE *ValueCell,
OUT HCELL_INDEX *VBOffset,
IN PCUNICODE_STRING ValueName,
NTSTATUS
CmiAddValueKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN HCELL_INDEX KeyCellOffset,
IN PCUNICODE_STRING ValueName,
NTSTATUS
CmiScanForValueKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *pValueCell,
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,
NTSTATUS
CmiScanForSubKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING SubKeyName,
IN ULONG Attributes,
NTSTATUS
CmiAddValueKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN HCELL_INDEX KeyCellOffset,
IN PCUNICODE_STRING ValueName,
NTSTATUS
CmiScanForValueKey(
- IN PEREGISTRY_HIVE RegistryHive,
+ IN PCMHIVE RegistryHive,
IN PCM_KEY_NODE KeyCell,
IN PCUNICODE_STRING ValueName,
OUT PCM_KEY_VALUE *pValueCell,
#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)
{
static BOOL
ConnectRegistry(
IN HKEY RootKey,
- IN PEREGISTRY_HIVE HiveToConnect,
+ IN PCMHIVE HiveToConnect,
IN LPCWSTR Path)
{
NTSTATUS Status;
static BOOL
MyExportBinaryHive (PCHAR FileName,
- PEREGISTRY_HIVE RootHive)
+ PCMHIVE RootHive)
{
FILE *File;
BOOL ret;
fseek (File, 0, SEEK_SET);
- RootHive->HiveHandle = (HANDLE)File;
+ RootHive->FileHandles[HFILE_TYPE_PRIMARY] = (HANDLE)File;
ret = HvWriteHive(&RootHive->Hive);
fclose (File);
return ret;
/* 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;
#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
/* EOF */
+