ReactOS 0.4.15-dev-7918-g2a2556c
cmi.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define VERIFY_KEY_CELL(key)
 

Functions

NTSTATUS CmiInitializeHive (IN OUT PCMHIVE Hive, IN PCWSTR Name)
 
NTSTATUS CmiCreateSecurityKey (IN PHHIVE Hive, IN HCELL_INDEX Cell, IN PUCHAR Descriptor, IN ULONG DescriptorLength)
 
NTSTATUS CmiAddSubKey (IN PCMHIVE RegistryHive, IN HCELL_INDEX ParentKeyCellOffset, IN PCUNICODE_STRING SubKeyName, IN BOOLEAN VolatileKey, OUT HCELL_INDEX *pBlockOffset)
 
NTSTATUS CmiAddValueKey (IN PCMHIVE RegistryHive, IN PCM_KEY_NODE Parent, IN ULONG ChildIndex, IN PCUNICODE_STRING ValueName, OUT PCM_KEY_VALUE *pValueCell, OUT HCELL_INDEX *pValueCellOffset)
 

Macro Definition Documentation

◆ VERIFY_KEY_CELL

#define VERIFY_KEY_CELL (   key)

Definition at line 29 of file cmi.h.

Function Documentation

◆ CmiAddSubKey()

NTSTATUS CmiAddSubKey ( IN PCMHIVE  RegistryHive,
IN HCELL_INDEX  ParentKeyCellOffset,
IN PCUNICODE_STRING  SubKeyName,
IN BOOLEAN  VolatileKey,
OUT HCELL_INDEX pBlockOffset 
)

Definition at line 297 of file cmi.c.

303{
304 PCM_KEY_NODE ParentKeyCell;
305 HCELL_INDEX NKBOffset;
307
308 /* Create the new key */
309 Status = CmiCreateSubKey(RegistryHive, ParentKeyCellOffset, SubKeyName, VolatileKey, &NKBOffset);
310 if (!NT_SUCCESS(Status))
311 return Status;
312
313 /* Mark the parent cell as dirty */
314 HvMarkCellDirty(&RegistryHive->Hive, ParentKeyCellOffset, FALSE);
315
316 if (!CmpAddSubKey(&RegistryHive->Hive, ParentKeyCellOffset, NKBOffset))
317 {
318 /* FIXME: delete newly created cell */
319 // CmpFreeKeyByCell(&RegistryHive->Hive, NewCell /*NKBOffset*/, FALSE);
320 ASSERT(FALSE);
321 return STATUS_UNSUCCESSFUL;
322 }
323
324 /* Get the parent node */
325 ParentKeyCell = (PCM_KEY_NODE)HvGetCell(&RegistryHive->Hive, ParentKeyCellOffset);
326 if (!ParentKeyCell)
327 {
328 /* FIXME: delete newly created cell */
329 return STATUS_UNSUCCESSFUL;
330 }
331 VERIFY_KEY_CELL(ParentKeyCell);
332
333 /* Update the timestamp */
334 KeQuerySystemTime(&ParentKeyCell->LastWriteTime);
335
336 /* Check if we need to update name maximum, update it if so */
337 if (ParentKeyCell->MaxNameLen < SubKeyName->Length)
338 ParentKeyCell->MaxNameLen = SubKeyName->Length;
339
340 /* Release the cell */
341 HvReleaseCell(&RegistryHive->Hive, ParentKeyCellOffset);
342
343 *pBlockOffset = NKBOffset;
344 return STATUS_SUCCESS;
345}
LONG NTSTATUS
Definition: precomp.h:26
struct _CM_KEY_NODE * PCM_KEY_NODE
static NTSTATUS CmiCreateSubKey(IN PCMHIVE RegistryHive, IN HCELL_INDEX ParentKeyCellOffset, IN PCUNICODE_STRING SubKeyName, IN BOOLEAN VolatileKey, OUT HCELL_INDEX *pNKBOffset)
Definition: cmi.c:198
#define VERIFY_KEY_CELL(key)
Definition: cmi.h:29
BOOLEAN NTAPI CmpAddSubKey(IN PHHIVE Hive, IN HCELL_INDEX Parent, IN HCELL_INDEX Child)
Definition: cmindex.c:1465
#define HvReleaseCell(Hive, Cell)
Definition: cmlib.h:455
BOOLEAN CMAPI HvMarkCellDirty(PHHIVE RegistryHive, HCELL_INDEX CellOffset, BOOLEAN HoldingLock)
Definition: hivecell.c:109
#define HvGetCell(Hive, Cell)
Definition: cmlib.h:452
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
Status
Definition: gdiplustypes.h:25
ULONG HCELL_INDEX
Definition: hivedata.h:105
#define ASSERT(a)
Definition: mode.c:44
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
Definition: ndis.h:4725
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG MaxNameLen
Definition: cmdata.h:109
LARGE_INTEGER LastWriteTime
Definition: cmdata.h:94
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132

Referenced by RegpCreateOrOpenKey().

◆ CmiAddValueKey()

