Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenusbstor.h
Go to the documentation of this file.
00001 00002 #pragma once 00003 00004 #include <ntddk.h> 00005 #define NDEBUG 00006 #include <debug.h> 00007 #include <usbdi.h> 00008 #include <hubbusif.h> 00009 #include <usbbusif.h> 00010 #include <usbioctl.h> 00011 #include <usbiodef.h> 00012 #include <usb.h> 00013 #include <usbdlib.h> 00014 #include <stdio.h> 00015 #include <wdmguid.h> 00016 #include <classpnp.h> 00017 #include <scsi.h> 00018 00019 #define USB_STOR_TAG 'sbsu' 00020 #define USB_MAXCHILDREN (16) 00021 00022 00023 00024 #define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8)) 00025 #define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8)) 00026 00027 #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ 00028 ((((unsigned long)(n) & 0xFF00)) << 8) | \ 00029 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \ 00030 ((((unsigned long)(n) & 0xFF000000)) >> 24)) 00031 00032 00033 #define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ 00034 ((((unsigned long)(n) & 0xFF00)) << 8) | \ 00035 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \ 00036 ((((unsigned long)(n) & 0xFF000000)) >> 24)) 00037 00038 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \ 00039 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH) 00040 00041 typedef struct __COMMON_DEVICE_EXTENSION__ 00042 { 00043 BOOLEAN IsFDO; 00044 00045 }USBSTOR_COMMON_DEVICE_EXTENSION, *PUSBSTOR_COMMON_DEVICE_EXTENSION; 00046 00047 typedef struct 00048 { 00049 USBSTOR_COMMON_DEVICE_EXTENSION Common; // common device extension 00050 00051 PDEVICE_OBJECT FunctionalDeviceObject; // functional device object 00052 PDEVICE_OBJECT PhysicalDeviceObject; // physical device object 00053 PDEVICE_OBJECT LowerDeviceObject; // lower device object 00054 USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device 00055 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor 00056 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor 00057 PUSB_STRING_DESCRIPTOR SerialNumber; // usb serial number 00058 PUSBD_INTERFACE_INFORMATION InterfaceInformation; // usb interface information 00059 USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle 00060 UCHAR BulkInPipeIndex; // bulk in pipe index 00061 UCHAR BulkOutPipeIndex; // bulk out pipe index 00062 UCHAR MaxLUN; // max lun for device 00063 PDEVICE_OBJECT ChildPDO[16]; // max 16 child pdo devices 00064 KSPIN_LOCK IrpListLock; // irp list lock 00065 LIST_ENTRY IrpListHead; // irp list head 00066 BOOLEAN IrpListFreeze; // if true the irp list is freezed 00067 BOOLEAN ResetInProgress; // if hard reset is in progress 00068 ULONG IrpPendingCount; // count of irp pending 00069 PSCSI_REQUEST_BLOCK ActiveSrb; // stores the current active SRB 00070 KEVENT NoPendingRequests; // set if no pending or in progress requests 00071 PSCSI_REQUEST_BLOCK LastTimerActiveSrb; // last timer tick active srb 00072 ULONG SrbErrorHandlingActive; // error handling of srb is activated 00073 ULONG TimerWorkQueueEnabled; // timer work queue enabled 00074 }FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; 00075 00076 typedef struct 00077 { 00078 USBSTOR_COMMON_DEVICE_EXTENSION Common; 00079 PDEVICE_OBJECT LowerDeviceObject; // points to FDO 00080 UCHAR LUN; // lun id 00081 PVOID InquiryData; // USB SCSI inquiry data 00082 PUCHAR FormatData; // USB SCSI Read Format Capacity Data 00083 UCHAR Claimed; // indicating if it has been claimed by upper driver 00084 ULONG BlockLength; // length of block 00085 ULONG LastLogicBlockAddress; // last block address 00086 PDEVICE_OBJECT *PDODeviceObject; // entry in pdo list 00087 PDEVICE_OBJECT Self; // self 00088 UCHAR MediumTypeCode; // floppy medium type code 00089 UCHAR IsFloppy; // is device floppy 00090 }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; 00091 00092 // 00093 // max lun command identifier 00094 // 00095 #define USB_BULK_GET_MAX_LUN 0xFE 00096 #define USB_BULK_RESET_DEVICE 0xFF 00097 00098 #include <pshpack1.h> 00099 typedef struct 00100 { 00101 ULONG Signature; // CBW signature 00102 ULONG Tag; // CBW Tag of operation 00103 ULONG DataTransferLength; // data transfer length 00104 UCHAR Flags; // CBW Flags endpoint direction 00105 UCHAR LUN; // lun unit 00106 UCHAR CommandBlockLength; // Command block length 00107 UCHAR CommandBlock[16]; 00108 }CBW, *PCBW; 00109 00110 C_ASSERT(sizeof(CBW) == 31); 00111 00112 00113 #define CBW_SIGNATURE 0x43425355 00114 #define CSW_SIGNATURE 0x53425355 00115 00116 #define MAX_LUN 0xF 00117 00118 typedef struct 00119 { 00120 ULONG Signature; // CSW signature 00121 ULONG Tag; // CSW tag 00122 ULONG DataResidue; // CSW data transfer diff 00123 UCHAR Status; // CSW status 00124 }CSW, *PCSW; 00125 00126 //-------------------------------------------------------------------------------------------------------------------------------------------- 00127 // 00128 // UFI INQUIRY command 00129 // 00130 typedef struct 00131 { 00132 UCHAR Code; // operation code 0x12 00133 UCHAR LUN; // lun address 00134 UCHAR PageCode; // product data information, always 0x00 00135 UCHAR Reserved; // reserved 0x00 00136 UCHAR AllocationLength; // length of inquiry data to be returned, default 36 bytes 00137 UCHAR Reserved1[7]; //reserved bytes 0x00 00138 }UFI_INQUIRY_CMD, *PUFI_INQUIRY_CMD; 00139 00140 C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12); 00141 00142 #define UFI_INQUIRY_CMD_LEN 0x6 00143 00144 // 00145 // UFI INQUIRY command response 00146 // 00147 typedef struct 00148 { 00149 UCHAR DeviceType; // device type 00150 UCHAR RMB; // removable media bit 00151 UCHAR Version; // contains version 0x00 00152 UCHAR Format; // response format 00153 UCHAR Length; // additional length 00154 UCHAR Reserved[3]; // reserved 00155 UCHAR Vendor[8]; // vendor identification string 00156 UCHAR Product[16]; // product identification string 00157 UCHAR Revision[4]; // product revision code 00158 }UFI_INQUIRY_RESPONSE, *PUFI_INQUIRY_RESPONSE; 00159 00160 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36); 00161 00162 //-------------------------------------------------------------------------------------------------------------------------------------------- 00163 // 00164 // UFI read cmd 00165 // 00166 typedef struct 00167 { 00168 UCHAR Code; // operation code 00169 UCHAR LUN; // lun 00170 UCHAR LogicalBlockByte0; // lba byte 0 00171 UCHAR LogicalBlockByte1; // lba byte 1 00172 UCHAR LogicalBlockByte2; // lba byte 2 00173 UCHAR LogicalBlockByte3; // lba byte 3 00174 UCHAR Reserved; // reserved 0x00 00175 UCHAR ContiguousLogicBlocksByte0; // msb contigious logic blocks byte 00176 UCHAR ContiguousLogicBlocksByte1; // msb contigious logic blocks 00177 UCHAR Reserved1[3]; // reserved 0x00 00178 }UFI_READ_WRITE_CMD; 00179 00180 C_ASSERT(sizeof(UFI_READ_WRITE_CMD) == 12); 00181 00182 #define UFI_READ_WRITE_CMD_LEN (0xA) 00183 00184 //-------------------------------------------------------------------------------------------------------------------------------------------- 00185 // 00186 // UFI read capacity cmd 00187 // 00188 typedef struct 00189 { 00190 UCHAR Code; // operation code 0x25 00191 UCHAR LUN; // lun address 00192 UCHAR LBA[4]; // logical block address, should be zero 00193 UCHAR Reserved1[2]; // reserved 0x00 00194 UCHAR PMI; // PMI = 0x00 00195 UCHAR Reserved2[3]; // reserved 0x00 00196 }UFI_CAPACITY_CMD, *PUFI_CAPACITY_CMD; 00197 00198 C_ASSERT(sizeof(UFI_CAPACITY_CMD) == 12); 00199 00200 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested 00201 00202 // 00203 // UFI Read Capcacity command response 00204 // 00205 typedef struct 00206 { 00207 ULONG LastLogicalBlockAddress; // last logical block address 00208 ULONG BlockLength; // block length in bytes 00209 }UFI_CAPACITY_RESPONSE, *PUFI_CAPACITY_RESPONSE; 00210 00211 #define UFI_READ_CAPACITY_CMD_LEN 0xA 00212 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE) == 8); 00213 00214 //-------------------------------------------------------------------------------------------------------------------------------------------- 00215 // 00216 // UFI sense mode cmd 00217 // 00218 typedef struct 00219 { 00220 UCHAR Code; // operation code 00221 UCHAR LUN; // lun address 00222 UCHAR PageCode:6; // page code selector 00223 UCHAR PC:2; // type of parameters to be returned 00224 UCHAR Reserved[4]; // reserved 0x00 00225 USHORT AllocationLength; // parameters length 00226 UCHAR Reserved1[3]; 00227 }UFI_SENSE_CMD, *PUFI_SENSE_CMD; 00228 00229 C_ASSERT(sizeof(UFI_SENSE_CMD) == 12); 00230 00231 #define UFI_SENSE_CMD_LEN (6) 00232 00233 typedef struct 00234 { 00235 USHORT ModeDataLength; // length of parameters for sense cmd 00236 UCHAR MediumTypeCode; // 00 for mass storage, 0x94 for floppy 00237 UCHAR WP:1; // write protect bit 00238 UCHAR Reserved1:2; // reserved 00 00239 UCHAR DPOFUA:1; // should be zero 00240 UCHAR Reserved2:4; // reserved 00241 UCHAR Reserved[4]; // reserved 00242 }UFI_MODE_PARAMETER_HEADER, *PUFI_MODE_PARAMETER_HEADER; 00243 00244 00245 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER) == 8); 00246 00247 typedef struct 00248 { 00249 UCHAR PC; 00250 UCHAR PageLength; 00251 UCHAR Reserved1; 00252 UCHAR ITM; 00253 UCHAR Flags; 00254 UCHAR Reserved[3]; 00255 }UFI_TIMER_PROTECT_PAGE, *PUFI_TIMER_PROTECT_PAGE; 00256 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE) == 8); 00257 00258 //-------------------------------------------------------------------------------------------------------------------------------------------- 00259 // 00260 // UFI read capacity cmd 00261 // 00262 00263 typedef struct 00264 { 00265 UCHAR Code; 00266 UCHAR LUN; 00267 UCHAR Reserved[5]; 00268 UCHAR AllocationLengthMsb; 00269 UCHAR AllocationLengthLsb; 00270 UCHAR Reserved1[3]; 00271 }UFI_READ_FORMAT_CAPACITY, *PUFI_READ_FORMAT_CAPACITY; 00272 00273 C_ASSERT(sizeof(UFI_READ_FORMAT_CAPACITY) == 12); 00274 00275 #define UFI_READ_FORMAT_CAPACITY_CMD_LEN (10) 00276 00277 typedef struct 00278 { 00279 UCHAR Reserved1; 00280 UCHAR Reserved2; 00281 UCHAR Reserved3; 00282 UCHAR CapacityLength; 00283 }UFI_CAPACITY_FORMAT_HEADER, *PUFI_CAPACITY_FORMAT_HEADER; 00284 00285 C_ASSERT(sizeof(UFI_CAPACITY_FORMAT_HEADER) == 4); 00286 00287 typedef struct 00288 { 00289 ULONG BlockCount; 00290 UCHAR Code; 00291 UCHAR BlockLengthByte0; 00292 UCHAR BlockLengthByte1; 00293 UCHAR BlockLengthByte2; 00294 }UFI_CAPACITY_DESCRIPTOR, *PUFI_CAPACITY_DESCRIPTOR; 00295 00296 #define UNFORMATED_MEDIA_CODE_DESCRIPTORY_TYPE (1) 00297 #define FORMAT_MEDIA_CODE_DESCRIPTOR_TYPE (2) 00298 #define CARTRIDGE_MEDIA_CODE_DESCRIPTOR_TYPE (3) 00299 00300 00301 00302 00303 //-------------------------------------------------------------------------------------------------------------------------------------------- 00304 // 00305 // UFI test unit command 00306 // 00307 00308 typedef struct 00309 { 00310 UCHAR Code; // operation code 0x00 00311 UCHAR LUN; // lun 00312 UCHAR Reserved[10]; // reserved 0x00 00313 }UFI_TEST_UNIT_CMD, *PUFI_TEST_UNIT_CMD; 00314 00315 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD) == 12); 00316 00317 #define UFI_TEST_UNIT_CMD_LEN (6) 00318 00319 typedef struct 00320 { 00321 union 00322 { 00323 PCBW cbw; 00324 PCSW csw; 00325 }; 00326 URB Urb; 00327 PIRP Irp; 00328 ULONG TransferDataLength; 00329 PUCHAR TransferData; 00330 PFDO_DEVICE_EXTENSION FDODeviceExtension; 00331 PPDO_DEVICE_EXTENSION PDODeviceExtension; 00332 PMDL TransferBufferMDL; 00333 ULONG ErrorIndex; 00334 ULONG RetryCount; 00335 }IRP_CONTEXT, *PIRP_CONTEXT; 00336 00337 typedef struct _ERRORHANDLER_WORKITEM_DATA 00338 { 00339 PDEVICE_OBJECT DeviceObject; 00340 PIRP_CONTEXT Context; 00341 WORK_QUEUE_ITEM WorkQueueItem; 00342 PIRP Irp; 00343 } ERRORHANDLER_WORKITEM_DATA, *PERRORHANDLER_WORKITEM_DATA; 00344 00345 00346 //--------------------------------------------------------------------- 00347 // 00348 // fdo.c routines 00349 // 00350 NTSTATUS 00351 USBSTOR_FdoHandlePnp( 00352 IN PDEVICE_OBJECT DeviceObject, 00353 IN OUT PIRP Irp); 00354 00355 //--------------------------------------------------------------------- 00356 // 00357 // pdo.c routines 00358 // 00359 NTSTATUS 00360 USBSTOR_PdoHandlePnp( 00361 IN PDEVICE_OBJECT DeviceObject, 00362 IN OUT PIRP Irp); 00363 00364 NTSTATUS 00365 USBSTOR_CreatePDO( 00366 IN PDEVICE_OBJECT DeviceObject, 00367 IN UCHAR LUN, 00368 OUT PDEVICE_OBJECT *ChildDeviceObject); 00369 00370 //--------------------------------------------------------------------- 00371 // 00372 // misc.c routines 00373 // 00374 NTSTATUS 00375 NTAPI 00376 USBSTOR_SyncForwardIrp( 00377 IN PDEVICE_OBJECT DeviceObject, 00378 IN OUT PIRP Irp); 00379 00380 NTSTATUS 00381 NTAPI 00382 USBSTOR_GetBusInterface( 00383 IN PDEVICE_OBJECT DeviceObject, 00384 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface); 00385 00386 PVOID 00387 AllocateItem( 00388 IN POOL_TYPE PoolType, 00389 IN ULONG ItemSize); 00390 00391 VOID 00392 FreeItem( 00393 IN PVOID Item); 00394 00395 NTSTATUS 00396 USBSTOR_SyncUrbRequest( 00397 IN PDEVICE_OBJECT DeviceObject, 00398 OUT PURB UrbRequest); 00399 00400 NTSTATUS 00401 USBSTOR_GetMaxLUN( 00402 IN PDEVICE_OBJECT DeviceObject, 00403 IN PFDO_DEVICE_EXTENSION DeviceExtension); 00404 00405 NTSTATUS 00406 NTAPI 00407 USBSTOR_SyncForwardIrpCompletionRoutine( 00408 PDEVICE_OBJECT DeviceObject, 00409 PIRP Irp, 00410 PVOID Context); 00411 00412 NTSTATUS 00413 USBSTOR_ResetDevice( 00414 IN PDEVICE_OBJECT DeviceObject, 00415 IN PFDO_DEVICE_EXTENSION DeviceExtension); 00416 00417 BOOLEAN 00418 USBSTOR_IsFloppy( 00419 IN PUCHAR Buffer, 00420 IN ULONG BufferLength, 00421 OUT PUCHAR MediumTypeCode); 00422 00423 //--------------------------------------------------------------------- 00424 // 00425 // descriptor.c routines 00426 // 00427 00428 NTSTATUS 00429 USBSTOR_GetDescriptors( 00430 IN PDEVICE_OBJECT DeviceObject); 00431 00432 NTSTATUS 00433 USBSTOR_SelectConfigurationAndInterface( 00434 IN PDEVICE_OBJECT DeviceObject, 00435 IN PFDO_DEVICE_EXTENSION DeviceExtension); 00436 00437 NTSTATUS 00438 USBSTOR_GetPipeHandles( 00439 IN PFDO_DEVICE_EXTENSION DeviceExtension); 00440 00441 //--------------------------------------------------------------------- 00442 // 00443 // scsi.c routines 00444 // 00445 NTSTATUS 00446 USBSTOR_HandleExecuteSCSI( 00447 IN PDEVICE_OBJECT DeviceObject, 00448 IN PIRP Irp, 00449 IN ULONG RetryCount); 00450 00451 NTSTATUS 00452 NTAPI 00453 USBSTOR_CSWCompletionRoutine( 00454 PDEVICE_OBJECT DeviceObject, 00455 PIRP Irp, 00456 PVOID Ctx); 00457 00458 NTSTATUS 00459 USBSTOR_SendCBW( 00460 PIRP_CONTEXT Context, 00461 PIRP Irp); 00462 00463 VOID 00464 USBSTOR_SendCSW( 00465 PIRP_CONTEXT Context, 00466 PIRP Irp); 00467 00468 00469 //--------------------------------------------------------------------- 00470 // 00471 // disk.c routines 00472 // 00473 NTSTATUS 00474 USBSTOR_HandleInternalDeviceControl( 00475 IN PDEVICE_OBJECT DeviceObject, 00476 IN PIRP Irp); 00477 00478 NTSTATUS 00479 USBSTOR_HandleDeviceControl( 00480 IN PDEVICE_OBJECT DeviceObject, 00481 IN PIRP Irp); 00482 00483 //--------------------------------------------------------------------- 00484 // 00485 // queue.c routines 00486 // 00487 VOID 00488 NTAPI 00489 USBSTOR_StartIo( 00490 PDEVICE_OBJECT DeviceObject, 00491 PIRP Irp); 00492 00493 VOID 00494 USBSTOR_QueueWaitForPendingRequests( 00495 IN PDEVICE_OBJECT DeviceObject); 00496 00497 VOID 00498 USBSTOR_QueueRelease( 00499 IN PDEVICE_OBJECT DeviceObject); 00500 00501 BOOLEAN 00502 USBSTOR_QueueAddIrp( 00503 IN PDEVICE_OBJECT DeviceObject, 00504 IN PIRP Irp); 00505 00506 VOID 00507 NTAPI 00508 USBSTOR_CancelIo( 00509 IN PDEVICE_OBJECT DeviceObject, 00510 IN PIRP Irp); 00511 00512 VOID 00513 USBSTOR_QueueInitialize( 00514 PFDO_DEVICE_EXTENSION FDODeviceExtension); 00515 00516 VOID 00517 NTAPI 00518 ErrorHandlerWorkItemRoutine( 00519 PVOID Context); 00520 00521 VOID 00522 NTAPI 00523 ResetHandlerWorkItemRoutine( 00524 PVOID Context); 00525 00526 00527 00528 VOID 00529 USBSTOR_QueueNextRequest( 00530 IN PDEVICE_OBJECT DeviceObject); 00531 00532 VOID 00533 USBSTOR_QueueTerminateRequest( 00534 IN PDEVICE_OBJECT DeviceObject, 00535 IN PIRP Irp); 00536 00537 /* error.c */ 00538 NTSTATUS 00539 USBSTOR_GetEndpointStatus( 00540 IN PDEVICE_OBJECT DeviceObject, 00541 IN UCHAR bEndpointAddress, 00542 OUT PUSHORT Value); 00543 00544 NTSTATUS 00545 USBSTOR_ResetPipeWithHandle( 00546 IN PDEVICE_OBJECT DeviceObject, 00547 IN USBD_PIPE_HANDLE PipeHandle); 00548 00549 VOID 00550 NTAPI 00551 USBSTOR_TimerRoutine( 00552 PDEVICE_OBJECT DeviceObject, 00553 PVOID Context); 00554 Generated on Sat May 26 2012 04:27:06 for ReactOS by
1.7.6.1
|