https://git.reactos.org/?p=reactos.git;a=commitdiff;h=61c1079a18ee2faaf5062…
commit 61c1079a18ee2faaf50621d8caae1ac7d1ddd561
Author:     Hervé Poussineau <hpoussin(a)reactos.org>
AuthorDate: Sat Mar 21 17:37:45 2020 +0100
Commit:     Hervé Poussineau <hpoussin(a)reactos.org>
CommitDate: Sun Mar 22 14:29:38 2020 +0100
    [ISAPNP] Create resource list ahead of IRP_MN_QUERY_RESOURCES
---
 drivers/bus/isapnp/isapnp.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 drivers/bus/isapnp/isapnp.h |  2 ++
 drivers/bus/isapnp/pdo.c    | 36 ++++++++----------------------------
 3 files changed, 53 insertions(+), 28 deletions(-)
diff --git a/drivers/bus/isapnp/isapnp.c b/drivers/bus/isapnp/isapnp.c
index c9025875ddc..6f22efcd014 100644
--- a/drivers/bus/isapnp/isapnp.c
+++ b/drivers/bus/isapnp/isapnp.c
@@ -379,6 +379,45 @@ IsaPnpCreateReadPortDORequirements(
     return STATUS_SUCCESS;
 }
+static
+NTSTATUS
+NTAPI
+IsaPnpCreateReadPortDOResources(
+    IN PISAPNP_PDO_EXTENSION PdoExt)
+{
+    USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS };
+    ULONG ListSize, i;
+    PCM_RESOURCE_LIST ResourceList;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
+
+    ListSize = sizeof(CM_RESOURCE_LIST)
+             + (ARRAYSIZE(Ports) - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
+    ResourceList = ExAllocatePool(PagedPool, ListSize);
+    if (!ResourceList)
+        return STATUS_NO_MEMORY;
+
+    RtlZeroMemory(ResourceList, ListSize);
+    ResourceList->Count = 1;
+    ResourceList->List[0].InterfaceType = Internal;
+    ResourceList->List[0].PartialResourceList.Version = 1;
+    ResourceList->List[0].PartialResourceList.Revision = 1;
+    ResourceList->List[0].PartialResourceList.Count = 2;
+
+    for (i = 0; i < ARRAYSIZE(Ports); i++)
+    {
+        Descriptor =
&ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
+        Descriptor->Type = CmResourceTypePort;
+        Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+        Descriptor->Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
+        Descriptor->u.Port.Length = 0x01;
+        Descriptor->u.Port.Start.LowPart = Ports[i];
+    }
+
+    PdoExt->ResourceList = ResourceList;
+    PdoExt->ResourceListSize = ListSize;
+    return STATUS_SUCCESS;
+}
+
 static
 NTSTATUS
 NTAPI
@@ -435,6 +474,10 @@ IsaPnpCreateReadPortDO(PISAPNP_FDO_EXTENSION FdoExt)
     if (!NT_SUCCESS(Status))
         return Status;
+    Status = IsaPnpCreateReadPortDOResources(PdoExt);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
     return Status;
 }
diff --git a/drivers/bus/isapnp/isapnp.h b/drivers/bus/isapnp/isapnp.h
index 2d45ce6cac7..416ed2df55f 100644
--- a/drivers/bus/isapnp/isapnp.h
+++ b/drivers/bus/isapnp/isapnp.h
@@ -54,6 +54,8 @@ typedef struct _ISAPNP_PDO_EXTENSION {
     UNICODE_STRING CompatibleIDs;
     UNICODE_STRING InstanceID;
     PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
+    PCM_RESOURCE_LIST ResourceList;
+    ULONG ResourceListSize;
 } ISAPNP_PDO_EXTENSION, *PISAPNP_PDO_EXTENSION;
 /* isapnp.c */
diff --git a/drivers/bus/isapnp/pdo.c b/drivers/bus/isapnp/pdo.c
index cecb3d2000f..d4a34cf78ec 100644
--- a/drivers/bus/isapnp/pdo.c
+++ b/drivers/bus/isapnp/pdo.c
@@ -6,7 +6,6 @@
  */
 #include <isapnp.h>
-#include <isapnphw.h>
 #define NDEBUG
 #include <debug.h>
@@ -144,34 +143,18 @@ IsaPdoQueryResources(
     IN PIRP Irp,
     IN PIO_STACK_LOCATION IrpSp)
 {
-    USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS };
-    ULONG ListSize, i;
+    ULONG ListSize;
     PCM_RESOURCE_LIST ResourceList;
-    PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
-    ListSize = sizeof(CM_RESOURCE_LIST)
-             + (ARRAYSIZE(Ports) - 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR);
-    ResourceList = ExAllocatePool(NonPagedPool, ListSize);
+    if (!PdoExt->ResourceList)
+        return Irp->IoStatus.Status;
+
+    ListSize = PdoExt->ResourceListSize;
+    ResourceList = ExAllocatePool(PagedPool, ListSize);
     if (!ResourceList)
         return STATUS_NO_MEMORY;
-    RtlZeroMemory(ResourceList, ListSize);
-    ResourceList->Count = 1;
-    ResourceList->List[0].InterfaceType = Internal;
-    ResourceList->List[0].PartialResourceList.Version = 1;
-    ResourceList->List[0].PartialResourceList.Revision = 1;
-    ResourceList->List[0].PartialResourceList.Count = 2;
-
-    for (i = 0; i < ARRAYSIZE(Ports); i++)
-    {
-        Descriptor =
&ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
-        Descriptor->Type = CmResourceTypePort;
-        Descriptor->ShareDisposition = CmResourceShareDeviceExclusive;
-        Descriptor->Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
-        Descriptor->u.Port.Length = 0x01;
-        Descriptor->u.Port.Start.LowPart = Ports[i];
-    }
-
+    RtlCopyMemory(ResourceList, PdoExt->ResourceList, ListSize);
     Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
     return STATUS_SUCCESS;
 }
@@ -348,10 +331,7 @@ IsaPdoPnp(
             break;
         case IRP_MN_QUERY_RESOURCES:
-            if (PdoExt->Common.Self == PdoExt->FdoExt->DataPortPdo)
-                Status = IsaPdoQueryResources(PdoExt, Irp, IrpSp);
-            else
-                DPRINT1("IRP_MN_QUERY_RESOURCES is UNIMPLEMENTED!\n");
+            Status = IsaPdoQueryResources(PdoExt, Irp, IrpSp);
             break;
         case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: