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 MiniportInitialize(&DeviceExtension
->Miniport
,
45 /* Call the miniports FindAdapter function */
46 Status
= MiniportFindAdapter(&DeviceExtension
->Miniport
);
47 if (!NT_SUCCESS(Status
))
49 DPRINT1("MiniportFindAdapter() failed (Status 0x%08lx)\n", Status
);
53 /* Call the miniports HwInitialize function */
54 Status
= MiniportHwInitialize(&DeviceExtension
->Miniport
);
55 if (!NT_SUCCESS(Status
))
57 DPRINT1("MiniportHwInitialize() failed (Status 0x%08lx)\n", Status
);
61 return STATUS_SUCCESS
;
69 _In_ PFDO_DEVICE_EXTENSION DeviceExtension
,
74 DPRINT1("PortFdoStartDevice(%p %p)\n",
75 DeviceExtension
, Irp
);
77 ASSERT(DeviceExtension
->ExtensionType
== FdoExtension
);
79 /* Start the lower device if the FDO is in 'stopped' state */
80 if (DeviceExtension
->PnpState
== dsStopped
)
82 Status
= ForwardIrpAndWait(DeviceExtension
->LowerDevice
, Irp
);
83 if (!NT_SUCCESS(Status
))
85 DPRINT1("ForwardIrpAndWait() failed (Status 0x%08lx)\n", Status
);
90 /* Change to the 'started' state */
91 DeviceExtension
->PnpState
= dsStarted
;
93 /* Start the miniport (FindAdapter & Initialize) */
94 Status
= PortFdoStartMiniport(DeviceExtension
);
95 if (!NT_SUCCESS(Status
))
97 DPRINT1("FdoStartMiniport() failed (Status 0x%08lx)\n", Status
);
98 DeviceExtension
->PnpState
= dsStopped
;
107 PortFdoQueryBusRelations(
108 _In_ PFDO_DEVICE_EXTENSION DeviceExtension
,
109 _Out_ PULONG_PTR Information
)
111 NTSTATUS Status
= STATUS_SUCCESS
;;
113 DPRINT1("PortFdoQueryBusRelations(%p %p)\n",
114 DeviceExtension
, Information
);
125 _In_ PDEVICE_OBJECT DeviceObject
,
128 PFDO_DEVICE_EXTENSION DeviceExtension
;
129 PIO_STACK_LOCATION Stack
;
130 ULONG_PTR Information
= 0;
131 NTSTATUS Status
= STATUS_NOT_SUPPORTED
;
133 DPRINT1("PortFdoPnp(%p %p)\n",
136 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
137 ASSERT(DeviceExtension
);
138 ASSERT(DeviceExtension
->ExtensionType
== FdoExtension
);
140 Stack
= IoGetCurrentIrpStackLocation(Irp
);
142 switch (Stack
->MinorFunction
)
144 case IRP_MN_START_DEVICE
: /* 0x00 */
145 DPRINT1("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
146 Status
= PortFdoStartDevice(DeviceExtension
, Irp
);
149 case IRP_MN_QUERY_REMOVE_DEVICE
: /* 0x01 */
150 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE\n");
153 case IRP_MN_REMOVE_DEVICE
: /* 0x02 */
154 DPRINT1("IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
157 case IRP_MN_CANCEL_REMOVE_DEVICE
: /* 0x03 */
158 DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE\n");
161 case IRP_MN_STOP_DEVICE
: /* 0x04 */
162 DPRINT1("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n");
165 case IRP_MN_QUERY_STOP_DEVICE
: /* 0x05 */
166 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE\n");
169 case IRP_MN_CANCEL_STOP_DEVICE
: /* 0x06 */
170 DPRINT1("IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE\n");
173 case IRP_MN_QUERY_DEVICE_RELATIONS
: /* 0x07 */
174 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS\n");
175 switch (Stack
->Parameters
.QueryDeviceRelations
.Type
)
178 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
179 Status
= PortFdoQueryBusRelations(DeviceExtension
, &Information
);
182 case RemovalRelations
:
183 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
184 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
187 DPRINT1(" IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
188 Stack
->Parameters
.QueryDeviceRelations
.Type
);
189 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
193 case IRP_MN_FILTER_RESOURCE_REQUIREMENTS
: /* 0x0d */
194 DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
195 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
197 case IRP_MN_QUERY_PNP_DEVICE_STATE
: /* 0x14 */
198 DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE\n");
201 case IRP_MN_DEVICE_USAGE_NOTIFICATION
: /* 0x16 */
202 DPRINT1("IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION\n");
205 case IRP_MN_SURPRISE_REMOVAL
: /* 0x17 */
206 DPRINT1("IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL\n");
210 DPRINT1("IRP_MJ_PNP / Unknown IOCTL 0x%lx\n", Stack
->MinorFunction
);
211 return ForwardIrpAndForget(DeviceExtension
->LowerDevice
, Irp
);
214 Irp
->IoStatus
.Information
= Information
;
215 Irp
->IoStatus
.Status
= Status
;
216 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);