NTSTATUS CmiAddValueKey ( IN PCMHIVE  RegistryHive,
IN PCM_KEY_NODE  Parent,
IN ULONG  ChildIndex,
IN PCUNICODE_STRING  ValueName,
OUT PCM_KEY_VALUE pValueCell,
OUT HCELL_INDEX pValueCellOffset 
)

Definition at line 348 of file cmi.c.

355{
358 PCM_KEY_VALUE NewValueCell;
359 HCELL_INDEX NewValueCellOffset;
360
362
363 NewValueCellOffset = HvAllocateCell(&RegistryHive->Hive,
365 CmpNameSize(&RegistryHive->Hive, (PUNICODE_STRING)ValueName),
366 Storage,
367 HCELL_NIL);
368 if (NewValueCellOffset == HCELL_NIL)
369 {
371 }
372
373 NewValueCell = (PCM_KEY_VALUE)HvGetCell(&RegistryHive->Hive, NewValueCellOffset);
374 if (NewValueCell == NULL)
375 {
376 HvFreeCell(&RegistryHive->Hive, NewValueCellOffset);
378 }
379
380 NewValueCell->Signature = CM_KEY_VALUE_SIGNATURE;
381 NewValueCell->NameLength = CmpCopyName(&RegistryHive->Hive,
382 NewValueCell->Name,
384
385 /* Check for compressed name */
386 if (NewValueCell->NameLength < ValueName->Length)
387 {
388 /* This is a compressed name */
389 NewValueCell->Flags = VALUE_COMP_NAME;
390 }
391 else
392 {
393 /* No flags to set */
394 NewValueCell->Flags = 0;
395 }
396
397 NewValueCell->Type = 0;
398 NewValueCell->DataLength = 0;
399 NewValueCell->Data = HCELL_NIL;
400
401 HvMarkCellDirty(&RegistryHive->Hive, NewValueCellOffset, FALSE);
402
403 /* Check if we already have a value list */
404 if (Parent->ValueList.Count)
405 {
406 /* Then make sure it's valid and dirty it */
407 ASSERT(Parent->ValueList.List != HCELL_NIL);
408 HvMarkCellDirty(&RegistryHive->Hive, Parent->ValueList.List, FALSE);
409 }
410
411 /* Add this value cell to the child list */
412 Status = CmpAddValueToList(&RegistryHive->Hive,
413 NewValueCellOffset,
414 ChildIndex,
415 Storage,
416 &Parent->ValueList);
417
418 /* If we failed, free the entire cell, including the data */
419 if (!NT_SUCCESS(Status))
420 {
421 /* Overwrite the status with a known one */
422 CmpFreeValue(&RegistryHive->Hive, NewValueCellOffset);
424 }
425 else
426 {
427 *pValueCell = NewValueCell;
428 *pValueCellOffset = NewValueCellOffset;
430 }
431
432 return Status;
433}
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
struct _CM_KEY_VALUE * PCM_KEY_VALUE
#define KEY_IS_VOLATILE
Definition: cmdata.h:30
#define CM_KEY_VALUE_SIGNATURE
Definition: cmdata.h:24
#define VALUE_COMP_NAME
Definition: cmdata.h:44
USHORT NTAPI CmpCopyName(IN PHHIVE Hive, OUT PWCHAR Destination, IN PCUNICODE_STRING Source)
Definition: cmname.c:21
BOOLEAN NTAPI CmpFreeValue(IN PHHIVE Hive, IN HCELL_INDEX Cell)
Definition: cmvalue.c:73
USHORT NTAPI CmpNameSize(IN PHHIVE Hive, IN PCUNICODE_STRING Name)
Definition: cmname.c:74
VOID CMAPI HvFreeCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset)
Definition: hivecell.c:468
HCELL_INDEX CMAPI HvAllocateCell(PHHIVE RegistryHive, ULONG Size, HSTORAGE_TYPE Storage, IN HCELL_INDEX Vicinity)
NTSTATUS NTAPI CmpAddValueToList(IN PHHIVE Hive, IN HCELL_INDEX ValueCell, IN ULONG Index, IN HSTORAGE_TYPE StorageType, IN OUT PCHILD_LIST ChildList)
Definition: cmvalue.c:207
#define NULL
Definition: types.h:112
HSTORAGE_TYPE
Definition: hivedata.h:126
@ Volatile
Definition: hivedata.h:128
@ Stable
Definition: hivedata.h:127
#define HCELL_NIL
Definition: hivedata.h:110
static IStorage Storage
Definition: ole2.c:3548
USHORT Signature
Definition: cmdata.h:124
ULONG Type
Definition: cmdata.h:128
HCELL_INDEX Data
Definition: cmdata.h:127
WCHAR Name[ANYSIZE_ARRAY]
Definition: cmdata.h:131
USHORT NameLength
Definition: cmdata.h:125
USHORT Flags
Definition: cmdata.h:129
ULONG DataLength
Definition: cmdata.h:126
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243

Referenced by RegSetValueExW().

◆ CmiCreateSecurityKey()

NTSTATUS CmiCreateSecurityKey ( IN PHHIVE  Hive,
IN HCELL_INDEX  Cell,
IN PUCHAR  Descriptor,
IN ULONG  DescriptorLength 
)

