https://git.reactos.org/?p=reactos.git;a=commitdiff;h=debec8c96ee50336ff5b2…
commit debec8c96ee50336ff5b22ed24821e2c075b5729
Author: Hervé Poussineau <hpoussin(a)reactos.org>
AuthorDate: Sat Mar 21 16:58:21 2020 +0100
Commit: Hervé Poussineau <hpoussin(a)reactos.org>
CommitDate: Sun Mar 22 14:29:38 2020 +0100
[ISAPNP] Create resource requirements ahead of IRP_MN_QUERY_RESOURCE_REQUIREMENTS
---
drivers/bus/isapnp/isapnp.c | 55 +++++++++++++++++++++++++++++++++++++++++++++
drivers/bus/isapnp/isapnp.h | 1 +
drivers/bus/isapnp/pdo.c | 47 +++++++-------------------------------
3 files changed, 64 insertions(+), 39 deletions(-)
diff --git a/drivers/bus/isapnp/isapnp.c b/drivers/bus/isapnp/isapnp.c
index 16fd14c489d..c9025875ddc 100644
--- a/drivers/bus/isapnp/isapnp.c
+++ b/drivers/bus/isapnp/isapnp.c
@@ -6,6 +6,7 @@
*/
#include <isapnp.h>
+#include <isapnphw.h>
#define NDEBUG
#include <debug.h>
@@ -328,6 +329,56 @@ IsaReadWrite(
return STATUS_NOT_SUPPORTED;
}
+static
+NTSTATUS
+NTAPI
+IsaPnpCreateReadPortDORequirements(
+ IN PISAPNP_PDO_EXTENSION PdoExt)
+{
+ USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS, 0x274, 0x3e4, 0x204, 0x2e4,
0x354, 0x2f4 };
+ ULONG ListSize, i;
+ PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
+ PIO_RESOURCE_DESCRIPTOR Descriptor;
+
+ ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST)
+ + 2 * ARRAYSIZE(Ports) * sizeof(IO_RESOURCE_DESCRIPTOR);
+ RequirementsList = ExAllocatePool(PagedPool, ListSize);
+ if (!RequirementsList)
+ return STATUS_NO_MEMORY;
+
+ RtlZeroMemory(RequirementsList, ListSize);
+ RequirementsList->ListSize = ListSize;
+ RequirementsList->AlternativeLists = 1;
+
+ RequirementsList->List[0].Version = 1;
+ RequirementsList->List[0].Revision = 1;
+ RequirementsList->List[0].Count = 2 * ARRAYSIZE(Ports);
+
+ for (i = 0; i < 2 * ARRAYSIZE(Ports); i += 2)
+ {
+ Descriptor = &RequirementsList->List[0].Descriptors[i];
+
+ /* Expected port */
+ Descriptor[0].Type = CmResourceTypePort;
+ Descriptor[0].ShareDisposition = CmResourceShareDeviceExclusive;
+ Descriptor[0].Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
+ Descriptor[0].u.Port.Length = Ports[i / 2] & 1 ? 0x01 : 0x04;
+ Descriptor[0].u.Port.Alignment = 0x01;
+ Descriptor[0].u.Port.MinimumAddress.LowPart = Ports[i / 2];
+ Descriptor[0].u.Port.MaximumAddress.LowPart = Ports[i / 2] +
Descriptor[0].u.Port.Length - 1;
+
+ /* ... but mark it as optional */
+ Descriptor[1].Option = IO_RESOURCE_ALTERNATIVE;
+ Descriptor[1].Type = CmResourceTypePort;
+ Descriptor[1].ShareDisposition = CmResourceShareDeviceExclusive;
+ Descriptor[1].Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
+ Descriptor[1].u.Port.Alignment = 0x01;
+ }
+
+ PdoExt->RequirementsList = RequirementsList;
+ return STATUS_SUCCESS;
+}
+
static
NTSTATUS
NTAPI
@@ -380,6 +431,10 @@ IsaPnpCreateReadPortDO(PISAPNP_FDO_EXTENSION FdoExt)
if (!NT_SUCCESS(Status))
return Status;
+ Status = IsaPnpCreateReadPortDORequirements(PdoExt);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
return Status;
}
diff --git a/drivers/bus/isapnp/isapnp.h b/drivers/bus/isapnp/isapnp.h
index 8417687867b..2d45ce6cac7 100644
--- a/drivers/bus/isapnp/isapnp.h
+++ b/drivers/bus/isapnp/isapnp.h
@@ -53,6 +53,7 @@ typedef struct _ISAPNP_PDO_EXTENSION {
UNICODE_STRING HardwareIDs;
UNICODE_STRING CompatibleIDs;
UNICODE_STRING InstanceID;
+ PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
} ISAPNP_PDO_EXTENSION, *PISAPNP_PDO_EXTENSION;
/* isapnp.c */
diff --git a/drivers/bus/isapnp/pdo.c b/drivers/bus/isapnp/pdo.c
index 2add8d4a2b3..cecb3d2000f 100644
--- a/drivers/bus/isapnp/pdo.c
+++ b/drivers/bus/isapnp/pdo.c
@@ -183,46 +183,18 @@ IsaPdoQueryResourceRequirements(
IN PIRP Irp,
IN PIO_STACK_LOCATION IrpSp)
{
- USHORT Ports[] = { ISAPNP_WRITE_DATA, ISAPNP_ADDRESS, 0x274, 0x3e4, 0x204, 0x2e4,
0x354, 0x2f4 };
- ULONG ListSize, i;
+ ULONG ListSize;
PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
- PIO_RESOURCE_DESCRIPTOR Descriptor;
- ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST)
- + 2 * ARRAYSIZE(Ports) * sizeof(IO_RESOURCE_DESCRIPTOR);
- RequirementsList = ExAllocatePool(NonPagedPool, ListSize);
+ if (!PdoExt->RequirementsList)
+ return Irp->IoStatus.Status;
+
+ ListSize = PdoExt->RequirementsList->ListSize;
+ RequirementsList = ExAllocatePool(PagedPool, ListSize);
if (!RequirementsList)
return STATUS_NO_MEMORY;
- RtlZeroMemory(RequirementsList, ListSize);
- RequirementsList->ListSize = ListSize;
- RequirementsList->AlternativeLists = 1;
-
- RequirementsList->List[0].Version = 1;
- RequirementsList->List[0].Revision = 1;
- RequirementsList->List[0].Count = 2 * ARRAYSIZE(Ports);
-
- for (i = 0; i < 2 * ARRAYSIZE(Ports); i += 2)
- {
- Descriptor = &RequirementsList->List[0].Descriptors[i];
-
- /* Expected port */
- Descriptor[0].Type = CmResourceTypePort;
- Descriptor[0].ShareDisposition = CmResourceShareDeviceExclusive;
- Descriptor[0].Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
- Descriptor[0].u.Port.Length = Ports[i / 2] & 1 ? 0x01 : 0x04;
- Descriptor[0].u.Port.Alignment = 0x01;
- Descriptor[0].u.Port.MinimumAddress.LowPart = Ports[i / 2];
- Descriptor[0].u.Port.MaximumAddress.LowPart = Ports[i / 2] +
Descriptor[0].u.Port.Length - 1;
-
- /* ... but mark it as optional */
- Descriptor[1].Option = IO_RESOURCE_ALTERNATIVE;
- Descriptor[1].Type = CmResourceTypePort;
- Descriptor[1].ShareDisposition = CmResourceShareDeviceExclusive;
- Descriptor[1].Flags = CM_RESOURCE_PORT_16_BIT_DECODE;
- Descriptor[1].u.Port.Alignment = 0x01;
- }
-
+ RtlCopyMemory(RequirementsList, PdoExt->RequirementsList, ListSize);
Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
return STATUS_SUCCESS;
}
@@ -383,10 +355,7 @@ IsaPdoPnp(
break;
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
- if (PdoExt->Common.Self == PdoExt->FdoExt->DataPortPdo)
- Status = IsaPdoQueryResourceRequirements(PdoExt, Irp, IrpSp);
- else
- DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS is
UNIMPLEMENTED!\n");
+ Status = IsaPdoQueryResourceRequirements(PdoExt, Irp, IrpSp);
break;
case IRP_MN_QUERY_ID: