81 ERR(
"Corrupted hive %p!\n", ChunkBase);
88 TRACE(
"RegImportBinaryHive done\n");
96 WCHAR ControlSetKeyName[80];
100 ULONG DefaultSet = 0;
101 ULONG LastKnownGoodSet = 0;
104 TRACE(
"RegInitCurrentControlSet\n");
107 L"\\Registry\\Machine\\SYSTEM\\Select",
111 ERR(
"RegOpenKey() failed (Error %u)\n", (
int)
Error);
123 ERR(
"RegQueryValue('Default') failed (Error %u)\n", (
int)
Error);
131 (
PUCHAR)&LastKnownGoodSet,
135 ERR(
"RegQueryValue('LastKnownGood') failed (Error %u)\n", (
int)
Error);
139 CurrentSet = (LastKnownGood) ? LastKnownGoodSet : DefaultSet;
140 wcscpy(ControlSetKeyName,
L"ControlSet");
144 wcscat(ControlSetKeyName,
L"001");
147 wcscat(ControlSetKeyName,
L"002");
150 wcscat(ControlSetKeyName,
L"003");
153 wcscat(ControlSetKeyName,
L"004");
156 wcscat(ControlSetKeyName,
L"005");
161 L"\\Registry\\Machine\\SYSTEM",
165 ERR(
"RegOpenKey(SystemKey) failed (Error %lu)\n",
Error);
174 ERR(
"RegOpenKey(CurrentControlSetKey) failed (Error %lu)\n",
Error);
178 TRACE(
"RegInitCurrentControlSet done\n");
189 if (RemainingPath->Length <
sizeof(
WCHAR))
196 NextElement->Buffer = RemainingPath->Buffer;
199 while ((RemainingPath->Length >=
sizeof(
WCHAR)) &&
200 (RemainingPath->Buffer[0] !=
'\\'))
203 RemainingPath->Buffer++;
204 RemainingPath->Length -=
sizeof(
WCHAR);
207 NextElement->Length = (
USHORT)(RemainingPath->Buffer - NextElement->Buffer) *
sizeof(
WCHAR);
208 NextElement->MaximumLength = NextElement->Length;
211 if (RemainingPath->Length >=
sizeof(
WCHAR))
214 ASSERT(RemainingPath->Buffer[0] ==
'\\');
215 RemainingPath->Buffer++;
216 RemainingPath->Length -=
sizeof(
WCHAR);
236 TRACE(
"RegEnumKey(%p, %lu, %p, %p->%u)\n",
246 TRACE(
"RegEnumKey index out of bounds (%d) in key (%.*s)\n",
275 if (*NameSize >= NameLength +
sizeof(
WCHAR))
280 *NameSize = NameLength +
sizeof(
WCHAR);
285 *SubKey = (
HKEY)SubKeyNode;
287 TRACE(
"RegEnumKey done -> %u, '%.*S'\n", *NameSize, *NameSize,
Name);
317 TRACE(
"RegOpenKey: absolute path\n");
320 RemainingPath.
Buffer[0] !=
'\\')
323 ERR(
"RegOpenKey: invalid path '%S' (%wZ)\n",
KeyName, &RemainingPath);
335 TRACE(
"RegOpenKey: %wZ / %wZ / %wZ\n", &SubKeyName1, &SubKeyName2, &SubKeyName3);
343 ERR(
"RegOpenKey: invalid path '%S' (%wZ)\n",
KeyName, &RemainingPath);
366 RemainingPath = TempPath;
370 TRACE(
"RegOpenKey: RemainingPath '%wZ'\n", &RemainingPath);
392 TRACE(
"RegOpenKey done\n");
410 *
Type = ValueCell->Type;
448 TRACE(
"RegQueryValue(%p, '%S', %p, %p, %p)\n",
460 TRACE(
"RegQueryValue value not found in key (%.*s)\n",
473 TRACE(
"RegQueryValue success\n");
499 TRACE(
"RegEnumValue(%p, %lu, %S, %p, %p, %p, %p (%lu))\n",
511 ERR(
"RegEnumValue: index invalid\n");
542 if (*NameSize >= NameLength +
sizeof(
WCHAR))
547 *NameSize = NameLength +
sizeof(
WCHAR);
554 TRACE(
"RegEnumValue done -> %u, '%.*S'\n", *NameSize, *NameSize,
ValueName);
#define CM_KEY_VALUE_SIGNATURE
static PCM_KEY_NODE RootKeyNode
WCHAR Name[ANYSIZE_ARRAY]
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ PNDIS_STRING SubKeyName
#define ERROR_NO_MORE_ITEMS
#define UNREFERENCED_PARAMETER(P)
BOOLEAN RegImportBinaryHive(_In_ PVOID ChunkBase, _In_ ULONG ChunkSize)
#define CM_KEY_NODE_SIGNATURE
VOID NTAPI CmpFree(IN PVOID Ptr, IN ULONG Quota)
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)
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
#define HvReleaseCell(h, c)
LONG RegQueryValue(_In_ HKEY Key, _In_z_ PCWSTR ValueName, _Out_opt_ PULONG Type, _Out_opt_ PUCHAR Data, _Inout_opt_ PULONG DataSize)
HCELL_INDEX NTAPI CmpFindSubKeyByNumber(IN PHHIVE Hive, IN PCM_KEY_NODE Node, IN ULONG Number)
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
PVOID NTAPI CmpAllocate(IN SIZE_T Size, IN BOOLEAN Paged, IN ULONG Tag)
IN PVOID IN PVOID IN USHORT IN USHORT Size
LONG RegEnumKey(_In_ HKEY Key, _In_ ULONG Index, _Out_ PWCHAR Name, _Inout_ PULONG NameSize, _Out_opt_ PHKEY SubKey)
LONG RegInitCurrentControlSet(_In_ BOOLEAN LastKnownGood)
struct _CELL_DATA * PCELL_DATA
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static HKEY CurrentControlSetKey
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR _Out_ PULONG ChunkSize
VOID NTAPI CmpCopyCompressedName(OUT PWCHAR Destination, IN ULONG DestinationLength, IN PWCHAR Source, IN ULONG SourceLength)
PVOID CMAPI HvGetCell(PHHIVE RegistryHive, HCELL_INDEX CellOffset)
WCHAR Name[ANYSIZE_ARRAY]
FORCEINLINE PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
struct _CM_KEY_NODE * PCM_KEY_NODE
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
#define ERROR_FILE_NOT_FOUND
DBG_DEFAULT_CHANNEL(REGISTRY)
PCELL_DATA NTAPI CmpValueToData(IN PHHIVE Hive, IN PCM_KEY_VALUE Value, OUT PULONG Length)
HCELL_INDEX NTAPI CmpFindValueByName(IN PHHIVE Hive, IN PCM_KEY_NODE KeyNode, IN PUNICODE_STRING Name)
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
HCELL_INDEX KeyList[ANYSIZE_ARRAY]
static VOID RepGetValueData(_In_ PHHIVE Hive, _In_ PCM_KEY_VALUE ValueCell, _Out_opt_ PULONG Type, _Out_opt_ PUCHAR Data, _Inout_opt_ PULONG DataSize)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
_Must_inspect_result_ _In_opt_ WDFKEY ParentKey
struct _CM_KEY_VALUE * PCM_KEY_VALUE
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlCopyMemory(Destination, Source, Length)
#define ERROR_PATH_NOT_FOUND
HCELL_INDEX NTAPI CmpFindSubKeyByName(IN PHHIVE Hive, IN PCM_KEY_NODE Parent, IN PCUNICODE_STRING SearchName)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
USHORT NTAPI CmpCompressedNameSize(IN PWCHAR Name, IN ULONG Length)
_In_ NDIS_STATUS _In_ ULONG _In_ USHORT _In_opt_ PVOID _In_ ULONG DataSize
LONG RegOpenKey(_In_ HKEY ParentKey, _In_z_ PCWSTR KeyName, _Out_ PHKEY Key)
static BOOLEAN GetNextPathElement(_Out_ PUNICODE_STRING NextElement, _Inout_ PUNICODE_STRING RemainingPath)
#define RTL_CONSTANT_STRING(s)
FORCEINLINE VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)