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: