ReactOS 0.4.15-dev-8235-gcd88a97
usbstor.c
Go to the documentation of this file.
1/*
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)
8 */
9
10#include "usbstor.h"
11
12#define NDEBUG
13#include <debug.h>
14
15
21{
24 PFDO_DEVICE_EXTENSION DeviceExtension;
25
27 if (!NT_SUCCESS(Status))
28 {
29 DPRINT1("USBSTOR_AddDevice: Failed to create FDO Status %x\n", Status);
30 return Status;
31 }
32
33 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
34 ASSERT(DeviceExtension);
35 RtlZeroMemory(DeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
36
37 // initialize device extension
38 DeviceExtension->Common.IsFDO = TRUE;
39 DeviceExtension->FunctionalDeviceObject = DeviceObject;
40 DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
41 DeviceExtension->LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
42
43 KeInitializeSpinLock(&DeviceExtension->CommonLock);
44
46
47 // did attaching fail
48 if (!DeviceExtension->LowerDeviceObject)
49 {
51
53 }
54
56
57 // device is initialized
58 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
59
60 return STATUS_SUCCESS;
61}
62
63VOID
67{
68 // no-op
69}
70
75 PIRP Irp)
76{
77 // function always succeeds ;)
78 DPRINT("USBSTOR_DispatchClose\n");
79 Irp->IoStatus.Information = 0;
80 Irp->IoStatus.Status = STATUS_SUCCESS;
82 return STATUS_SUCCESS;
83}
84
89 PIRP Irp)
90{
92
94 Irp->IoStatus.Status = Status;
96 return Status;
97}
98
100NTAPI
103 PIRP Irp)
104{
106}
107
109NTAPI
112 PIRP Irp)
113{
114 // read write ioctl is not supported
115 Irp->IoStatus.Information = 0;
116 Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
119}
120
122NTAPI
125 PIRP Irp)
126{
127 PUSBSTOR_COMMON_DEVICE_EXTENSION DeviceExtension;
128
129 DeviceExtension = (PUSBSTOR_COMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
130
131 if (DeviceExtension->IsFDO)
132 {
134 }
135 else
136 {
138 }
139}
140
142NTAPI
145 IN PIRP Irp)
146{
149
150 if (DeviceExtension->IsFDO)
151 {
152 return IoCallDriver(((PFDO_DEVICE_EXTENSION)DeviceExtension)->LowerDeviceObject, Irp);
153 }
154 else
155 {
156 return IoCallDriver(((PPDO_DEVICE_EXTENSION)DeviceExtension)->LowerDeviceObject, Irp);
157 }
158}
159
161NTAPI
164 PIRP Irp)
165{
166 PFDO_DEVICE_EXTENSION DeviceExtension;
167
168 // get common device extension
169 DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
170
171 if (DeviceExtension->Common.IsFDO)
172 {
175 return PoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
176 }
177 else
178 {
180 Irp->IoStatus.Status = STATUS_SUCCESS;
182 return STATUS_SUCCESS;
183 }
184}
185
187NTAPI
190 IN PUNICODE_STRING RegPath)
191{
192
193 DPRINT("********* USB Storage *********\n");
194
195 DriverObject->DriverUnload = USBSTOR_Unload;
196 DriverObject->DriverExtension->AddDevice = USBSTOR_AddDevice;
197 DriverObject->DriverStartIo = USBSTOR_StartIo;
200 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBSTOR_DispatchDeviceControl; // scsi pass through requests
207
208 return STATUS_SUCCESS;
209}
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_z_ PCCHAR _In_ PDEVICE_OBJECT LowerDeviceObject
Definition: classpnp.h:983
_In_ PIRP Irp
Definition: csq.h:116
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
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
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
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
#define IoCallDriver
Definition: irp.c:1225
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
Definition: power.c:758
#define STATUS_DEVICE_REMOVED
Definition: ntstatus.h:809
#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:282
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_DispatchSystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: usbstor.c:143
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_SYSTEM_CONTROL
#define IRP_MJ_POWER