ReactOS 0.4.16-dev-1007-g2e85425
registry.h File Reference
#include <cmlib.h>
Include dependency graph for registry.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define HKEY_TO_HCI(hKey)   ((HCELL_INDEX)(ULONG_PTR)(hKey))
 
#define RegCloseKey(hKey)   (ERROR_SUCCESS)
 

Typedefs

typedef HANDLE HKEY
 
typedef HANDLEPHKEY
 

Functions

BOOLEAN RegImportBinaryHive (_In_ PVOID ChunkBase, _In_ ULONG ChunkSize, _In_ PCSTR SearchPath, _In_ BOOLEAN LoadAlternate)
 Imports the SYSTEM binary hive from the registry base chunk that's been provided by the loader block.
 
BOOLEAN RegInitCurrentControlSet (_In_ BOOLEAN LastKnownGood)
 
LONG RegOpenKey (_In_ HKEY ParentKey, _In_z_ PCWSTR KeyName, _Out_ PHKEY Key)
 
LONG RegQueryValue (_In_ HKEY Key, _In_z_ PCWSTR ValueName, _Out_opt_ PULONG Type, _Out_opt_ PUCHAR Data, _Inout_opt_ PULONG DataSize)
 

Variables

PHHIVE SystemHive
 
HKEY CurrentControlSetKey
 

Macro Definition Documentation

◆ HKEY_TO_HCI

#define HKEY_TO_HCI (   hKey)    ((HCELL_INDEX)(ULONG_PTR)(hKey))

Definition at line 28 of file registry.h.

◆ RegCloseKey

#define RegCloseKey (   hKey)    (ERROR_SUCCESS)

Definition at line 49 of file registry.h.

Typedef Documentation

◆ HKEY

typedef HANDLE HKEY

Definition at line 26 of file registry.h.

◆ PHKEY

typedef HANDLE * PHKEY

Definition at line 26 of file registry.h.

Function Documentation

◆ RegImportBinaryHive()

BOOLEAN RegImportBinaryHive ( _In_ PVOID  ChunkBase,
_In_ ULONG  ChunkSize,
_In_ PCSTR  SearchPath,
_In_ BOOLEAN  LoadAlternate 
)

Imports the SYSTEM binary hive from the registry base chunk that's been provided by the loader block.

Parameters
[in]ChunkBaseA pointer to the registry base chunk that serves for SYSTEM hive initialization.
[in]ChunkSizeThe size of the registry base chunk. This parameter refers to the actual size of the SYSTEM hive. This parameter is currently unused.
[in]LoadAlternateIf set to TRUE, the function will initialize the hive as an alternate hive, otherwise FALSE to initialize it as primary.
Returns
Returns TRUE if hive importing and initialization have succeeded, FALSE otherwise.

Definition at line 436 of file registry.c.

