ReactOS 0.4.16-dev-297-gc569aee
usbstor.c
Go to the documentation of this file.
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#include "usbstor.h"
14
15#define NDEBUG
16#include <debug.h>
17
18/* PUBLIC AND PRIVATE FUNCTIONS **********************************************/
19
25{
28 PFDO_DEVICE_EXTENSION DeviceExtension;
29
30 //
31 // lets create the device
32 //
34
35 //
36 // check for success
37 //
38 if (!NT_SUCCESS(Status))
39 {
40 DPRINT1("USBSTOR_AddDevice: Failed to create FDO Status %x\n", Status);
41 return Status;
42 }
43
44 //
45 // get device extension
46 //
47 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
48 ASSERT(DeviceExtension);
49
50 //
51 // zero device extension
52 //
53 RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
54
55 //
56 // initialize device extension
57 //
58 DeviceExtension->Common.IsFDO = TRUE;
59 DeviceExtension->FunctionalDeviceObject = DeviceObject;
60 DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
61 DeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
62
63 //
64 // init timer
65 //
67
68 //
69 // did attaching fail
70 //
71 if (!DeviceExtension->LowerDeviceObject)
72 {
73 //
74 // device removed
75 //
77
79 }
80
81 //
82 // set device flags
83 //
85
86 //
87 // device is initialized
88 //
89 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
90
91
92 //
93 // done
94 //
95 return STATUS_SUCCESS;
96}
97
98VOID
102{
103 //
104 // no-op
105 //
106}
107
109NTAPI
112 PIRP Irp)
113{
114 //
115 // function always succeeds ;)
116 //
117 DPRINT("USBSTOR_DispatchClose\n");
118 Irp->IoStatus.Information = 0;
119 Irp->IoStatus.Status = STATUS_SUCCESS;
121 return STATUS_SUCCESS;
122}
123
124
126NTAPI
129 PIRP Irp)
130{
132
133 //
134 // handle requests
135 //
137
138 //
139 // complete request
140 //
141 Irp->IoStatus.Status = Status;
143
144 //
145 // done
146 //
147 return Status;
148}
149
150
152NTAPI
155 PIRP Irp)
156{
157 //
158 // handle requests
159 //
161}
162
164NTAPI
167 PIRP Irp)
168{
169 //
170 // read write ioctl is not supported
171 //
172 Irp->IoStatus.Information = 0;
173 Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
176}
177
179NTAPI
182 PIRP Irp)
183{
184 PUSBSTOR_COMMON_DEVICE_EXTENSION DeviceExtension;
185
186 //
187 // get common device extension
188 //
189 DeviceExtension = (PUSBSTOR_COMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
190
191 //
192 // is it for the FDO
193 //
194 if (DeviceExtension->IsFDO)
195 {
196 //
197 // dispatch pnp request to fdo pnp handler
198 //
200 }
201 else
202 {
203 //
204 // dispatch request to pdo pnp handler
205 //
207 }
208}
209
211NTAPI
214 PIRP Irp)
215{
216 PFDO_DEVICE_EXTENSION DeviceExtension;
217
218 // get common device extension
219 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
220
221 if (DeviceExtension->Common.IsFDO)
222 {
225 return PoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
226 }
227 else
228 {
230 Irp->IoStatus.Status = STATUS_SUCCESS;
232 return STATUS_SUCCESS;
233 }
234}
235
236
237
239NTAPI
242 IN PUNICODE_STRING RegPath)
243{
244
245 DPRINT("********* USB Storage *********\n");
246
247 //
248 // driver unload routine
249 //
250 DriverObject->DriverUnload = USBSTOR_Unload;
251
252 //
253 // add device function
254 //
255 DriverObject->DriverExtension->AddDevice = USBSTOR_AddDevice;
256
257 //
258 // driver start i/o routine
259 //
260 DriverObject->DriverStartIo = USBSTOR_StartIo;
261
262 //
263 // create / close
264 //
267
268 //
269 // scsi pass through requests
270 //
272
273 //
274 // irp dispatch read / write
275 //
278
279 //
280 // scsi queue ioctl
281 //
283
284 //
285 // pnp processing
286 //
288
289 //
290 // power processing
291 //
293
294 return STATUS_SUCCESS;
295}
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_DEVICE_REMOVED
Definition: d3dkmdt.h:39
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
DRIVER_INITIALIZE DriverEntry
Definition: condrv.c:21
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
NTSTATUS USBSTOR_HandleInternalDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: disk.c:81
NTSTATUS USBSTOR_HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: disk.c:413
VOID NTAPI USBSTOR_TimerRoutine(PDEVICE_OBJECT DeviceObject, PVOID Context)
Definition: error.c:205
VOID NTAPI USBSTOR_StartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: queue.c:300
#define DO_BUFFERED_IO
Definition: env_spec_w32.h:394
Status
Definition: gdiplustypes.h:25
NTSTATUS NTAPI IoInitializeTimer(IN PDEVICE_OBJECT DeviceObject, IN PIO_TIMER_ROUTINE TimerRoutine, IN PVOID Context)
Definition: iotimer.c:92
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
#define FILE_AUTOGENERATED_DEVICE_NAME
Definition: iotypes.h:138
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:966
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define IoCompleteRequest
Definition: irp.c:1240
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758
#define FILE_DEVICE_BUS_EXTENDER
Definition: winioctl.h:87
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_READ
Definition: rdpdr.c:46
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_WRITE
Definition: rdpdr.c:47
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:73
COMMON_DEVICE_EXTENSION Common
Definition: pci.h:84
#define NTAPI
Definition: typedefs.h:36
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
NTSTATUS USBSTOR_FdoHandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
Definition: fdo.c:276
NTSTATUS USBSTOR_PdoHandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
Definition: pdo.c:534
VOID NTAPI USBSTOR_Unload(PDRIVER_OBJECT DriverObject)
Definition: usbstor.c:65
NTSTATUS NTAPI USBSTOR_DispatchReadWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: usbstor.c:110
NTSTATUS NTAPI USBSTOR_DispatchClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: usbstor.c:73
NTSTATUS NTAPI USBSTOR_DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: usbstor.c:123
NTSTATUS NTAPI USBSTOR_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
Definition: usbstor.c:18
NTSTATUS NTAPI USBSTOR_DispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: usbstor.c:87
NTSTATUS NTAPI USBSTOR_DispatchPower(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: usbstor.c:162
NTSTATUS NTAPI USBSTOR_DispatchScsi(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: usbstor.c:101
struct __COMMON_DEVICE_EXTENSION__ * PUSBSTOR_COMMON_DEVICE_EXTENSION
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define IRP_MJ_SCSI
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define DO_POWER_PAGABLE
#define IRP_MJ_POWER