Definition at line 157 of file cmi.c.

162{
163 HCELL_INDEX SecurityCell;
165 PCM_KEY_SECURITY Security;
166
167 Node = (PCM_KEY_NODE)HvGetCell(Hive, Cell);
168 SecurityCell = HvAllocateCell(Hive,
170 DescriptorLength,
171 Stable,
172 HCELL_NIL);
173 if (SecurityCell == HCELL_NIL)
174 {
175 HvReleaseCell(Hive, Cell);
177 }
178
179 Node->Security = SecurityCell;
180 Security = (PCM_KEY_SECURITY)HvGetCell(Hive, SecurityCell);
182 Security->ReferenceCount = 1;
183 Security->DescriptorLength = DescriptorLength;
184
185 RtlMoveMemory(&Security->Descriptor,
187 DescriptorLength);
188
189 Security->Flink = Security->Blink = SecurityCell;
190
191 HvReleaseCell(Hive, SecurityCell);
192 HvReleaseCell(Hive, Cell);
193
194 return STATUS_SUCCESS;
195}
#define CM_KEY_SECURITY_SIGNATURE
Definition: cmdata.h:23
struct _CM_KEY_SECURITY * PCM_KEY_SECURITY
union node Node
Definition: types.h:1255
ULONG DescriptorLength
Definition: cmdata.h:144
HCELL_INDEX Flink
Definition: cmdata.h:141
ULONG ReferenceCount
Definition: cmdata.h:143
HCELL_INDEX Blink
Definition: cmdata.h:142
USHORT Signature
Definition: cmdata.h:139
SECURITY_DESCRIPTOR_RELATIVE Descriptor
Definition: cmdata.h:145
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
Definition: dlist.c:348
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342

Referenced by ConnectRegistry().

◆ CmiInitializeHive()

NTSTATUS CmiInitializeHive ( IN OUT PCMHIVE  Hive,
IN PCWSTR  Name 
)

Definition at line 114 of file cmi.c.

117{
119
120 RtlZeroMemory(Hive, sizeof(*Hive));
121
122 DPRINT("Hive 0x%p\n", Hive);
123
124 Status = HvInitialize(&Hive->Hive,
128 0,
130 CmpFree,
135 1,
136 NULL);
137 if (!NT_SUCCESS(Status))
138 {
139 return Status;
140 }
141
142 // HACK: See the HACK from r31253
143 if (!CmCreateRootNode(&Hive->Hive, Name))
144 {
145 HvFree(&Hive->Hive);
147 }
148
149 /* Add the new hive to the hive list */
151 &Hive->HiveList);
152
153 return STATUS_SUCCESS;
154}
static BOOLEAN NTAPI CmpFileRead(IN PHHIVE RegistryHive, IN ULONG FileType, IN PULONG FileOffset, OUT PVOID Buffer, IN SIZE_T BufferLength)
Definition: cmi.c:56
static BOOLEAN NTAPI CmpFileWrite(IN PHHIVE RegistryHive, IN ULONG FileType, IN PULONG FileOffset, IN PVOID Buffer, IN SIZE_T BufferLength)
Definition: cmi.c:73
VOID NTAPI CmpFree(IN PVOID Ptr, IN ULONG Quota)
Definition: cmi.c:47
static BOOLEAN NTAPI CmpFileFlush(IN PHHIVE RegistryHive, IN ULONG FileType, PLARGE_INTEGER FileOffset, ULONG Length)
Definition: cmi.c:102
static BOOLEAN NTAPI CmpFileSetSize(IN PHHIVE RegistryHive, IN ULONG FileType, IN ULONG FileSize, IN ULONG OldFileSize)
Definition: cmi.c:90
PVOID NTAPI CmpAllocate(IN SIZE_T Size, IN BOOLEAN Paged, IN ULONG Tag)
Definition: cmi.c:37
NTSTATUS CMAPI HvInitialize(PHHIVE RegistryHive, ULONG OperationType, ULONG HiveFlags, ULONG FileType, PVOID HiveData OPTIONAL, PALLOCATE_ROUTINE Allocate, PFREE_ROUTINE Free, PFILE_SET_SIZE_ROUTINE FileSetSize, PFILE_WRITE_ROUTINE FileWrite, PFILE_READ_ROUTINE FileRead, PFILE_FLUSH_ROUTINE FileFlush, ULONG Cluster OPTIONAL, PCUNICODE_STRING FileName OPTIONAL)
VOID CMAPI HvFree(PHHIVE RegistryHive)
#define InsertTailList(ListHead, Entry)
#define HINIT_CREATE
Definition: hivedata.h:13
#define HFILE_TYPE_PRIMARY
Definition: hivedata.h:33
#define HIVE_NOLAZYFLUSH
Definition: hivedata.h:24
LIST_ENTRY CmiHiveListHead
Definition: registry.c:385
BOOLEAN CMAPI CmCreateRootNode(PHHIVE Hive, PCWSTR Name)
Definition: cminit.c:17
#define DPRINT
Definition: sndvol32.h:71
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

Referenced by ConnectRegistry(), and RegInitializeRegistry().