441{
443 PCM_KEY_NODE KeyNode;
444
445 TRACE("RegImportBinaryHive(%p, 0x%lx)\n", ChunkBase, ChunkSize);
446
447 /* Assume that we don't need boot recover, unless we have to */
448 ((PHBASE_BLOCK)ChunkBase)->BootRecover = HBOOT_NO_BOOT_RECOVER;
449
450 /* Allocate and initialize the hive */
451 CmSystemHive = FrLdrTempAlloc(sizeof(CMHIVE), 'eviH');
452 Success = RegInitializeHive(CmSystemHive, ChunkBase, LoadAlternate);
453 if (!Success)
454 {
455 /* Free the buffer and retry again */
458
459 if (!RegRecoverHeaderHive(ChunkBase, SearchPath, "SYSTEM"))
460 {
461 ERR("Failed to recover the hive header block\n");
462 return FALSE;
463 }
464
465 if (!RegRecoverDataHive(ChunkBase, SearchPath, "SYSTEM"))
466 {
467 ERR("Failed to recover the hive data\n");
468 return FALSE;
469 }
470
471 /* Now retry initializing the hive again */
472 CmSystemHive = FrLdrTempAlloc(sizeof(CMHIVE), 'eviH');
473 Success = RegInitializeHive(CmSystemHive, ChunkBase, LoadAlternate);
474 if (!Success)
475 {
476 ERR("Corrupted hive (despite recovery) %p\n", ChunkBase);
478 return FALSE;
479 }
480
481 /*
482 * Acknowledge the kernel we recovered the SYSTEM hive
483 * on our side by applying log data.
484 */
485 ((PHBASE_BLOCK)ChunkBase)->BootRecover = HBOOT_BOOT_RECOVERED_BY_HIVE_LOG;
486 }
487
488 /* Save the root key node */
492
493 /* Verify it is accessible */
495 ASSERT(KeyNode);
498
499 return TRUE;
500}
unsigned char BOOLEAN
#define ERR(fmt,...)
Definition: precomp.h:57
VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
Definition: heap.c:553
PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
Definition: heap.c:545
static BOOLEAN RegRecoverHeaderHive(_Inout_ PVOID ChunkBase, _In_ PCSTR DirectoryPath, _In_ PCSTR LogName)
Recovers the header base block of a flat registry hive.
Definition: registry.c:277
#define GET_HHIVE(CmHive)
Definition: registry.c:41
static PCMHIVE CmSystemHive
Definition: registry.c:30
PHHIVE SystemHive
Definition: registry.c:33
static HCELL_INDEX SystemRootCell
Definition: registry.c:31
static BOOLEAN RegInitializeHive(_In_ PCMHIVE CmHive, _In_ PVOID ChunkBase, _In_ BOOLEAN LoadAlternate)
Initializes a flat hive descriptor for the hive and validates the registry hive. Volatile data is pur...
Definition: registry.c:96
static BOOLEAN RegRecoverDataHive(_Inout_ PVOID ChunkBase, _In_ PCSTR DirectoryPath, _In_ PCSTR LogName)
Recovers the corrupt data of a primary flat registry hive.
Definition: registry.c:350
struct _CM_KEY_NODE * PCM_KEY_NODE
#define CM_KEY_NODE_SIGNATURE
Definition: cmdata.h:21
#define HvReleaseCell(Hive, Cell)
Definition: cmlib.h:460
#define HvGetCell(Hive, Cell)
Definition: cmlib.h:457
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
@ Success
Definition: eventcreate.c:712
#define HCELL_NIL
Definition: hivedata.h:110
#define HBOOT_BOOT_RECOVERED_BY_HIVE_LOG
Definition: hivedata.h:95
#define HBOOT_NO_BOOT_RECOVER
Definition: hivedata.h:94
struct _HBASE_BLOCK * PHBASE_BLOCK
#define ASSERT(a)
Definition: mode.c:44
#define TRACE(s)
Definition: solgame.cpp:4
Definition: cmlib.h:316
USHORT Signature
Definition: cmdata.h:92
HCELL_INDEX RootCell
Definition: hivedata.h:168
PHBASE_BLOCK BaseBlock
Definition: hivedata.h:328
#define SearchPath
Definition: winbase.h:3931
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR _Out_ PULONG ChunkSize
Definition: rtlfuncs.h:2294

Referenced by WinLdrInitSystemHive().

◆ RegInitCurrentControlSet()

BOOLEAN RegInitCurrentControlSet ( _In_ BOOLEAN  LastKnownGood)

Definition at line 503 of file registry.c.

505{
506 UNICODE_STRING ControlSetName;
507 HCELL_INDEX ControlCell;
508 PCM_KEY_NODE KeyNode;
509 BOOLEAN AutoSelect;
510
511 TRACE("RegInitCurrentControlSet\n");
512
513 /* Choose which control set to open and set it as the new "Current" */
514 RtlInitUnicodeString(&ControlSetName,
515 LastKnownGood ? L"LastKnownGood"
516 : L"Default");
517
518 ControlCell = CmpFindControlSet(SystemHive,
520 &ControlSetName,
521 &AutoSelect);
522 if (ControlCell == HCELL_NIL)
523 {
524 ERR("CmpFindControlSet('%wZ') failed\n", &ControlSetName);
525 return FALSE;
526 }
527
528 CurrentControlSetKey = HCI_TO_HKEY(ControlCell);
529
530 /* Verify it is accessible */
531 KeyNode = (PCM_KEY_NODE)HvGetCell(SystemHive, ControlCell);
532 ASSERT(KeyNode);
534 HvReleaseCell(SystemHive, ControlCell);
535
536 return TRUE;
537}
HKEY CurrentControlSetKey
Definition: registry.c:34
#define HCI_TO_HKEY(CellIndex)
Definition: registry.c:36
HCELL_INDEX NTAPI CmpFindControlSet(_In_ PHHIVE SystemHive, _In_ HCELL_INDEX RootCell, _In_ PCUNICODE_STRING SelectKeyName, _Out_ PBOOLEAN AutoSelect)
Finds the corresponding "HKLM\SYSTEM\ControlSetXXX" system control set registry key,...
Definition: cmboot.c:84
ULONG HCELL_INDEX
Definition: hivedata.h:105
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define L(x)
Definition: ntvdm.h:50

