ReactOS 0.4.17-dev-1190-g4c812f4
fdo.c
Go to the documentation of this file.
1/*
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>
8 */
9
10#include "isapnp.h"
11
12#define NDEBUG
13#include <debug.h>
14
15static
16CODE_SEG("PAGE")
21{
23
24 PAGED_CODE();
25
26 if (!IoForwardIrpSynchronously(FdoExt->Ldo, Irp))
27 {
29 }
30 Status = Irp->IoStatus.Status;
31 if (!NT_SUCCESS(Status))
32 {
33 return Status;
34 }
35
36 FdoExt->Common.State = dsStarted;
37
38 return STATUS_SUCCESS;
39}
40
41static
42CODE_SEG("PAGE")
47{
48 PAGED_CODE();
49
50 return IsaPnpFillDeviceRelations(FdoExt, Irp, TRUE);
51}
52
53/* The PnP manager frees the returned buffer */
54static
55CODE_SEG("PAGE")
60{
62
63 PAGED_CODE();
64
65 LegacyBus = ExAllocatePoolWithTag(PagedPool, sizeof(*LegacyBus), TAG_ISAPNP);
66 if (!LegacyBus)
68
69 LegacyBus->BusTypeGuid = GUID_BUS_TYPE_ISAPNP;
70 LegacyBus->LegacyBusType = Isa;
71 LegacyBus->BusNumber = FdoExt->BusNumber;
72
73 Irp->IoStatus.Information = (ULONG_PTR)LegacyBus;
74 return STATUS_SUCCESS;
75}
76
77static
78CODE_SEG("PAGE")
83{
86
87 PAGED_CODE();
88
89 IsaPnpAcquireDeviceDataLock(FdoExt);
90
91 /* Remove our logical devices */
92 while (!IsListEmpty(&FdoExt->DeviceListHead))
93 {
97 DeviceLink);
98
99 --FdoExt->DeviceCount;
100
101 if (LogDevice->Pdo)
102 {
104 }
105 }
106
107 IsaPnpReleaseDeviceDataLock(FdoExt);
108
109 IsaPnpAcquireBusDataLock();
110
111 /* Remove the Read Port */
112 if (FdoExt->ReadPortPdo)
113 {
114 IsaPnpRemoveReadPortDO(FdoExt->ReadPortPdo);
115 ReadPortCreated = FALSE;
116 }
117
118 /* Find the next ISA bus, if any */
119 Entry = BusListHead.Flink;
120 if (Entry != &BusListHead)
121 {
124 BusLink);
125
126 /* Create a new Read Port for it */
127 if (!ReadPortCreated)
129 }
130
131 RemoveEntryList(&FdoExt->BusLink);
132
133 IsaPnpReleaseBusDataLock();
134
135 Irp->IoStatus.Status = STATUS_SUCCESS;
137 Status = IoCallDriver(FdoExt->Ldo, Irp);
138
139 IoDetachDevice(FdoExt->Ldo);
140 IoDeleteDevice(FdoExt->Common.Self);
141
142 return Status;
143}
144
145CODE_SEG("PAGE")
151{
153
154 PAGED_CODE();
155
156 DPRINT("%s(%p, %p) FDO %lu, Minor - %X\n",
158 FdoExt,
159 Irp,
160 FdoExt->BusNumber,
162
163 switch (IrpSp->MinorFunction)
164 {
166 Status = IsaFdoStartDevice(FdoExt, Irp);
167
168 Irp->IoStatus.Status = Status;
170 return Status;
171
173 {
175 break;
176
178 if (!NT_SUCCESS(Status))
179 {
180 Irp->IoStatus.Status = Status;
182
183 return Status;
184 }
185
186 Irp->IoStatus.Status = Status;
187 break;
188 }
189
191 return IsaFdoRemoveDevice(FdoExt, Irp);
192
194 {
196 if (!NT_SUCCESS(Status))
197 {
198 Irp->IoStatus.Status = Status;
200
201 return Status;
202 }
203
204 Irp->IoStatus.Status = Status;
205 break;
206 }
207
209 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
210 Irp->IoStatus.Status = STATUS_SUCCESS;
211 break;
212
214 {
217 {
218 break;
219 }
220 else if (!NT_SUCCESS(Status))
221 {
222 Irp->IoStatus.Status = Status;
224
225 return Status;
226 }
227
228 Irp->IoStatus.Status = Status;
229 break;
230 }
231
238 Irp->IoStatus.Status = STATUS_SUCCESS;
239 break;
240
241 default:
242 DPRINT("Unknown PnP code: %X\n", IrpSp->MinorFunction);
243 break;
244 }
245
247
248 return IoCallDriver(FdoExt->Ldo, Irp);
249}
#define PAGED_CODE()
#define CODE_SEG(...)
LONG NTSTATUS
Definition: precomp.h:26
static LIST_ENTRY DeviceListHead
Definition: fs.c:52
static NTSTATUS IsaFdoStartDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp)
Definition: fdo.c:18
NTSTATUS IsaFdoPnp(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp, _In_ PIO_STACK_LOCATION IrpSp)
Definition: fdo.c:147
static NTSTATUS IsaFdoQueryLegacyBusInformation(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp)
Definition: fdo.c:57
static NTSTATUS IsaFdoQueryBusRelations(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp)
Definition: fdo.c:44
static NTSTATUS IsaFdoRemoveDevice(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp)
Definition: fdo.c:80
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS IsaFdoQueryInterface(_In_ PISAPNP_FDO_EXTENSION FdoExt, _In_ PIO_STACK_LOCATION IrpSp)
Definition: interface.c:19
#define __FUNCTION__
Definition: types.h:116
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4138
#define ULONG_PTR
Definition: config.h:101
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define RemoveHeadList(ListHead)
Definition: env_spec_w32.h:964
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:24
NTSTATUS IsaPnpFillDeviceRelations(_In_ PISAPNP_FDO_EXTENSION FdoExt, _Inout_ PIRP Irp, _In_ BOOLEAN IncludeDataPort)
Definition: isapnp.c:1054
VOID IsaPnpRemoveReadPortDO(_In_ PDEVICE_OBJECT Pdo)
Definition: isapnp.c:1042
#define TAG_ISAPNP
Definition: isapnp.h:26
VOID IsaPnpRemoveLogicalDeviceDO(_In_ PDEVICE_OBJECT Pdo)
Definition: pdo.c:823
@ dsStarted
Definition: isapnp.h:31
_In_ PIRP Irp
Definition: kse.h:79
#define _Inout_
Definition: no_sal2.h:162
#define _In_
Definition: no_sal2.h:158
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1306
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1261
#define IoCompleteRequest
Definition: irp.c:1272
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1657
#define IoCallDriver
Definition: irp.c:1257
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
Definition: pnpmgr.c:1772
@ Isa
Definition: restypes.h:123
Entry
Definition: section.c:5216
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
struct _IO_STACK_LOCATION::@5020::@5045 QueryDeviceRelations
union _IO_STACK_LOCATION::@1814 Parameters
PDEVICE_OBJECT Pdo
Definition: isapnp.h:52
PDEVICE_OBJECT Pdo
Definition: isapnpres.h:92
INTERFACE_TYPE LegacyBusType
Definition: iotypes.h:835
Definition: typedefs.h:120
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define IRP_MN_CANCEL_STOP_DEVICE
@ BusRelations
Definition: iotypes.h:2154
#define IRP_MN_QUERY_PNP_DEVICE_STATE
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:1006
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_QUERY_INTERFACE
#define IRP_MN_START_DEVICE
#define IRP_MN_REMOVE_DEVICE
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IRP_MN_QUERY_STOP_DEVICE
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION
Definition: iotypes.h:4443
#define IRP_MN_QUERY_REMOVE_DEVICE