2 * PROJECT: ReactOS Storport Driver
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Storport FDO code
5 * COPYRIGHT: Copyright 2017 Eric Kohl (eric.kohl@reactos.org)
8 /* INCLUDES *******************************************************************/
16 /* FUNCTIONS ******************************************************************/
21 _In_ PFDO_DEVICE_EXTENSION DeviceExtension
)
23 PHW_INITIALIZATION_DATA InitData
;
24 INTERFACE_TYPE InterfaceType
;
27 DPRINT1("PortFdoStartDevice(%p)\n", DeviceExtension
);
29 /* Get the interface type of the lower device */
30 InterfaceType
= GetBusInterface(DeviceExtension
->LowerDevice
);
31 if (InterfaceType
== InterfaceTypeUndefined
)
32 return STATUS_NO_SUCH_DEVICE
;
34 /* Get the driver init data for the given interface type */
35 InitData
= PortGetDriverInitData(DeviceExtension
->DriverExtension
,
38 return STATUS_NO_SUCH_DEVICE
;
40 /* Initialize the miniport */
41 Status
= MiniportInitialize(&DeviceExtension
->Miniport
,
44 if (!NT_SUCCESS(Status
))
46 DPRINT1("MiniportInitialize() failed (Status 0x%08lx)\n", Status
);
50 /* Call the miniports FindAdapter function */
51 Status
= MiniportFindAdapter(&DeviceExtension
->Miniport
);
52 if (!NT_SUCCESS(Status
))
54 DPRINT1("MiniportFindAdapter() failed (Status 0x%08lx)\n", Status
);
58 /* Call the miniports HwInitialize function */
59 Status
= MiniportHwInitialize(&DeviceExtension
->Miniport
);
60 if (!NT_SUCCESS(Status
))
62 DPRINT1("MiniportHwInitialize() failed (Status 0x%08lx)\n", Status
);
66 return STATUS_SUCCESS
;
74 _In_ PFDO_DEVICE_EXTENSION DeviceExtension
,
79 DPRINT1("PortFdoStartDevice(%p %p)\n",
80 DeviceExtension
, Irp
);
82 ASSERT(DeviceExtension
->ExtensionType
== FdoExtension
);
84 /* Start the lower device if the FDO is in 'stopped' state */
85 if (DeviceExtension
->PnpState
== dsStopped
)
87 Status
= ForwardIrpAndWait(DeviceExtension
->LowerDevice
, Irp
);
88 if (!NT_SUCCESS(Status
))
90 DPRINT1("ForwardIrpAndWait() failed (Status 0x%08lx)\n", Status
);
95 /* Change to the 'started' state */
96 DeviceExtension
->PnpState
= dsStarted
;
98 /* Start the miniport (FindAdapter & Initialize) */
99 Status
= PortFdoStartMiniport(DeviceExtension
);
100 if (!NT_SUCCESS(Status
))
102 DPRINT1("FdoStartMiniport() failed (Status 0x%08lx)\n", Status
);
103 DeviceExtension
->PnpState
= dsStopped
;
112 PortFdoQueryBusRelations(
113 _In_ PFDO_DEVICE_EXTENSION DeviceExtension
,
114 _Out_ PULONG_PTR Information
)
116 NTSTATUS Status
= STATUS_SUCCESS
;;
118 DPRINT1("PortFdoQueryBusRelations(%p %p)\n",
119 DeviceExtension
, Information
);
129 PortFdoFilterRequirements(
130 PFDO_DEVICE_EXTENSION DeviceExtension
,
133 PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList
;
135 DPRINT1("PortFdoFilterRequirements(%p %p)\n", DeviceExtension
, Irp
);
137 /* Get the bus number and the slot number */
138 RequirementsList
=(PIO_RESOURCE_REQUIREMENTS_LIST
)Irp
->IoStatus
.Information
;
139 if (RequirementsList
!= NULL
)
141 DeviceExtension
->BusNumber
= RequirementsList
->BusNumber
;
142 DeviceExtension
->SlotNumber
= RequirementsList
->SlotNumber
;
145 return STATUS_SUCCESS
;
152 _In_ PDEVICE_OBJECT DeviceObject
,
155 PFDO_DEVICE_EXTENSION DeviceExtension
;
156 PIO_STACK_LOCATION Stack
;
157 ULONG_PTR Information
= 0;
158 NTSTATUS Status
= STATUS_NOT_SUPPORTED
;
160 DPRINT1("PortFdoPnp(%p %p)\n",
163 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
164 ASSERT(DeviceExtension
);
165 ASSERT(DeviceExtension
->ExtensionType
== FdoExtension
);
167 Stack
= IoGetCurrentIrpStackLocation(Irp
);
169 switch (Stack
->MinorFunction
)
171 case IRP_MN_START_DEVICE
: /* 0x00 */
172 DPRINT1("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
173 Status
= PortFdoStartDevice(DeviceExtension
, Irp
);
176 case IRP_MN_QUERY_REMOVE_DEVICE
: /* 0x01 */
177 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE\n");
180 case IRP_MN_REMOVE_DEVICE
: /* 0x02 */
181 DPRINT1("IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
184 case IRP_MN_CANCEL_REMOVE_DEVICE
: /* 0x03 */
185 DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE\n");
188 case IRP_MN_STOP_DEVICE
: /* 0x04 */
189 DPRINT1("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
192 case IRP_MN_QUERY_STOP_DEVICE
: /* 0x05 */
193 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE\n");
196 case IRP_MN_CANCEL_STOP_DEVICE
: /* 0x06 */
197 DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE\n");
200 case IRP_MN_QUERY_DEVICE_RELATIONS
: /* 0x07 */
201 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
202 switch (Stack
->Parameters
.QueryDeviceRelations
.Type
)
205 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
206 Status
= PortFdoQueryBusRelations(DeviceExtension
, &Information
);
209 case RemovalRelations
:
210 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
211 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
214 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
215 Stack
->Parameters
.QueryDeviceRelations
.Type
);
216 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
220 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
: /* 0x0d */
221 DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
222 PortFdoFilterRequirements(DeviceExtension
, Irp
);
223 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
225 case IRP_MN_QUERY_PNP_DEVICE_STATE
: /* 0x14 */
226 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
229 case IRP_MN_DEVICE_USAGE_NOTIFICATION
: /* 0x16 */
230 DPRINT1("IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
233 case IRP_MN_SURPRISE_REMOVAL
: /* 0x17 */
234 DPRINT1("IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL\n");
238 DPRINT1("IRP_MJ_PNP / Unknown IOCTL 0x%lx\n", Stack
->MinorFunction
);
239 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
242 Irp
->IoStatus
.Information
= Information
;
243 Irp
->IoStatus
.Status
= Status
;
244 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);