Referenced by WinLdrInitSystemHive().

◆ RegOpenKey()

LONG RegOpenKey ( _In_ HKEY  ParentKey,
_In_z_ PCWSTR  KeyName,
_Out_ PHKEY  Key 
)

Definition at line 654 of file registry.c.

658{
659 UNICODE_STRING RemainingPath, SubKeyName;
660 UNICODE_STRING CurrentControlSet = RTL_CONSTANT_STRING(L"CurrentControlSet");
662 PCM_KEY_NODE KeyNode;
663 HCELL_INDEX CellIndex;
664
665 TRACE("RegOpenKey(%p, '%S', %p)\n", ParentKey, KeyName, Key);
666
667 /* Initialize the remaining path name */
668 RtlInitUnicodeString(&RemainingPath, KeyName);
669
670 /* Check if we have a parent key */
671 if (ParentKey == NULL)
672 {
673 UNICODE_STRING SubKeyName1, SubKeyName2, SubKeyName3;
675 UNICODE_STRING MachinePath = RTL_CONSTANT_STRING(L"MACHINE");
676 UNICODE_STRING SystemPath = RTL_CONSTANT_STRING(L"SYSTEM");
677
678 TRACE("RegOpenKey: absolute path\n");
679
680 if ((RemainingPath.Length < sizeof(WCHAR)) ||
681 RemainingPath.Buffer[0] != '\\')
682 {
683 /* The key path is not absolute */
684 ERR("RegOpenKey: invalid path '%S' (%wZ)\n", KeyName, &RemainingPath);
686 }
687
688 /* Skip initial path separator */
689 RemainingPath.Buffer++;
690 RemainingPath.Length -= sizeof(WCHAR);
691
692 /* Get the first 3 path elements */
693 GetNextPathElement(&SubKeyName1, &RemainingPath);
694 GetNextPathElement(&SubKeyName2, &RemainingPath);
695 GetNextPathElement(&SubKeyName3, &RemainingPath);
696 TRACE("RegOpenKey: %wZ / %wZ / %wZ\n", &SubKeyName1, &SubKeyName2, &SubKeyName3);
697
698 /* Check if we have the correct path */
699 if (!RtlEqualUnicodeString(&SubKeyName1, &RegistryPath, TRUE) ||
700 !RtlEqualUnicodeString(&SubKeyName2, &MachinePath, TRUE) ||
701 !RtlEqualUnicodeString(&SubKeyName3, &SystemPath, TRUE))
702 {
703 /* The key path is not inside HKLM\Machine\System */
704 ERR("RegOpenKey: invalid path '%S' (%wZ)\n", KeyName, &RemainingPath);
706 }
707
708 /* Use the root key */
709 CellIndex = SystemRootCell;
710 }
711 else
712 {
713 /* Use the parent key */
714 CellIndex = HKEY_TO_HCI(ParentKey);
715 }
716
717 /* Check if this is the root key */
718 if (CellIndex == SystemRootCell)
719 {
720 UNICODE_STRING TempPath = RemainingPath;
721
722 /* Get the first path element */
723 GetNextPathElement(&SubKeyName, &TempPath);
724
725 /* Check if this is CurrentControlSet */
726 if (RtlEqualUnicodeString(&SubKeyName, &CurrentControlSet, TRUE))
727 {
728 /* Use the CurrentControlSetKey and update the remaining path */
730 RemainingPath = TempPath;
731 }
732 }
733
734 /* Get the key node */
735 KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, CellIndex);
736 ASSERT(KeyNode);
738
739 TRACE("RegOpenKey: RemainingPath '%wZ'\n", &RemainingPath);
740
741 /* Loop while there are path elements */
742 while (GetNextPathElement(&SubKeyName, &RemainingPath))
743 {
744 HCELL_INDEX NextCellIndex;
745
746 TRACE("RegOpenKey: next element '%wZ'\n", &SubKeyName);
747
748 /* Get the next sub key */
749 NextCellIndex = CmpFindSubKeyByName(Hive, KeyNode, &SubKeyName);
750 HvReleaseCell(Hive, CellIndex);
751 CellIndex = NextCellIndex;
752 if (CellIndex == HCELL_NIL)
753 {
754 WARN("Did not find sub key '%wZ' (full: %S)\n", &SubKeyName, KeyName);
756 }
757
758 /* Get the found key */
759 KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, CellIndex);
760 ASSERT(KeyNode);
762 }
763
764 HvReleaseCell(Hive, CellIndex);
765 *Key = HCI_TO_HKEY(CellIndex);
766
767 return ERROR_SUCCESS;
768}
#define WARN(fmt,...)
Definition: precomp.h:61
static BOOLEAN GetNextPathElement(_Out_ PUNICODE_STRING NextElement, _Inout_ PUNICODE_STRING RemainingPath)
Definition: registry.c:541
#define GET_HHIVE_FROM_HKEY(hKey)
Definition: registry.c:42
#define HKEY_TO_HCI(hKey)
Definition: registry.h:28
HCELL_INDEX NTAPI CmpFindSubKeyByName(IN PHHIVE Hive, IN PCM_KEY_NODE Parent, IN PCUNICODE_STRING SearchName)
Definition: cmindex.c:683
#define ERROR_SUCCESS
Definition: deptool.c:10
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
Definition: ndis.h:4725
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_opt_ WDFKEY ParentKey
Definition: wdfregistry.h:69
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ RegQueryValue()

