https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2b3197783833d322fd3929db074500b253496502
commit 2b3197783833d322fd3929db074500b253496502 Author: Hermès Bélusca-Maïto <[email protected]> AuthorDate: Fri Nov 19 03:55:15 2021 +0100 Commit: Hermès Bélusca-Maïto <[email protected]> CommitDate: Fri Nov 19 03:55:21 2021 +0100 [FREELDR] Add RegCloseKey() and use it where registry keys need to be closed. Actually, RegCloseKey() is here a dummy macro that just "returns" success. Indeed, the internal implementation of RegOpenKey() doesn't really allocate internal structures: it just returns a "pointer" to already existing allocated data. Therefore nothing needs to be closed/freed later on. --- boot/freeldr/freeldr/ntldr/registry.c | 15 +++- boot/freeldr/freeldr/ntldr/registry.h | 7 ++ boot/freeldr/freeldr/ntldr/winldr.c | 4 ++ boot/freeldr/freeldr/ntldr/wlregistry.c | 121 +++++++++++++++++--------------- 4 files changed, 89 insertions(+), 58 deletions(-) diff --git a/boot/freeldr/freeldr/ntldr/registry.c b/boot/freeldr/freeldr/ntldr/registry.c index 70a2f2eaa0e..07438b52423 100644 --- a/boot/freeldr/freeldr/ntldr/registry.c +++ b/boot/freeldr/freeldr/ntldr/registry.c @@ -58,6 +58,7 @@ RegImportBinaryHive( _In_ ULONG ChunkSize) { NTSTATUS Status; + TRACE("RegImportBinaryHive(%p, 0x%lx)\n", ChunkBase, ChunkSize); /* Allocate and initialize the hive */ @@ -77,8 +78,8 @@ RegImportBinaryHive( NULL); if (!NT_SUCCESS(Status)) { - CmpFree(CmHive, 0); ERR("Corrupted hive %p!\n", ChunkBase); + CmpFree(CmHive, 0); return FALSE; } @@ -101,6 +102,7 @@ RegInitCurrentControlSet( ULONG LastKnownGoodSet = 0; ULONG DataSize; LONG Error; + TRACE("RegInitCurrentControlSet\n"); Error = RegOpenKey(NULL, @@ -121,6 +123,7 @@ RegInitCurrentControlSet( if (Error != ERROR_SUCCESS) { ERR("RegQueryValue('Default') failed (Error %u)\n", (int)Error); + RegCloseKey(SelectKey); return Error; } @@ -133,9 +136,12 @@ RegInitCurrentControlSet( if (Error != ERROR_SUCCESS) { ERR("RegQueryValue('LastKnownGood') failed (Error %u)\n", (int)Error); + RegCloseKey(SelectKey); return Error; } + RegCloseKey(SelectKey); + CurrentSet = (LastKnownGood) ? LastKnownGoodSet : DefaultSet; wcscpy(ControlSetKeyName, L"ControlSet"); switch(CurrentSet) @@ -169,6 +175,9 @@ RegInitCurrentControlSet( Error = RegOpenKey(SystemKey, ControlSetKeyName, &CurrentControlSetKey); + + RegCloseKey(SystemKey); + if (Error != ERROR_SUCCESS) { ERR("RegOpenKey(CurrentControlSetKey) failed (Error %lu)\n", Error); @@ -283,6 +292,8 @@ RegEnumKey( if (SubKey != NULL) *SubKey = (HKEY)SubKeyNode; + // else + // RegCloseKey((HKEY)SubKeyNode); TRACE("RegEnumKey done -> %u, '%.*S'\n", *NameSize, *NameSize, Name); return ERROR_SUCCESS; @@ -299,6 +310,7 @@ RegOpenKey( PHHIVE Hive = &CmHive->Hive; PCM_KEY_NODE KeyNode; HCELL_INDEX CellIndex; + TRACE("RegOpenKey(%p, '%S', %p)\n", ParentKey, KeyName, Key); /* Initialize the remaining path name */ @@ -314,6 +326,7 @@ RegOpenKey( UNICODE_STRING RegistryPath = RTL_CONSTANT_STRING(L"Registry"); UNICODE_STRING MachinePath = RTL_CONSTANT_STRING(L"MACHINE"); UNICODE_STRING SystemPath = RTL_CONSTANT_STRING(L"SYSTEM"); + TRACE("RegOpenKey: absolute path\n"); if ((RemainingPath.Length < sizeof(WCHAR)) || diff --git a/boot/freeldr/freeldr/ntldr/registry.h b/boot/freeldr/freeldr/ntldr/registry.h index b59cce682f4..8368749339d 100644 --- a/boot/freeldr/freeldr/ntldr/registry.h +++ b/boot/freeldr/freeldr/ntldr/registry.h @@ -32,6 +32,13 @@ LONG RegInitCurrentControlSet( _In_ BOOLEAN LastKnownGood); +/* + * LONG + * RegCloseKey( + * _In_ HKEY hKey); + */ +#define RegCloseKey(hKey) (ERROR_SUCCESS) + LONG RegEnumKey( _In_ HKEY Key, diff --git a/boot/freeldr/freeldr/ntldr/winldr.c b/boot/freeldr/freeldr/ntldr/winldr.c index a4238a4555a..e1b97336281 100644 --- a/boot/freeldr/freeldr/ntldr/winldr.c +++ b/boot/freeldr/freeldr/ntldr/winldr.c @@ -445,6 +445,7 @@ WinLdrDetectVersion(VOID) /* Key doesn't exist; assume NT 4.0 */ return _WIN32_WINNT_NT4; } + RegCloseKey(hKey); /* We may here want to read the value of ProductVersion */ return _WIN32_WINNT_WS03; @@ -739,11 +740,14 @@ WinLdrInitErrataInf( if (rc != ERROR_SUCCESS) { WARN("Could not retrieve the InfName value (Error %u)\n", (int)rc); + RegCloseKey(hKey); return FALSE; } // TODO: "SystemBiosDate" + RegCloseKey(hKey); + RtlStringCbPrintfA(ErrataFilePath, sizeof(ErrataFilePath), "%s%s%S", SystemRoot, "inf\\", szFileName); diff --git a/boot/freeldr/freeldr/ntldr/wlregistry.c b/boot/freeldr/freeldr/ntldr/wlregistry.c index 7d9d9219183..83bbda92f84 100644 --- a/boot/freeldr/freeldr/ntldr/wlregistry.c +++ b/boot/freeldr/freeldr/ntldr/wlregistry.c @@ -54,7 +54,6 @@ WinLdrLoadSystemHive( if (Status != ESUCCESS) { WARN("Error while opening '%s', Status: %u\n", FullHiveName, Status); - UiMessageBox("Opening hive file failed!"); return FALSE; } @@ -62,8 +61,8 @@ WinLdrLoadSystemHive( Status = ArcGetFileInformation(FileId, &FileInfo); if (Status != ESUCCESS) { + WARN("Hive file has 0 size!"); ArcClose(FileId); - UiMessageBox("Hive file has 0 size!"); return FALSE; } HiveFileSize = FileInfo.EndingAddress.LowPart; @@ -75,8 +74,8 @@ WinLdrLoadSystemHive( if (HiveDataPhysical == NULL) { + WARN("Could not alloc memory for hive!"); ArcClose(FileId); - UiMessageBox("Unable to alloc memory for a hive!"); return FALSE; } @@ -91,9 +90,8 @@ WinLdrLoadSystemHive( Status = ArcRead(FileId, HiveDataPhysical, HiveFileSize, &BytesRead); if (Status != ESUCCESS) { - ArcClose(FileId); WARN("Error while reading '%s', Status: %u\n", FullHiveName, Status); - UiMessageBox("Unable to read from hive file!"); + ArcClose(FileId); return FALSE; } @@ -102,17 +100,17 @@ WinLdrLoadSystemHive( if (FsService) { BOOLEAN Success; - TRACE(" Adding filesystem service %S\n", FsService); + TRACE("Adding filesystem service %S\n", FsService); Success = WinLdrAddDriverToList(&LoaderBlock->BootDriverListHead, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\", NULL, (PWSTR)FsService); if (!Success) - TRACE(" Failed to add filesystem service\n"); + TRACE("Failed to add filesystem service\n"); } else { - TRACE(" No required filesystem service\n"); + TRACE("No required filesystem service\n"); } ArcClose(FileId); @@ -147,10 +145,11 @@ WinLdrInitSystemHive( TRACE("WinLdrInitSystemHive: loading hive %s%s\n", SearchPath, HiveName); Success = WinLdrLoadSystemHive(LoaderBlock, SearchPath, HiveName); - - /* Fail if failed... */ if (!Success) + { + UiMessageBox("Could not load %s hive!", HiveName); return FALSE; + } /* Import what was loaded */ Success = RegImportBinaryHive(VaToPa(LoaderBlock->RegistryBase), LoaderBlock->RegistryLength); @@ -220,8 +219,8 @@ WinLdrGetNLSNames(PSTR AnsiName, /* Open the CodePage key */ rc = RegOpenKey(NULL, - L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage", - &hKey); + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage", + &hKey); if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "Couldn't open CodePage registry key"); @@ -234,6 +233,7 @@ WinLdrGetNLSNames(PSTR AnsiName, if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "Couldn't get ACP NLS setting"); + RegCloseKey(hKey); return FALSE; } @@ -242,6 +242,7 @@ WinLdrGetNLSNames(PSTR AnsiName, if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "ACP NLS Setting exists, but isn't readable"); + //RegCloseKey(hKey); //return FALSE; wcscpy(NameBuffer, L"c_1252.nls"); // HACK: ReactOS bug CORE-6105 } @@ -253,6 +254,7 @@ WinLdrGetNLSNames(PSTR AnsiName, if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "Couldn't get OEMCP NLS setting"); + RegCloseKey(hKey); return FALSE; } @@ -261,15 +263,18 @@ WinLdrGetNLSNames(PSTR AnsiName, if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "OEMCP NLS setting exists, but isn't readable"); + //RegCloseKey(hKey); //return FALSE; wcscpy(NameBuffer, L"c_437.nls"); // HACK: ReactOS bug CORE-6105 } sprintf(OemName, "%S", NameBuffer); + RegCloseKey(hKey); + /* Open the Language key */ rc = RegOpenKey(NULL, - L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language", - &hKey); + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\Language", + &hKey); if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "Couldn't open Language registry key"); @@ -282,6 +287,7 @@ WinLdrGetNLSNames(PSTR AnsiName, if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "Couldn't get Language Default setting"); + RegCloseKey(hKey); return FALSE; } @@ -290,10 +296,12 @@ WinLdrGetNLSNames(PSTR AnsiName, if (rc != ERROR_SUCCESS) { //RtlStringCbCopyA(szErrorOut, sizeof(szErrorOut), "Language Default setting exists, but isn't readable"); + RegCloseKey(hKey); return FALSE; } sprintf(LangName, "%S", NameBuffer); + RegCloseKey(hKey); return TRUE; } @@ -482,8 +490,8 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, IN PCSTR SystemRoot) { LONG rc = 0; - HKEY hGroupKey, hOrderKey, hServiceKey, hDriverKey; - PWSTR GroupNameBuffer; + HKEY hOrderKey, hServiceKey, hGroupKey, hDriverKey; + PWSTR GroupNameBuffer = NULL; WCHAR ServiceName[256]; ULONG OrderList[128]; ULONG BufferSize; @@ -503,51 +511,53 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, BOOLEAN Success; - /* get 'service group order' key */ + /* Get 'group order list' key */ rc = RegOpenKey(NULL, - L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder", - &hGroupKey); - if (rc != ERROR_SUCCESS) { - - TRACE_CH(REACTOS, "Failed to open the 'ServiceGroupOrder' key (rc %d)\n", (int)rc); + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\GroupOrderList", + &hOrderKey); + if (rc != ERROR_SUCCESS) + { + TRACE_CH(REACTOS, "Failed to open the 'GroupOrderList' key (rc %d)\n", (int)rc); return; } - /* get 'group order list' key */ + /* Get 'services' key */ rc = RegOpenKey(NULL, - L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\GroupOrderList", - &hOrderKey); - if (rc != ERROR_SUCCESS) { - - TRACE_CH(REACTOS, "Failed to open the 'GroupOrderList' key (rc %d)\n", (int)rc); + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services", + &hServiceKey); + if (rc != ERROR_SUCCESS) + { + TRACE_CH(REACTOS, "Failed to open the 'Services' key (rc %d)\n", (int)rc); + RegCloseKey(hOrderKey); return; } - /* enumerate drivers */ + /* Get 'service group order' key */ rc = RegOpenKey(NULL, - L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services", - &hServiceKey); - if (rc != ERROR_SUCCESS) { - - TRACE_CH(REACTOS, "Failed to open the 'Services' key (rc %d)\n", (int)rc); - return; + L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\ServiceGroupOrder", + &hGroupKey); + if (rc != ERROR_SUCCESS) + { + TRACE_CH(REACTOS, "Failed to open the 'ServiceGroupOrder' key (rc %d)\n", (int)rc); + goto Quit; } - /* Get the Name Group */ + /* Get the Group Order List */ BufferSize = 4096; GroupNameBuffer = FrLdrHeapAlloc(BufferSize, TAG_WLDR_NAME); if (!GroupNameBuffer) { TRACE_CH(REACTOS, "Failed to allocate buffer\n"); - return; + RegCloseKey(hGroupKey); + goto Quit; } rc = RegQueryValue(hGroupKey, L"List", NULL, (PUCHAR)GroupNameBuffer, &BufferSize); - TRACE_CH(REACTOS, "RegQueryValue(): rc %d\n", (int)rc); + RegCloseKey(hGroupKey); + if (rc != ERROR_SUCCESS) { TRACE_CH(REACTOS, "Failed to query the 'List' value (rc %d)\n", (int)rc); - FrLdrHeapFree(GroupNameBuffer, TAG_WLDR_NAME); - return; + goto Quit; } TRACE_CH(REACTOS, "BufferSize: %d\n", (int)BufferSize); TRACE_CH(REACTOS, "GroupNameBuffer: '%S'\n", GroupNameBuffer); @@ -563,12 +573,10 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, rc = RegQueryValue(hOrderKey, GroupName, NULL, (PUCHAR)OrderList, &BufferSize); if (rc != ERROR_SUCCESS) OrderList[0] = 0; - /* enumerate all drivers */ + /* Enumerate all drivers */ for (TagIndex = 1; TagIndex <= OrderList[0]; TagIndex++) { - Index = 0; - - while (TRUE) + for (Index = 0; TRUE; Index++) { /* Get the Driver's Name */ ValueSize = sizeof(ServiceName); @@ -579,10 +587,7 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) - { - FrLdrHeapFree(GroupNameBuffer, TAG_WLDR_NAME); - return; - } + goto Quit; //TRACE_CH(REACTOS, "Service %d: '%S'\n", (int)Index, ServiceName); /* Read the Start Value */ @@ -643,12 +648,11 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, // ServiceName, StartValue, TagValue, DriverGroup, OrderList[TagIndex], GroupName); } - Index++; + RegCloseKey(hDriverKey); } } - Index = 0; - while (TRUE) + for (Index = 0; TRUE; Index++) { /* Get the Driver's Name */ ValueSize = sizeof(ServiceName); @@ -658,10 +662,7 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) - { - FrLdrHeapFree(GroupNameBuffer, TAG_WLDR_NAME); - return; - } + goto Quit; TRACE("Service %d: '%S'\n", (int)Index, ServiceName); /* Read the Start Value */ @@ -722,15 +723,21 @@ WinLdrScanRegistry(IN OUT PLIST_ENTRY BootDriverListHead, // ServiceName, StartValue, TagValue, DriverGroup, GroupName); } - Index++; + RegCloseKey(hDriverKey); } /* Move to the next group name */ GroupName = GroupName + wcslen(GroupName) + 1; } +Quit: /* Free allocated memory */ - FrLdrHeapFree(GroupNameBuffer, TAG_WLDR_NAME); + if (GroupNameBuffer) + FrLdrHeapFree(GroupNameBuffer, TAG_WLDR_NAME); + + /* Close the registry key handles */ + RegCloseKey(hServiceKey); + RegCloseKey(hOrderKey); } static
