2 * PROJECT: ReactOS ISA PnP Bus driver
4 * PURPOSE: FDO-specific code
5 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
15 IN PISAPNP_FDO_EXTENSION FdoExt
,
17 IN PIO_STACK_LOCATION IrpSp
)
22 UNREFERENCED_PARAMETER(Irp
);
23 UNREFERENCED_PARAMETER(IrpSp
);
25 KeAcquireSpinLock(&FdoExt
->Lock
, &OldIrql
);
27 Status
= IsaHwDetectReadDataPort(FdoExt
);
28 if (!NT_SUCCESS(Status
))
30 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
34 FdoExt
->Common
.State
= dsStarted
;
36 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
38 return STATUS_SUCCESS
;
43 IsaFdoQueryDeviceRelations(
44 IN PISAPNP_FDO_EXTENSION FdoExt
,
46 IN PIO_STACK_LOCATION IrpSp
)
49 PLIST_ENTRY CurrentEntry
;
50 PISAPNP_LOGICAL_DEVICE IsaDevice
;
51 PDEVICE_RELATIONS DeviceRelations
;
55 if (IrpSp
->Parameters
.QueryDeviceRelations
.Type
!= BusRelations
)
56 return Irp
->IoStatus
.Status
;
58 KeAcquireSpinLock(&FdoExt
->Lock
, &OldIrql
);
60 Status
= IsaHwFillDeviceList(FdoExt
);
61 if (!NT_SUCCESS(Status
))
63 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
67 DeviceRelations
= ExAllocatePool(NonPagedPool
,
68 sizeof(DEVICE_RELATIONS
) + sizeof(DEVICE_OBJECT
) * (FdoExt
->DeviceCount
- 1));
71 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
72 return STATUS_INSUFFICIENT_RESOURCES
;
75 CurrentEntry
= FdoExt
->DeviceListHead
.Flink
;
76 while (CurrentEntry
!= &FdoExt
->DeviceListHead
)
78 IsaDevice
= CONTAINING_RECORD(CurrentEntry
, ISAPNP_LOGICAL_DEVICE
, ListEntry
);
80 DeviceRelations
->Objects
[i
++] = IsaDevice
->Common
.Self
;
82 ObReferenceObject(IsaDevice
->Common
.Self
);
84 CurrentEntry
= CurrentEntry
->Flink
;
87 DeviceRelations
->Count
= FdoExt
->DeviceCount
;
89 KeReleaseSpinLock(&FdoExt
->Lock
, OldIrql
);
91 Irp
->IoStatus
.Information
= (ULONG_PTR
)DeviceRelations
;
93 return STATUS_SUCCESS
;
99 IN PISAPNP_FDO_EXTENSION FdoExt
,
101 IN PIO_STACK_LOCATION IrpSp
)
103 NTSTATUS Status
= Irp
->IoStatus
.Status
;
105 switch (IrpSp
->MinorFunction
)
107 case IRP_MN_START_DEVICE
:
108 Status
= IsaForwardIrpSynchronous(FdoExt
, Irp
);
110 if (NT_SUCCESS(Status
))
111 Status
= IsaFdoStartDevice(FdoExt
, Irp
, IrpSp
);
113 Irp
->IoStatus
.Status
= Status
;
115 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
118 case IRP_MN_STOP_DEVICE
:
119 FdoExt
->Common
.State
= dsStopped
;
121 Status
= STATUS_SUCCESS
;
124 case IRP_MN_QUERY_DEVICE_RELATIONS
:
125 Status
= IsaFdoQueryDeviceRelations(FdoExt
, Irp
, IrpSp
);
127 Irp
->IoStatus
.Status
= Status
;
129 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
132 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
:
133 DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
137 DPRINT1("Unknown PnP code: %x\n", IrpSp
->MinorFunction
);
141 IoSkipCurrentIrpStackLocation(Irp
);
143 return IoCallDriver(FdoExt
->Ldo
, Irp
);