2 * PROJECT: ReactOS Universal Serial Bus Bulk Storage Driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbstor/usbstor.c
5 * PURPOSE: USB block storage device driver.
11 /* INCLUDES ******************************************************************/
17 /* PUBLIC AND PRIVATE FUNCTIONS **********************************************/
22 IN PDRIVER_OBJECT DriverObject
,
23 IN PDEVICE_OBJECT PhysicalDeviceObject
)
26 PDEVICE_OBJECT DeviceObject
;
27 PFDO_DEVICE_EXTENSION DeviceExtension
;
30 // lets create the device
32 Status
= IoCreateDevice(DriverObject
, sizeof(FDO_DEVICE_EXTENSION
), 0, FILE_DEVICE_BUS_EXTENDER
, FILE_AUTOGENERATED_DEVICE_NAME
| FILE_DEVICE_SECURE_OPEN
, FALSE
, &DeviceObject
);
37 if (!NT_SUCCESS(Status
))
39 DPRINT1("USBSTOR_AddDevice: Failed to create FDO Status %x\n", Status
);
44 // get device extension
46 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
47 ASSERT(DeviceExtension
);
50 // zero device extension
52 RtlZeroMemory(DeviceExtension
, sizeof(FDO_DEVICE_EXTENSION
));
55 // initialize device extension
57 DeviceExtension
->Common
.IsFDO
= TRUE
;
58 DeviceExtension
->FunctionalDeviceObject
= DeviceObject
;
59 DeviceExtension
->PhysicalDeviceObject
= PhysicalDeviceObject
;
60 DeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
65 IoInitializeTimer(DeviceObject
, USBSTOR_TimerRoutine
, (PVOID
)DeviceExtension
);
70 if (!DeviceExtension
->LowerDeviceObject
)
75 IoDeleteDevice(DeviceObject
);
77 return STATUS_DEVICE_REMOVED
;
83 DeviceObject
->Flags
|= DO_BUFFERED_IO
| DO_POWER_PAGABLE
;
86 // device is initialized
88 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
94 return STATUS_SUCCESS
;
100 PDRIVER_OBJECT DriverObject
)
109 USBSTOR_DispatchClose(
110 PDEVICE_OBJECT DeviceObject
,
114 // function always succeeds ;)
116 DPRINT("USBSTOR_DispatchClose\n");
117 Irp
->IoStatus
.Information
= 0;
118 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
119 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
120 return STATUS_SUCCESS
;
126 USBSTOR_DispatchDeviceControl(
127 PDEVICE_OBJECT DeviceObject
,
135 Status
= USBSTOR_HandleDeviceControl(DeviceObject
, Irp
);
140 Irp
->IoStatus
.Status
= Status
;
141 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
152 USBSTOR_DispatchScsi(
153 PDEVICE_OBJECT DeviceObject
,
159 return USBSTOR_HandleInternalDeviceControl(DeviceObject
, Irp
);
164 USBSTOR_DispatchReadWrite(
165 PDEVICE_OBJECT DeviceObject
,
169 // read write ioctl is not supported
171 Irp
->IoStatus
.Information
= 0;
172 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
173 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
174 return STATUS_INVALID_PARAMETER
;
180 PDEVICE_OBJECT DeviceObject
,
183 PUSBSTOR_COMMON_DEVICE_EXTENSION DeviceExtension
;
186 // get common device extension
188 DeviceExtension
= (PUSBSTOR_COMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
193 if (DeviceExtension
->IsFDO
)
196 // dispatch pnp request to fdo pnp handler
198 return USBSTOR_FdoHandlePnp(DeviceObject
, Irp
);
203 // dispatch request to pdo pnp handler
205 return USBSTOR_PdoHandlePnp(DeviceObject
, Irp
);
211 USBSTOR_DispatchPower(
212 PDEVICE_OBJECT DeviceObject
,
215 PFDO_DEVICE_EXTENSION DeviceExtension
;
217 // get common device extension
218 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
220 if (DeviceExtension
->Common
.IsFDO
)
222 PoStartNextPowerIrp(Irp
);
223 IoSkipCurrentIrpStackLocation(Irp
);
224 return PoCallDriver(DeviceExtension
->LowerDeviceObject
, Irp
);
228 PoStartNextPowerIrp(Irp
);
229 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
230 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
231 return STATUS_SUCCESS
;
240 IN PDRIVER_OBJECT DriverObject
,
241 IN PUNICODE_STRING RegPath
)
244 DPRINT("********* USB Storage *********\n");
247 // driver unload routine
249 DriverObject
->DriverUnload
= USBSTOR_Unload
;
252 // add device function
254 DriverObject
->DriverExtension
->AddDevice
= USBSTOR_AddDevice
;
257 // driver start i/o routine
259 DriverObject
->DriverStartIo
= USBSTOR_StartIo
;
264 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBSTOR_DispatchClose
;
265 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBSTOR_DispatchClose
;
268 // scsi pass through requests
270 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBSTOR_DispatchDeviceControl
;
273 // irp dispatch read / write
275 DriverObject
->MajorFunction
[IRP_MJ_READ
] = USBSTOR_DispatchReadWrite
;
276 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = USBSTOR_DispatchReadWrite
;
281 DriverObject
->MajorFunction
[IRP_MJ_SCSI
] = USBSTOR_DispatchScsi
;
286 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBSTOR_DispatchPnp
;
291 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = USBSTOR_DispatchPower
;
293 return STATUS_SUCCESS
;