[NTOSKRNL]
authorCameron Gutman <aicommander@gmail.com>
Sun, 24 Oct 2010 02:38:14 +0000 (02:38 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sun, 24 Oct 2010 02:38:14 +0000 (02:38 +0000)
- Rewrite the resource map code to fix a regression, several failures cases, and a few memory leaks
- Remove an incorrect definition of IopDetectResourceConflict in pnpreport.c (no idea how this didn't trigger an onslaught of warnings)

svn path=/trunk/; revision=49248

reactos/ntoskrnl/include/internal/io.h
reactos/ntoskrnl/io/pnpmgr/pnpreport.c
reactos/ntoskrnl/io/pnpmgr/pnpres.c

index 28bc779..bf676b6 100644 (file)
@@ -514,6 +514,21 @@ IopAssignDeviceResources(
     IN PDEVICE_NODE DeviceNode
 );
 
+NTSTATUS
+NTAPI
+IopCreateResourceListFromRequirements(
+    IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
+    OUT PCM_RESOURCE_LIST *ResourceList
+);
+
+NTSTATUS
+NTAPI
+IopDetectResourceConflict(
+     IN PCM_RESOURCE_LIST ResourceList,
+     IN BOOLEAN Silent,
+     OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor
+);
+
 //
 // PNP Routines
 //
index 165b0b0..94a20dc 100644 (file)
@@ -38,9 +38,6 @@ NTSTATUS
 IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode,
                                 PVOID Context);
 
-NTSTATUS
-IopDetectResourceConflict(IN PCM_RESOURCE_LIST ResourceList);
-
 NTSTATUS
 PpSetCustomTargetEvent(IN PDEVICE_OBJECT DeviceObject,
                        IN OUT PKEVENT SyncEvent OPTIONAL,
@@ -379,7 +376,7 @@ IoReportResourceForDetection(IN PDRIVER_OBJECT DriverObject,
         ResourceList = DriverList;
 
     /* Look for a resource conflict */
-    Status = IopDetectResourceConflict(ResourceList);
+    Status = IopDetectResourceConflict(ResourceList, FALSE, NULL);
     if (Status == STATUS_CONFLICTING_ADDRESSES)
     {
         /* Oh noes */
index 71319f8..35a0545 100644 (file)
 #define NDEBUG
 #include <debug.h>
 
-NTSTATUS
-IopDetectResourceConflict(
-   IN PCM_RESOURCE_LIST ResourceList,
-   IN BOOLEAN Silent,
-   OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor);
-
 static
 BOOLEAN
 IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
@@ -187,8 +181,8 @@ IopFindInterruptResource(
    return FALSE;
 }
 
-static
-NTSTATUS
+
+NTSTATUS NTAPI
 IopCreateResourceListFromRequirements(
    IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList,
    OUT PCM_RESOURCE_LIST *ResourceList)
@@ -615,40 +609,61 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
 
   if (DeviceNode->ResourceList)
   {
-      PWCHAR DeviceName = NULL;
       UNICODE_STRING NameU;
-      UNICODE_STRING Suffix;
+      UNICODE_STRING RawSuffix, TranslatedSuffix;
       ULONG OldLength = 0;
 
       ASSERT(DeviceNode->ResourceListTranslated);
+      
+      RtlInitUnicodeString(&TranslatedSuffix, L".Translated");
+      RtlInitUnicodeString(&RawSuffix, L".Raw");
 
       Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
                                    DevicePropertyPhysicalDeviceObjectName,
                                    0,
                                    NULL,
                                    &OldLength);
-     if ((OldLength != 0) && (Status == STATUS_BUFFER_TOO_SMALL))
-     {
-        DeviceName = ExAllocatePool(NonPagedPool, OldLength);
-        ASSERT(DeviceName);
-
-        IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
-                            DevicePropertyPhysicalDeviceObjectName,
-                            OldLength,
-                            DeviceName,
-                            &OldLength);
-                            
-        RtlInitUnicodeString(&NameU, DeviceName);
-     }
-     else
-     {
-        /* Some failure */
-        ASSERT(!NT_SUCCESS(Status));
-        return Status;
-     }
-
-      RtlInitUnicodeString(&Suffix, L".Raw");
-      RtlAppendUnicodeStringToString(&NameU, &Suffix);
+      if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL)
+      {
+          ASSERT(OldLength);
+          
+          NameU.Buffer = ExAllocatePool(PagedPool, OldLength + TranslatedSuffix.Length);
+          if (!NameU.Buffer)
+          {
+              ZwClose(PnpMgrLevel2);
+              return STATUS_INSUFFICIENT_RESOURCES;
+          }
+          
+          NameU.Length = 0;
+          NameU.MaximumLength = OldLength + TranslatedSuffix.Length;
+          
+          Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject,
+                                       DevicePropertyPhysicalDeviceObjectName,
+                                       NameU.MaximumLength,
+                                       NameU.Buffer,
+                                       &OldLength);
+          if (!NT_SUCCESS(Status))
+          {
+              ZwClose(PnpMgrLevel2);
+              ExFreePool(NameU.Buffer);
+              return Status;
+          }
+      }
+      else if (!NT_SUCCESS(Status))
+      {
+          /* Some failure */
+          ZwClose(PnpMgrLevel2);
+          return Status;
+      }
+      else
+      {
+          /* This should never happen */
+          ASSERT(FALSE);
+      }
+      
+      NameU.Length = OldLength;
+
+      RtlAppendUnicodeStringToString(&NameU, &RawSuffix);
 
       Status = ZwSetValueKey(PnpMgrLevel2,
                              &NameU,
@@ -659,14 +674,14 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
       if (!NT_SUCCESS(Status))
       {
           ZwClose(PnpMgrLevel2);
+          ExFreePool(NameU.Buffer);
           return Status;
       }
 
       /* "Remove" the suffix by setting the length back to what it used to be */
-      NameU.Length = (USHORT)OldLength;
+      NameU.Length = OldLength;
 
-      RtlInitUnicodeString(&Suffix, L".Translated");
-      RtlAppendUnicodeStringToString(&NameU, &Suffix);
+      RtlAppendUnicodeStringToString(&NameU, &TranslatedSuffix);
 
       Status = ZwSetValueKey(PnpMgrLevel2,
                              &NameU,
@@ -675,8 +690,8 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2
                              DeviceNode->ResourceListTranslated,
                              PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated));
       ZwClose(PnpMgrLevel2);
-      ASSERT(DeviceName);
-      ExFreePool(DeviceName);
+      ExFreePool(NameU.Buffer);
+
       if (!NT_SUCCESS(Status))
           return Status;
   }
@@ -935,7 +950,7 @@ ByeBye:
    return Result;
 }
 
-NTSTATUS
+NTSTATUS NTAPI
 IopDetectResourceConflict(
    IN PCM_RESOURCE_LIST ResourceList,
    IN BOOLEAN Silent,