https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5a404e6c5048a29a4e6c3dc2d1bf2df776cf0d44

commit 5a404e6c5048a29a4e6c3dc2d1bf2df776cf0d44
Author:     Hervé Poussineau <[email protected]>
AuthorDate: Mon Mar 16 20:50:29 2020 +0100
Commit:     Hervé Poussineau <[email protected]>
CommitDate: Fri Mar 20 22:40:11 2020 +0100

    [ISAPNP] Implement 
IRP_MN_QUERY_RESOURCES/IRP_MN_QUERY_RESOURCE_REQUIREMENTS for ReadDataPort
---
 drivers/bus/isapnp/pdo.c | 183 ++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 140 insertions(+), 43 deletions(-)

diff --git a/drivers/bus/isapnp/pdo.c b/drivers/bus/isapnp/pdo.c
index 639f07d5aa1..55ab0da804a 100644
--- a/drivers/bus/isapnp/pdo.c
+++ b/drivers/bus/isapnp/pdo.c
@@ -6,6 +6,7 @@
  */
 
 #include <isapnp.h>
+#include <isapnphw.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -122,6 +123,96 @@ IsaPdoQueryId(
     return STATUS_SUCCESS;
 }
 
+NTSTATUS
+NTAPI
+IsaPdoQueryResources(
+  IN PISAPNP_PDO_EXTENSION PdoExt,
+  IN PIRP Irp,
+  IN PIO_STACK_LOCATION IrpSp)
+{
+    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(NonPagedPool, 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];
+    }
+
+    Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+IsaPdoQueryResourceRequirements(
+  IN PISAPNP_PDO_EXTENSION PdoExt,
+  IN PIRP Irp,
+  IN PIO_STACK_LOCATION IrpSp)
+{
+    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(NonPagedPool, 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;
+    }
+
+    Irp->IoStatus.Information = (ULONG_PTR)RequirementsList;
+    return STATUS_SUCCESS;
+}
+
 NTSTATUS
 NTAPI
 IsaPdoPnp(
@@ -133,49 +224,55 @@ IsaPdoPnp(
 
     switch (IrpSp->MinorFunction)
     {
-       case IRP_MN_START_DEVICE:
-           if (PdoExt->IsaPnpDevice)
-               Status = IsaHwActivateDevice(PdoExt->IsaPnpDevice);
-           else
-               Status = STATUS_SUCCESS;
-
-         if (NT_SUCCESS(Status))
-             PdoExt->Common.State = dsStarted;
-         break;
-
-       case IRP_MN_STOP_DEVICE:
-           if (PdoExt->IsaPnpDevice)
-               Status = IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
-           else
-               Status = STATUS_SUCCESS;
-
-         if (NT_SUCCESS(Status))
-             PdoExt->Common.State = dsStopped;
-         break;
-
-       case IRP_MN_QUERY_DEVICE_RELATIONS:
-         Status = IsaPdoQueryDeviceRelations(PdoExt, Irp, IrpSp);
-         break;
-
-       case IRP_MN_QUERY_CAPABILITIES:
-         Status = IsaPdoQueryCapabilities(PdoExt, Irp, IrpSp);
-         break;
-
-       case IRP_MN_QUERY_RESOURCES:
-         DPRINT1("IRP_MN_QUERY_RESOURCES is UNIMPLEMENTED!\n");
-         break;
-
-       case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
-         DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS is UNIMPLEMENTED!\n");
-         break;
-
-       case IRP_MN_QUERY_ID:
-         Status = IsaPdoQueryId(PdoExt, Irp, IrpSp);
-         break;
-
-       default:
-         DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction);
-         break;
+        case IRP_MN_START_DEVICE:
+            if (PdoExt->IsaPnpDevice)
+                Status = IsaHwActivateDevice(PdoExt->IsaPnpDevice);
+            else
+                Status = STATUS_SUCCESS;
+
+            if (NT_SUCCESS(Status))
+                PdoExt->Common.State = dsStarted;
+            break;
+
+        case IRP_MN_STOP_DEVICE:
+            if (PdoExt->IsaPnpDevice)
+                Status = IsaHwDeactivateDevice(PdoExt->IsaPnpDevice);
+            else
+                Status = STATUS_SUCCESS;
+
+            if (NT_SUCCESS(Status))
+                PdoExt->Common.State = dsStopped;
+            break;
+
+        case IRP_MN_QUERY_DEVICE_RELATIONS:
+            Status = IsaPdoQueryDeviceRelations(PdoExt, Irp, IrpSp);
+            break;
+
+        case IRP_MN_QUERY_CAPABILITIES:
+            Status = IsaPdoQueryCapabilities(PdoExt, Irp, IrpSp);
+            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");
+            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");
+            break;
+
+        case IRP_MN_QUERY_ID:
+            Status = IsaPdoQueryId(PdoExt, Irp, IrpSp);
+            break;
+
+        default:
+            DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction);
+            break;
     }
 
     Irp->IoStatus.Status = Status;

Reply via email to