2 * PROJECT: ReactOS Universal Serial Bus Bulk Storage Driver
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: USB block storage device driver.
5 * COPYRIGHT: 2005-2006 James Tabor
6 * 2011-2012 Michael Martin (michael.martin@reactos.org)
7 * 2011-2013 Johannes Anderwald (johannes.anderwald@reactos.org)
19 IN PDRIVER_OBJECT DriverObject
,
20 IN PDEVICE_OBJECT PhysicalDeviceObject
)
23 PDEVICE_OBJECT DeviceObject
;
24 PFDO_DEVICE_EXTENSION DeviceExtension
;
26 Status
= IoCreateDevice(DriverObject
, sizeof(FDO_DEVICE_EXTENSION
), 0, FILE_DEVICE_BUS_EXTENDER
, FILE_AUTOGENERATED_DEVICE_NAME
| FILE_DEVICE_SECURE_OPEN
, FALSE
, &DeviceObject
);
27 if (!NT_SUCCESS(Status
))
29 DPRINT1("USBSTOR_AddDevice: Failed to create FDO Status %x\n", Status
);
33 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
34 ASSERT(DeviceExtension
);
35 RtlZeroMemory(DeviceExtension
, sizeof(FDO_DEVICE_EXTENSION
));
37 // initialize device extension
38 DeviceExtension
->Common
.IsFDO
= TRUE
;
39 DeviceExtension
->FunctionalDeviceObject
= DeviceObject
;
40 DeviceExtension
->PhysicalDeviceObject
= PhysicalDeviceObject
;
41 DeviceExtension
->LowerDeviceObject
= IoAttachDeviceToDeviceStack(DeviceObject
, PhysicalDeviceObject
);
43 IoInitializeTimer(DeviceObject
, USBSTOR_TimerRoutine
, (PVOID
)DeviceExtension
);
46 if (!DeviceExtension
->LowerDeviceObject
)
48 IoDeleteDevice(DeviceObject
);
50 return STATUS_DEVICE_REMOVED
;
53 DeviceObject
->Flags
|= DO_BUFFERED_IO
| DO_POWER_PAGABLE
;
55 // device is initialized
56 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
58 return STATUS_SUCCESS
;
64 PDRIVER_OBJECT DriverObject
)
71 USBSTOR_DispatchClose(
72 PDEVICE_OBJECT DeviceObject
,
75 // function always succeeds ;)
76 DPRINT("USBSTOR_DispatchClose\n");
77 Irp
->IoStatus
.Information
= 0;
78 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
79 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
80 return STATUS_SUCCESS
;
85 USBSTOR_DispatchDeviceControl(
86 PDEVICE_OBJECT DeviceObject
,
91 Status
= USBSTOR_HandleDeviceControl(DeviceObject
, Irp
);
92 Irp
->IoStatus
.Status
= Status
;
93 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
100 PDEVICE_OBJECT DeviceObject
,
103 return USBSTOR_HandleInternalDeviceControl(DeviceObject
, Irp
);
108 USBSTOR_DispatchReadWrite(
109 PDEVICE_OBJECT DeviceObject
,
112 // read write ioctl is not supported
113 Irp
->IoStatus
.Information
= 0;
114 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
115 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
116 return STATUS_INVALID_PARAMETER
;
122 PDEVICE_OBJECT DeviceObject
,
125 PUSBSTOR_COMMON_DEVICE_EXTENSION DeviceExtension
;
127 DeviceExtension
= (PUSBSTOR_COMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
129 if (DeviceExtension
->IsFDO
)
131 return USBSTOR_FdoHandlePnp(DeviceObject
, Irp
);
135 return USBSTOR_PdoHandlePnp(DeviceObject
, Irp
);
141 USBSTOR_DispatchPower(
142 PDEVICE_OBJECT DeviceObject
,
145 PFDO_DEVICE_EXTENSION DeviceExtension
;
147 // get common device extension
148 DeviceExtension
= (PFDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
150 if (DeviceExtension
->Common
.IsFDO
)
152 PoStartNextPowerIrp(Irp
);
153 IoSkipCurrentIrpStackLocation(Irp
);
154 return PoCallDriver(DeviceExtension
->LowerDeviceObject
, Irp
);
158 PoStartNextPowerIrp(Irp
);
159 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
160 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
161 return STATUS_SUCCESS
;
168 IN PDRIVER_OBJECT DriverObject
,
169 IN PUNICODE_STRING RegPath
)
172 DPRINT("********* USB Storage *********\n");
174 DriverObject
->DriverUnload
= USBSTOR_Unload
;
175 DriverObject
->DriverExtension
->AddDevice
= USBSTOR_AddDevice
;
176 DriverObject
->DriverStartIo
= USBSTOR_StartIo
;
177 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = USBSTOR_DispatchClose
;
178 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = USBSTOR_DispatchClose
;
179 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = USBSTOR_DispatchDeviceControl
; // scsi pass through requests
180 DriverObject
->MajorFunction
[IRP_MJ_READ
] = USBSTOR_DispatchReadWrite
;
181 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = USBSTOR_DispatchReadWrite
;
182 DriverObject
->MajorFunction
[IRP_MJ_SCSI
] = USBSTOR_DispatchScsi
;
183 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = USBSTOR_DispatchPnp
;
184 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = USBSTOR_DispatchPower
;
186 return STATUS_SUCCESS
;