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 if (!DeviceExtension
->LowerDeviceObject
)
70 IoDeleteDevice(DeviceObject
);
72 return STATUS_DEVICE_REMOVED
;
78 DeviceObject
->Flags
|= DO_BUFFERED_IO
| DO_POWER_PAGABLE
;
81 // device is initialized
83 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
89 return STATUS_SUCCESS
;
95 PDRIVER_OBJECT DriverObject
)
104 USBSTOR_DispatchClose(
105 PDEVICE_OBJECT DeviceObject
,
109 // function always succeeds ;)
111 DPRINT1("USBSTOR_DispatchScsi\n");
112 Irp
->IoStatus
.Information
= 0;
113 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
114 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
115 return STATUS_SUCCESS
;
121 USBSTOR_DispatchDeviceControl(
122 PDEVICE_OBJECT DeviceObject
,
130 Status
= USBSTOR_HandleDeviceControl(DeviceObject
, Irp
);
135 Irp
->IoStatus
.Status
= Status
;
136 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
147 USBSTOR_DispatchScsi(
148 PDEVICE_OBJECT DeviceObject
,
154 return USBSTOR_HandleInternalDeviceControl(DeviceObject
, Irp
);
159 USBSTOR_DispatchReadWrite(
160 PDEVICE_OBJECT DeviceObject
,
164 // read write ioctl is not supported
166 Irp
->IoStatus
.Information
= 0;
167 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
168 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
169 return STATUS_INVALID_PARAMETER
;
175 PDEVICE_OBJECT DeviceObject
,
178 PUSBSTOR_COMMON_DEVICE_EXTENSION DeviceExtension
;
181 // get common device extension
183 DeviceExtension
= (PUSBSTOR_COMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
188 if (DeviceExtension
->IsFDO
)
191 // dispatch pnp request to fdo pnp handler
193 return USBSTOR_FdoHandlePnp(DeviceObject
, Irp
);
198 // dispatch request to pdo pnp handler
200 return USBSTOR_PdoHandlePnp(DeviceObject
, Irp
);
206 USBSTOR_DispatchPower(
207 PDEVICE_OBJECT DeviceObject
,
212 Irp
->IoStatus
.Information
= 0;
213 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
214 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
215 return STATUS_SUCCESS
;
223 IN PDRIVER_OBJECT DriverObject
,
224 IN PUNICODE_STRING RegPath
)
227 DPRINT1("********* USB Storage *********\n");
230 // driver unload routine
232 DriverObject
->DriverUnload
= USBSTOR_Unload
;
235 // add device function
237 DriverObject
->DriverExtension
->AddDevice
= USBSTOR_AddDevice
;
240 // driver start i/o routine
242 DriverObject
->DriverStartIo
= USBSTOR_StartIo
;
247 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBSTOR_DispatchClose
;
248 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBSTOR_DispatchClose
;
251 // scsi pass through requests
253 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBSTOR_DispatchDeviceControl
;
256 // irp dispatch read / write
258 DriverObject
->MajorFunction
[IRP_MJ_READ
] = USBSTOR_DispatchReadWrite
;
259 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = USBSTOR_DispatchReadWrite
;
264 DriverObject
->MajorFunction
[IRP_MJ_SCSI
] = USBSTOR_DispatchScsi
;
269 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBSTOR_DispatchPnp
;
274 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = USBSTOR_DispatchPower
;
276 return STATUS_SUCCESS
;