2 * PROJECT: ReactOS ISA PnP Bus driver
4 * PURPOSE: FDO-specific code
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
16 IN PISAPNP_FDO_EXTENSION FdoExt
,
18 IN PIO_STACK_LOCATION IrpSp
)
23 UNREFERENCED_PARAMETER(Irp
);
24 UNREFERENCED_PARAMETER(IrpSp
);
26 KeAcquireSpinLock(&FdoExt
->Lock
, &OldIrql
);
28 Status
= IsaHwDetectReadDataPort(FdoExt
);
29 if (!NT_SUCCESS(Status
))
31 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
35 FdoExt
->Common
.State
= dsStarted
;
37 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
39 return STATUS_SUCCESS
;
44 IsaFdoQueryDeviceRelations(
45 IN PISAPNP_FDO_EXTENSION FdoExt
,
47 IN PIO_STACK_LOCATION IrpSp
)
50 PLIST_ENTRY CurrentEntry
;
51 PISAPNP_LOGICAL_DEVICE IsaDevice
;
52 PDEVICE_RELATIONS DeviceRelations
;
56 if (IrpSp
->Parameters
.QueryDeviceRelations
.Type
!= BusRelations
)
57 return Irp
->IoStatus
.Status
;
59 KeAcquireSpinLock(&FdoExt
->Lock
, &OldIrql
);
61 Status
= IsaHwFillDeviceList(FdoExt
);
62 if (!NT_SUCCESS(Status
))
64 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
68 DeviceRelations
= ExAllocatePool(NonPagedPool
,
69 sizeof(DEVICE_RELATIONS
) + sizeof(DEVICE_OBJECT
) * (FdoExt
->DeviceCount
- 1));
72 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
73 return STATUS_INSUFFICIENT_RESOURCES
;
76 CurrentEntry
= FdoExt
->DeviceListHead
.Flink
;
77 while (CurrentEntry
!= &FdoExt
->DeviceListHead
)
79 IsaDevice
= CONTAINING_RECORD(CurrentEntry
, ISAPNP_LOGICAL_DEVICE
, ListEntry
);
81 DeviceRelations
->Objects
[i
++] = IsaDevice
->Common
.Self
;
83 ObReferenceObject(IsaDevice
->Common
.Self
);
85 CurrentEntry
= CurrentEntry
->Flink
;
88 DeviceRelations
->Count
= FdoExt
->DeviceCount
;
90 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
92 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelations
;
94 return STATUS_SUCCESS
;
100 IN PISAPNP_FDO_EXTENSION FdoExt
,
102 IN PIO_STACK_LOCATION IrpSp
)
104 NTSTATUS Status
= Irp
->IoStatus
.Status
;
106 switch (IrpSp
->MinorFunction
)
108 case IRP_MN_START_DEVICE
:
109 Status
= IsaForwardIrpSynchronous(FdoExt
, Irp
);
111 if (NT_SUCCESS(Status
))
112 Status
= IsaFdoStartDevice(FdoExt
, Irp
, IrpSp
);
114 Irp
->IoStatus
.Status
= Status
;
116 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
119 case IRP_MN_STOP_DEVICE
:
120 FdoExt
->Common
.State
= dsStopped
;
122 Status
= STATUS_SUCCESS
;
125 case IRP_MN_QUERY_DEVICE_RELATIONS
:
126 Status
= IsaFdoQueryDeviceRelations(FdoExt
, Irp
, IrpSp
);
128 Irp
->IoStatus
.Status
= Status
;
130 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
133 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
:
134 DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
138 DPRINT1("Unknown PnP code: %x\n", IrpSp
->MinorFunction
);
142 IoSkipCurrentIrpStackLocation(Irp
);
144 return IoCallDriver(FdoExt
->Ldo
, Irp
);