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

Reply via email to