[NTOS:IO][NTOS:PNP] Fix incorrect usage of IopGetRegistryValue
authorVictor Perevertkin <victor.perevertkin@reactos.org>
Thu, 18 Mar 2021 22:07:22 +0000 (01:07 +0300)
committerVictor Perevertkin <victor.perevertkin@reactos.org>
Thu, 18 Mar 2021 22:07:22 +0000 (01:07 +0300)
KEY_VALUE_FULL_INFORMATION was not always freed properly

ntoskrnl/io/iomgr/driver.c
ntoskrnl/io/pnpmgr/devaction.c

index 602cd48..24f6084 100644 (file)
@@ -195,7 +195,12 @@ IopGetDriverNames(
     if (driverName.Buffer == NULL)
     {
         status = IopGetRegistryValue(ServiceHandle, L"Type", &kvInfo);
-        if (!NT_SUCCESS(status) || kvInfo->Type != REG_DWORD)
+        if (!NT_SUCCESS(status))
+        {
+            ExFreePoolWithTag(basicInfo, TAG_IO);
+            return status;
+        }
+        if (kvInfo->Type != REG_DWORD)
         {
             ExFreePool(kvInfo);
             ExFreePoolWithTag(basicInfo, TAG_IO); // container for serviceName
index 5d354dd..aa1ac12 100644 (file)
@@ -419,11 +419,15 @@ PiAttachFilterDriversCallback(
     SERVICE_LOAD_TYPE startType = DisableLoad;
 
     Status = IopGetRegistryValue(serviceHandle, L"Start", &kvInfo);
-    if (NT_SUCCESS(Status) && kvInfo->Type == REG_DWORD)
+    if (NT_SUCCESS(Status))
     {
-        RtlMoveMemory(&startType,
-                      (PVOID)((ULONG_PTR)kvInfo + kvInfo->DataOffset),
-                      sizeof(startType));
+        if (kvInfo->Type == REG_DWORD)
+        {
+            RtlMoveMemory(&startType,
+                          (PVOID)((ULONG_PTR)kvInfo + kvInfo->DataOffset),
+                          sizeof(startType));
+        }
+        
         ExFreePool(kvInfo);
     }
 
@@ -621,52 +625,56 @@ PiCallDriverAddDevice(
 
     // try to get the class GUID of an instance and its registry key
     Status = IopGetRegistryValue(SubKey, REGSTR_VAL_CLASSGUID, &kvInfo);
-    if (NT_SUCCESS(Status) && kvInfo->Type == REG_SZ && kvInfo->DataLength > sizeof(WCHAR))
+    if (NT_SUCCESS(Status))
     {
-        UNICODE_STRING classGUID = {
-            .MaximumLength = kvInfo->DataLength,
-            .Length = kvInfo->DataLength - sizeof(UNICODE_NULL),
-            .Buffer = (PVOID)((ULONG_PTR)kvInfo + kvInfo->DataOffset)
-        };
-        HANDLE ccsControlHandle;
-
-        Status = IopOpenRegistryKeyEx(&ccsControlHandle, NULL, &ccsControlClass, KEY_READ);
-        if (!NT_SUCCESS(Status))
-        {
-            DPRINT1("IopOpenRegistryKeyEx() failed for \"%wZ\" (status %x)\n",
-                    &ccsControlClass, Status);
-        }
-        else
+        if (kvInfo->Type == REG_SZ && kvInfo->DataLength > sizeof(WCHAR))
         {
-            // open the CCS\Control\Class\<ClassGUID> key
-            Status = IopOpenRegistryKeyEx(&ClassKey, ccsControlHandle, &classGUID, KEY_READ);
-            ZwClose(ccsControlHandle);
+            UNICODE_STRING classGUID = {
+                .MaximumLength = kvInfo->DataLength,
+                .Length = kvInfo->DataLength - sizeof(UNICODE_NULL),
+                .Buffer = (PVOID)((ULONG_PTR)kvInfo + kvInfo->DataOffset)
+            };
+            HANDLE ccsControlHandle;
+
+            Status = IopOpenRegistryKeyEx(&ccsControlHandle, NULL, &ccsControlClass, KEY_READ);
             if (!NT_SUCCESS(Status))
             {
-                DPRINT1("Failed to open class key \"%wZ\" (status %x)\n", &classGUID, Status);
+                DPRINT1("IopOpenRegistryKeyEx() failed for \"%wZ\" (status %x)\n",
+                        &ccsControlClass, Status);
             }
-        }
-
-        if (ClassKey)
-        {
-            // Check the Properties key of a class too
-            // Windows fills some device properties from this key (which is protected)
-            // TODO: add the device properties from this key
-
-            UNICODE_STRING properties = RTL_CONSTANT_STRING(REGSTR_KEY_DEVICE_PROPERTIES);
-            HANDLE propertiesHandle;
-
-            Status = IopOpenRegistryKeyEx(&propertiesHandle, ClassKey, &properties, KEY_READ);
-            if (!NT_SUCCESS(Status))
+            else
             {
-                DPRINT("Properties key failed to open for \"%wZ\" (status %x)\n",
-                       &classGUID, Status);
+                // open the CCS\Control\Class\<ClassGUID> key
+                Status = IopOpenRegistryKeyEx(&ClassKey, ccsControlHandle, &classGUID, KEY_READ);
+                ZwClose(ccsControlHandle);
+                if (!NT_SUCCESS(Status))
+                {
+                    DPRINT1("Failed to open class key \"%wZ\" (status %x)\n", &classGUID, Status);
+                }
             }
-            else
+
+            if (ClassKey)
             {
-                ZwClose(propertiesHandle);
+                // Check the Properties key of a class too
+                // Windows fills some device properties from this key (which is protected)
+                // TODO: add the device properties from this key
+
+                UNICODE_STRING properties = RTL_CONSTANT_STRING(REGSTR_KEY_DEVICE_PROPERTIES);
+                HANDLE propertiesHandle;
+
+                Status = IopOpenRegistryKeyEx(&propertiesHandle, ClassKey, &properties, KEY_READ);
+                if (!NT_SUCCESS(Status))
+                {
+                    DPRINT("Properties key failed to open for \"%wZ\" (status %x)\n",
+                           &classGUID, Status);
+                }
+                else
+                {
+                    ZwClose(propertiesHandle);
+                }
             }
         }
+        
         ExFreePool(kvInfo);
     }