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