2 * PROJECT: ReactOS ISA PnP Bus driver
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: FDO-specific code
5 * COPYRIGHT: Copyright 2010 Cameron Gutman <cameron.gutman@reactos.org>
6 * Copyright 2020 Hervé Poussineau <hpoussin@reactos.org>
7 * Copyright 2021 Dmitry Borisov <di.sean@protonmail.com>
19 _In_ PISAPNP_FDO_EXTENSION FdoExt
,
26 if (!IoForwardIrpSynchronously(FdoExt
->Ldo
, Irp
))
28 return STATUS_UNSUCCESSFUL
;
30 Status
= Irp
->IoStatus
.Status
;
31 if (!NT_SUCCESS(Status
))
36 FdoExt
->Common
.State
= dsStarted
;
38 return STATUS_SUCCESS
;
44 IsaFdoQueryBusRelations(
45 _In_ PISAPNP_FDO_EXTENSION FdoExt
,
50 return IsaPnpFillDeviceRelations(FdoExt
, Irp
, TRUE
);
57 _In_ PISAPNP_FDO_EXTENSION FdoExt
,
65 IsaPnpAcquireDeviceDataLock(FdoExt
);
67 /* Remove our logical devices */
68 while (!IsListEmpty(&FdoExt
->DeviceListHead
))
70 PISAPNP_LOGICAL_DEVICE LogDevice
= CONTAINING_RECORD(RemoveHeadList(&FdoExt
->
72 ISAPNP_LOGICAL_DEVICE
,
75 --FdoExt
->DeviceCount
;
79 IsaPnpRemoveLogicalDeviceDO(LogDevice
->Pdo
);
83 IsaPnpReleaseDeviceDataLock(FdoExt
);
85 IsaPnpAcquireBusDataLock();
87 /* Remove the Read Port */
88 if (FdoExt
->ReadPortPdo
)
90 IsaPnpRemoveReadPortDO(FdoExt
->ReadPortPdo
);
91 ReadPortCreated
= FALSE
;
94 /* Find the next ISA bus, if any */
95 Entry
= BusListHead
.Flink
;
96 if (Entry
!= &BusListHead
)
98 PISAPNP_FDO_EXTENSION NextIsaBus
= CONTAINING_RECORD(Entry
,
102 /* Create a new Read Port for it */
103 if (!ReadPortCreated
)
104 IoInvalidateDeviceRelations(NextIsaBus
->Pdo
, BusRelations
);
107 RemoveEntryList(&FdoExt
->BusLink
);
109 IsaPnpReleaseBusDataLock();
111 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
112 IoSkipCurrentIrpStackLocation(Irp
);
113 Status
= IoCallDriver(FdoExt
->Ldo
, Irp
);
115 IoDetachDevice(FdoExt
->Ldo
);
116 IoDeleteDevice(FdoExt
->Common
.Self
);
124 _In_ PISAPNP_FDO_EXTENSION FdoExt
,
126 _In_ PIO_STACK_LOCATION IrpSp
)
132 DPRINT("%s(%p, %p) FDO %lu, Minor - %X\n",
137 IrpSp
->MinorFunction
);
139 switch (IrpSp
->MinorFunction
)
141 case IRP_MN_START_DEVICE
:
142 Status
= IsaFdoStartDevice(FdoExt
, Irp
);
144 Irp
->IoStatus
.Status
= Status
;
145 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
148 case IRP_MN_QUERY_DEVICE_RELATIONS
:
150 if (IrpSp
->Parameters
.QueryDeviceRelations
.Type
!= BusRelations
)
153 Status
= IsaFdoQueryBusRelations(FdoExt
, Irp
);
154 if (!NT_SUCCESS(Status
))
156 Irp
->IoStatus
.Status
= Status
;
157 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
162 Irp
->IoStatus
.Status
= Status
;
166 case IRP_MN_REMOVE_DEVICE
:
167 return IsaFdoRemoveDevice(FdoExt
, Irp
);
169 case IRP_MN_QUERY_PNP_DEVICE_STATE
:
170 Irp
->IoStatus
.Information
|= PNP_DEVICE_NOT_DISABLEABLE
;
171 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
174 case IRP_MN_QUERY_INTERFACE
:
176 Status
= IsaFdoQueryInterface(FdoExt
, IrpSp
);
177 if (Status
== STATUS_NOT_SUPPORTED
)
181 else if (!NT_SUCCESS(Status
))
183 Irp
->IoStatus
.Status
= Status
;
184 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
189 Irp
->IoStatus
.Status
= Status
;
193 case IRP_MN_SURPRISE_REMOVAL
:
194 case IRP_MN_QUERY_STOP_DEVICE
:
195 case IRP_MN_QUERY_REMOVE_DEVICE
:
196 case IRP_MN_CANCEL_STOP_DEVICE
:
197 case IRP_MN_CANCEL_REMOVE_DEVICE
:
198 case IRP_MN_STOP_DEVICE
:
199 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
203 DPRINT("Unknown PnP code: %X\n", IrpSp
->MinorFunction
);
207 IoSkipCurrentIrpStackLocation(Irp
);
209 return IoCallDriver(FdoExt
->Ldo
, Irp
);