ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

usbstor.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.