LONG RegQueryValue ( _In_ HKEY  Key,
_In_z_ PCWSTR  ValueName,
_Out_opt_ PULONG  Type,
_Out_opt_ PUCHAR  Data,
_Inout_opt_ PULONG  DataSize 
)

Definition at line 809 of file registry.c.

815{
817 PCM_KEY_NODE KeyNode;
818 PCM_KEY_VALUE ValueCell;
819 HCELL_INDEX CellIndex;
820 UNICODE_STRING ValueNameString;
821
822 TRACE("RegQueryValue(%p, '%S', %p, %p, %p)\n",
824
825 /* Get the key node */
826 KeyNode = GET_CM_KEY_NODE(Hive, Key);
827 ASSERT(KeyNode);
829
830 /* Initialize value name string */
831 RtlInitUnicodeString(&ValueNameString, ValueName);
832 CellIndex = CmpFindValueByName(Hive, KeyNode, &ValueNameString);
833 if (CellIndex == HCELL_NIL)
834 {
835 TRACE("RegQueryValue value not found in key (%.*s)\n",
836 KeyNode->NameLength, KeyNode->Name);
839 }
841
842 /* Get the value cell */
843 ValueCell = (PCM_KEY_VALUE)HvGetCell(Hive, CellIndex);
844 ASSERT(ValueCell != NULL);
845
846 RepGetValueData(Hive, ValueCell, Type, Data, DataSize);
847
848 HvReleaseCell(Hive, CellIndex);
849
850 return ERROR_SUCCESS;
851}
Type
Definition: Type.h:7
#define GET_CM_KEY_NODE(hHive, hKey)
Definition: registry.c:43
struct _CM_KEY_VALUE * PCM_KEY_VALUE
HCELL_INDEX NTAPI CmpFindValueByName(IN PHHIVE Hive, IN PCM_KEY_NODE KeyNode, IN PCUNICODE_STRING Name)
Definition: cmvalue.c:99
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
Definition: ndis.h:4755
static VOID RepGetValueData(IN PHHIVE Hive, IN PCM_KEY_VALUE ValueCell, OUT PULONG Type OPTIONAL, OUT PUCHAR Data OPTIONAL, IN OUT PULONG DataSize OPTIONAL)
Definition: registry.c:824
WCHAR Name[ANYSIZE_ARRAY]
Definition: cmdata.h:116
USHORT NameLength
Definition: cmdata.h:114
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243

Variable Documentation

◆ CurrentControlSetKey

◆ SystemHive