KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
HANDLE hKey;
PCM_KEY_NODE Node, ParentNode;
+ CM_PARSE_CONTEXT ParseContext = {0};
PAGED_CODE();
+ /* Setup the parse context */
+ ParseContext.CreateOperation = TRUE;
+ ParseContext.CreateOptions = CreateOptions;
+ if (Class) ParseContext.Class = *Class;
+
/* Capture all the info */
Status = ObpCaptureObjectAttributes(ObjectAttributes,
PreviousMode,
NULL,
&RemainingPath,
KernelMode,
- Class,
- CreateOptions,
+ &ParseContext,
Parent->KeyControlBlock,
- NULL,
(PVOID*)&KeyObject);
if (!NT_SUCCESS(Status)) goto Cleanup;
KeyObject->KeyControlBlock->ValueCache.Count = Node->ValueList.Count;
/* Link child to parent */
- CmiAddKeyToList(Parent->KeyControlBlock, KeyObject);
+ InsertTailList(&Parent->KeyControlBlock->KeyBodyListHead, &KeyObject->KeyBodyEntry);
/* Create the actual handle to the object */
Status = CmpCreateHandle(KeyObject,
IN PACCESS_STATE AccessState,\r
IN PUNICODE_STRING Name,\r
IN KPROCESSOR_MODE AccessMode,\r
- IN PUNICODE_STRING Class,\r
+ IN PCM_PARSE_CONTEXT ParseContext,\r
IN PCM_KEY_CONTROL_BLOCK ParentKcb,\r
- IN ULONG CreateOptions,\r
+ IN ULONG Flags,\r
OUT PHCELL_INDEX KeyCell,\r
OUT PVOID *Object)\r
{\r
\r
/* Get the storage type */\r
StorageType = Stable;\r
- if (CreateOptions & REG_OPTION_VOLATILE) StorageType = Volatile;\r
+ if (Flags & REG_OPTION_VOLATILE) StorageType = Volatile;\r
\r
/* Allocate the child */\r
*KeyCell = HvAllocateCell(Hive,\r
HvReleaseCell(Hive, *KeyCell);\r
\r
/* Check if we have a class name */\r
- if (Class->Length > 0)\r
+ if (ParseContext->Class.Length > 0)\r
{\r
/* Allocate a class cell */\r
- ClassCell = HvAllocateCell(Hive, Class->Length, StorageType, HCELL_NIL);\r
+ ClassCell = HvAllocateCell(Hive,\r
+ ParseContext->Class.Length,\r
+ StorageType,\r
+ HCELL_NIL);\r
if (ClassCell == HCELL_NIL)\r
{\r
/* Fail */\r
KeyBody = (PKEY_OBJECT)(*Object);\r
\r
/* Check if we had a class */\r
- if (Class->Length > 0)\r
+ if (ParseContext->Class.Length > 0)\r
{\r
/* Get the class cell */\r
CellData = HvGetCell(Hive, ClassCell);\r
\r
/* Copy the class data */\r
RtlCopyMemory(&CellData->u.KeyString[0],\r
- Class->Buffer,\r
- Class->Length);\r
+ ParseContext->Class.Buffer,\r
+ ParseContext->Class.Length);\r
}\r
\r
/* Fill out the key node */\r
KeyNode->Signature = CM_KEY_NODE_SIGNATURE;\r
- KeyNode->Flags = CreateOptions;\r
+ KeyNode->Flags = Flags;\r
KeQuerySystemTime(&SystemTime);\r
KeyNode->LastWriteTime = SystemTime;\r
KeyNode->Spare = 0;\r
KeyNode->ValueList.List = HCELL_NIL;\r
KeyNode->Security = HCELL_NIL;\r
KeyNode->Class = ClassCell;\r
- KeyNode->ClassLength = Class->Length;\r
+ KeyNode->ClassLength = ParseContext->Class.Length;\r
KeyNode->MaxValueDataLen = 0;\r
KeyNode->MaxNameLen = 0;\r
KeyNode->MaxValueNameLen = 0;\r
if (!NT_SUCCESS(Status))\r
{\r
/* Free any cells we might've allocated */\r
- if (Class->Length > 0) HvFreeCell(Hive, ClassCell);\r
+ if (ParseContext->Class.Length > 0) HvFreeCell(Hive, ClassCell);\r
HvFreeCell(Hive, *KeyCell);\r
}\r
\r
IN PACCESS_STATE AccessState,\r
IN PUNICODE_STRING Name,\r
IN KPROCESSOR_MODE AccessMode,\r
- IN PUNICODE_STRING Class OPTIONAL,\r
- IN ULONG CreateOptions,\r
+ IN PCM_PARSE_CONTEXT ParseContext,\r
IN PCM_KEY_CONTROL_BLOCK ParentKcb,\r
- IN PCMHIVE OriginatingHive OPTIONAL,\r
OUT PVOID *Object)\r
{\r
NTSTATUS Status;\r
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;\r
LARGE_INTEGER TimeStamp;\r
PCM_KEY_NODE KeyNode;\r
- UNICODE_STRING LocalClass = {0};\r
- if (!Class) Class = &LocalClass;\r
\r
/* Sanity check */\r
#if 0\r
\r
/* Get the parent type */\r
ParentType = HvGetCellType(Cell);\r
- if ((ParentType == Volatile) && !(CreateOptions & REG_OPTION_VOLATILE))\r
+ if ((ParentType == Volatile) &&\r
+ !(ParseContext->CreateOptions & REG_OPTION_VOLATILE))\r
{\r
/* Children of volatile parents must also be volatile */\r
ASSERT(FALSE);\r
AccessState,\r
Name,\r
AccessMode,\r
- Class,\r
+ ParseContext,\r
ParentKcb,\r
- CreateOptions,\r
+ ParseContext->CreateOptions, // WRONG!\r
&KeyCell,\r
Object);\r
if (NT_SUCCESS(Status))\r
}\r
\r
/* Check if we need toupdate class length maximum */\r
- if (KeyNode->MaxClassLen < Class->Length)\r
+ if (KeyNode->MaxClassLen < ParseContext->Class.Length)\r
{\r
/* Update it */\r
- KeyNode->MaxClassLen = Class->Length;\r
+ KeyNode->MaxClassLen = ParseContext->Class.Length;\r
}\r
\r
/* Check if we're creating a symbolic link */\r
- if (CreateOptions & REG_OPTION_CREATE_LINK)\r
+ if (ParseContext->CreateOptions & REG_OPTION_CREATE_LINK)\r
{\r
/* Get the cell data */\r
CellData = HvGetCell(Hive, KeyCell);\r
AccessState,\r
AccessMode,\r
CreateOptions,\r
- NULL,\r
+ Context,\r
0,\r
&Kcb,\r
&Name,\r
AccessState,\r
&Name,\r
AccessMode,\r
- &Context->Class,\r
+ Context,\r
ParentKcb,\r
KEY_HIVE_ENTRY | KEY_NO_DELETE,\r
&ChildCell,\r