xref: /reactos/drivers/usb/usbstor/usbstor.c (revision b0b03bfd)
1 /*
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.
6  * PROGRAMMERS:
7  *              James Tabor
8                 Johannes Anderwald
9  */
10 
11 /* INCLUDES ******************************************************************/
12 
13 #define NDEBUG
14 #define INITGUID
15 #include "usbstor.h"
16 
17 /* PUBLIC AND PRIVATE FUNCTIONS **********************************************/
18 
19 NTSTATUS
20 NTAPI
21 USBSTOR_AddDevice(
22     IN PDRIVER_OBJECT DriverObject,
23     IN PDEVICE_OBJECT PhysicalDeviceObject)
24 {
25     NTSTATUS Status;
26     PDEVICE_OBJECT DeviceObject;
27     PFDO_DEVICE_EXTENSION DeviceExtension;
28 
29     //
30     // lets create the device
31     //
32     Status = IoCreateDevice(DriverObject, sizeof(FDO_DEVICE_EXTENSION), 0, FILE_DEVICE_BUS_EXTENDER, FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN, FALSE, &DeviceObject);
33 
34     //
35     // check for success
36     //
37     if (!NT_SUCCESS(Status))
38     {
39         DPRINT1("USBSTOR_AddDevice: Failed to create FDO Status %x\n", Status);
40         return Status;
41     }
42 
43     //
44     // get device extension
45     //
46     DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
47     ASSERT(DeviceExtension);
48 
49     //
50     // zero device extension
51     //
52     RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
53 
54     //
55     // initialize device extension
56     //
57     DeviceExtension->Common.IsFDO = TRUE;
58     DeviceExtension->FunctionalDeviceObject = DeviceObject;
59     DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
60     DeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
61 
62     //
63     // did attaching fail
64     //
65     if (!DeviceExtension->LowerDeviceObject)
66     {
67         //
68         // device removed
69         //
70         IoDeleteDevice(DeviceObject);
71 
72         return STATUS_DEVICE_REMOVED;
73     }
74 
75     //
76     // set device flags
77     //
78     DeviceObject->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
79 
80     //
81     // device is initialized
82     //
83     DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
84 
85 
86     //
87     // done
88     //
89     return STATUS_SUCCESS;
90 }
91 
92 VOID
93 NTAPI
94 USBSTOR_Unload(
95     PDRIVER_OBJECT DriverObject)
96 {
97     //
98     // no-op
99     //
100 }
101 
102 VOID
103 NTAPI
104 USBSTOR_StartIo(
105     PDEVICE_OBJECT DeviceObject,
106     PIRP Irp)
107 {
108     //
109     // implement me
110     //
111     UNIMPLEMENTED
112 }
113 
114 NTSTATUS
115 NTAPI
116 USBSTOR_DispatchClose(
117     PDEVICE_OBJECT DeviceObject,
118     PIRP Irp)
119 {
120     //
121     // function always succeeds ;)
122     //
123     DPRINT1("USBSTOR_DispatchScsi\n");
124     Irp->IoStatus.Information = 0;
125     Irp->IoStatus.Status = STATUS_SUCCESS;
126     IoCompleteRequest(Irp, IO_NO_INCREMENT);
127     return STATUS_SUCCESS;
128 }
129 
130 
131 NTSTATUS
132 NTAPI
133 USBSTOR_DispatchDeviceControl(
134     PDEVICE_OBJECT DeviceObject,
135     PIRP Irp)
136 {
137     NTSTATUS Status;
138 
139     //
140     // handle requests
141     //
142     Status = USBSTOR_HandleDeviceControl(DeviceObject, Irp);
143 
144     //
145     // complete request
146     //
147     Irp->IoStatus.Status = Status;
148     IoCompleteRequest(Irp, IO_NO_INCREMENT);
149 
150     //
151     // done
152     //
153     return Status;
154 }
155 
156 
157 NTSTATUS
158 NTAPI
159 USBSTOR_DispatchScsi(
160     PDEVICE_OBJECT DeviceObject,
161     PIRP Irp)
162 {
163     NTSTATUS Status;
164 
165     //
166     // handle requests
167     //
168     return USBSTOR_HandleInternalDeviceControl(DeviceObject, Irp);
169 }
170 
171 NTSTATUS
172 NTAPI
173 USBSTOR_DispatchReadWrite(
174     PDEVICE_OBJECT DeviceObject,
175     PIRP Irp)
176 {
177     //
178     // read write ioctl is not supported
179     //
180     Irp->IoStatus.Information = 0;
181     Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
182     IoCompleteRequest(Irp, IO_NO_INCREMENT);
183     return STATUS_INVALID_PARAMETER;
184 }
185 
186 NTSTATUS
187 NTAPI
188 USBSTOR_DispatchPnp(
189     PDEVICE_OBJECT DeviceObject,
190     PIRP Irp)
191 {
192     PUSBSTOR_COMMON_DEVICE_EXTENSION DeviceExtension;
193 
194     //
195     // get common device extension
196     //
197     DeviceExtension = (PUSBSTOR_COMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
198 
199     //
200     // is it for the FDO
201     //
202     if (DeviceExtension->IsFDO)
203     {
204         //
205         // dispatch pnp request to fdo pnp handler
206         //
207         return USBSTOR_FdoHandlePnp(DeviceObject, Irp);
208     }
209     else
210     {
211         //
212         // dispatch request to pdo pnp handler
213         //
214         return USBSTOR_PdoHandlePnp(DeviceObject, Irp);
215     }
216 }
217 
218 NTSTATUS
219 NTAPI
220 USBSTOR_DispatchPower(
221     PDEVICE_OBJECT DeviceObject,
222     PIRP Irp)
223 {
224     UNIMPLEMENTED
225 
226     Irp->IoStatus.Information = 0;
227     Irp->IoStatus.Status = STATUS_SUCCESS;
228     IoCompleteRequest(Irp, IO_NO_INCREMENT);
229     return STATUS_SUCCESS;
230 }
231 
232 
233 
234 NTSTATUS
235 NTAPI
236 DriverEntry(
237     IN PDRIVER_OBJECT DriverObject,
238     IN PUNICODE_STRING RegPath)
239 {
240 
241     DPRINT1("********* USB Storage *********\n");
242 
243     //
244     // driver unload routine
245     //
246     DriverObject->DriverUnload = USBSTOR_Unload;
247 
248     //
249     // add device function
250     //
251     DriverObject->DriverExtension->AddDevice = USBSTOR_AddDevice;
252 
253     //
254     // FIXME: driver start i/o routine
255     //
256     //DriverObject->DriverStartIo = USBSTOR_StartIo;
257 
258 
259     //
260     // create / close
261     //
262     DriverObject->MajorFunction[IRP_MJ_CREATE] = USBSTOR_DispatchClose;
263     DriverObject->MajorFunction[IRP_MJ_CLOSE] = USBSTOR_DispatchClose;
264 
265     //
266     // scsi pass through requests
267     //
268     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBSTOR_DispatchDeviceControl;
269 
270     //
271     // irp dispatch read / write
272     //
273     DriverObject->MajorFunction[IRP_MJ_READ] = USBSTOR_DispatchReadWrite;
274     DriverObject->MajorFunction[IRP_MJ_WRITE] = USBSTOR_DispatchReadWrite;
275 
276     //
277     // scsi queue ioctl
278     //
279     DriverObject->MajorFunction[IRP_MJ_SCSI] = USBSTOR_DispatchScsi;
280 
281     //
282     // pnp processing
283     //
284     DriverObject->MajorFunction[IRP_MJ_PNP] = USBSTOR_DispatchPnp;
285 
286     //
287     // power processing
288     //
289     DriverObject->MajorFunction[IRP_MJ_POWER] = USBSTOR_DispatchPower;
290 
291     return STATUS_SUCCESS;
292 }
293 
294