19 #define USB_STOR_TAG 'sbsu'
20 #define USB_MAXCHILDREN (16)
24 #define HTONS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
25 #define NTOHS(n) (((((unsigned short)(n) & 0xFF)) << 8) | (((unsigned short)(n) & 0xFF00) >> 8))
27 #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
28 ((((unsigned long)(n) & 0xFF00)) << 8) | \
29 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
30 ((((unsigned long)(n) & 0xFF000000)) >> 24))
33 #define NTOHL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \
34 ((((unsigned long)(n) & 0xFF00)) << 8) | \
35 ((((unsigned long)(n) & 0xFF0000)) >> 8) | \
36 ((((unsigned long)(n) & 0xFF000000)) >> 24))
38 #define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
39 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
41 typedef struct __COMMON_DEVICE_EXTENSION__
45 }USBSTOR_COMMON_DEVICE_EXTENSION
, *PUSBSTOR_COMMON_DEVICE_EXTENSION
;
49 USBSTOR_COMMON_DEVICE_EXTENSION Common
; // common device extension
51 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
52 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
53 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
54 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
55 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
56 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
57 PUSB_STRING_DESCRIPTOR SerialNumber
; // usb serial number
58 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
59 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
60 UCHAR BulkInPipeIndex
; // bulk in pipe index
61 UCHAR BulkOutPipeIndex
; // bulk out pipe index
62 UCHAR MaxLUN
; // max lun for device
63 PDEVICE_OBJECT ChildPDO
[16]; // max 16 child pdo devices
64 KSPIN_LOCK IrpListLock
; // irp list lock
65 LIST_ENTRY IrpListHead
; // irp list head
66 BOOLEAN IrpListFreeze
; // if true the irp list is freezed
67 BOOLEAN ResetInProgress
; // if hard reset is in progress
68 ULONG IrpPendingCount
; // count of irp pending
69 BOOLEAN SrbActive
; // debug field if srb is pending
70 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
74 USBSTOR_COMMON_DEVICE_EXTENSION Common
;
75 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
77 PVOID InquiryData
; // USB SCSI inquiry data
78 UCHAR Claimed
; // indicating if it has been claimed by upper driver
79 ULONG BlockLength
; // length of block
80 ULONG LastLogicBlockAddress
; // last block address
81 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
84 // max lun command identifier
86 #define USB_BULK_GET_MAX_LUN 0xFE
91 ULONG Signature
; // CBW signature
92 ULONG Tag
; // CBW Tag of operation
93 ULONG DataTransferLength
; // data transfer length
94 UCHAR Flags
; // CBW Flags endpoint direction
95 UCHAR LUN
; // lun unit
96 UCHAR CommandBlockLength
; // Command block length
97 UCHAR CommandBlock
[16];
100 C_ASSERT(sizeof(CBW
) == 31);
103 #define CBW_SIGNATURE 0x43425355
108 ULONG Signature
; // CSW signature
109 ULONG Tag
; // CSW tag
110 ULONG DataResidue
; // CSW data transfer diff
111 UCHAR Status
; // CSW status
114 //--------------------------------------------------------------------------------------------------------------------------------------------
116 // UFI INQUIRY command
120 UCHAR Code
; // operation code 0x12
121 UCHAR LUN
; // lun address
122 UCHAR PageCode
; // product data information, always 0x00
123 UCHAR Reserved
; // reserved 0x00
124 UCHAR AllocationLength
; // length of inquiry data to be returned, default 36 bytes
125 UCHAR Reserved1
[7]; //reserved bytes 0x00
126 }UFI_INQUIRY_CMD
, *PUFI_INQUIRY_CMD
;
128 C_ASSERT(sizeof(UFI_INQUIRY_CMD
) == 12);
130 #define UFI_INQUIRY_CMD_LEN 0x6
133 // UFI INQUIRY command response
137 UCHAR DeviceType
; // device type
138 UCHAR RMB
; // removable media bit
139 UCHAR Version
; // contains version 0x00
140 UCHAR Format
; // response format
141 UCHAR Length
; // additional length
142 UCHAR Reserved
[3]; // reserved
143 UCHAR Vendor
[8]; // vendor identification string
144 UCHAR Product
[16]; // product identification string
145 UCHAR Revision
[4]; // product revision code
146 }UFI_INQUIRY_RESPONSE
, *PUFI_INQUIRY_RESPONSE
;
148 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE
) == 36);
150 //--------------------------------------------------------------------------------------------------------------------------------------------
156 UCHAR Code
; // operation code
158 UCHAR LogicalBlockByte0
; // lba byte 0
159 UCHAR LogicalBlockByte1
; // lba byte 1
160 UCHAR LogicalBlockByte2
; // lba byte 2
161 UCHAR LogicalBlockByte3
; // lba byte 3
162 UCHAR Reserved
; // reserved 0x00
163 UCHAR ContiguousLogicBlocksByte0
; // msb contigious logic blocks byte
164 UCHAR ContiguousLogicBlocksByte1
; // msb contigious logic blocks
165 UCHAR Reserved1
[3]; // reserved 0x00
168 C_ASSERT(sizeof(UFI_READ_WRITE_CMD
) == 12);
170 #define UFI_READ_WRITE_CMD_LEN (0xA)
172 //--------------------------------------------------------------------------------------------------------------------------------------------
174 // UFI read capacity cmd
178 UCHAR Code
; // operation code 0x25
179 UCHAR LUN
; // lun address
180 UCHAR LBA
[4]; // logical block address, should be zero
181 UCHAR Reserved1
[2]; // reserved 0x00
182 UCHAR PMI
; // PMI = 0x00
183 UCHAR Reserved2
[3]; // reserved 0x00
184 }UFI_CAPACITY_CMD
, *PUFI_CAPACITY_CMD
;
186 C_ASSERT(sizeof(UFI_CAPACITY_CMD
) == 12);
188 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
191 // UFI Read Capcacity command response
195 ULONG LastLogicalBlockAddress
; // last logical block address
196 ULONG BlockLength
; // block length in bytes
197 }UFI_CAPACITY_RESPONSE
, *PUFI_CAPACITY_RESPONSE
;
199 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE
) == 8);
201 //--------------------------------------------------------------------------------------------------------------------------------------------
203 // UFI sense mode cmd
207 UCHAR Code
; // operation code
208 UCHAR LUN
; // lun address
209 UCHAR PageCode
:6; // page code selector
210 UCHAR PC
:2; // type of parameters to be returned
211 UCHAR Reserved
[4]; // reserved 0x00
212 USHORT AllocationLength
; // parameters length
214 }UFI_SENSE_CMD
, *PUFI_SENSE_CMD
;
216 C_ASSERT(sizeof(UFI_SENSE_CMD
) == 12);
218 #define UFI_SENSE_CMD_LEN (6)
222 USHORT ModeDataLength
; // length of parameters for sense cmd
223 UCHAR MediumTypeCode
; // 00 for mass storage, 0x94 for floppy
224 UCHAR WP
:1; // write protect bit
225 UCHAR Reserved1
:2; // reserved 00
226 UCHAR DPOFUA
:1; // should be zero
227 UCHAR Reserved2
:4; // reserved
228 UCHAR Reserved
[4]; // reserved
229 }UFI_MODE_PARAMETER_HEADER
, *PUFI_MODE_PARAMETER_HEADER
;
232 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER
) == 8);
242 }UFI_TIMER_PROTECT_PAGE
, *PUFI_TIMER_PROTECT_PAGE
;
243 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE
) == 8);
245 //--------------------------------------------------------------------------------------------------------------------------------------------
247 // UFI test unit command
252 UCHAR Code
; // operation code 0x00
254 UCHAR Reserved
[10]; // reserved 0x00
255 }UFI_TEST_UNIT_CMD
, *PUFI_TEST_UNIT_CMD
;
257 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD
) == 12);
259 #define UFI_TEST_UNIT_CMD_LEN (6)
270 ULONG TransferDataLength
;
272 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
273 PPDO_DEVICE_EXTENSION PDODeviceExtension
;
274 PMDL TransferBufferMDL
;
276 }IRP_CONTEXT
, *PIRP_CONTEXT
;
278 typedef struct _ERRORHANDLER_WORKITEM_DATA
280 PDEVICE_OBJECT DeviceObject
;
282 PIRP_CONTEXT Context
;
283 WORK_QUEUE_ITEM WorkQueueItem
;
284 } ERRORHANDLER_WORKITEM_DATA
, *PERRORHANDLER_WORKITEM_DATA
;
287 //---------------------------------------------------------------------
292 USBSTOR_FdoHandlePnp(
293 IN PDEVICE_OBJECT DeviceObject
,
296 //---------------------------------------------------------------------
301 USBSTOR_PdoHandlePnp(
302 IN PDEVICE_OBJECT DeviceObject
,
307 IN PDEVICE_OBJECT DeviceObject
,
308 OUT PDEVICE_OBJECT
*ChildDeviceObject
);
310 //---------------------------------------------------------------------
316 USBSTOR_SyncForwardIrp(
317 IN PDEVICE_OBJECT DeviceObject
,
322 USBSTOR_GetBusInterface(
323 IN PDEVICE_OBJECT DeviceObject
,
324 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
328 IN POOL_TYPE PoolType
,
336 USBSTOR_SyncUrbRequest(
337 IN PDEVICE_OBJECT DeviceObject
,
338 OUT PURB UrbRequest
);
342 IN PDEVICE_OBJECT DeviceObject
,
343 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
347 USBSTOR_SyncForwardIrpCompletionRoutine(
348 PDEVICE_OBJECT DeviceObject
,
353 //---------------------------------------------------------------------
355 // descriptor.c routines
359 USBSTOR_GetDescriptors(
360 IN PDEVICE_OBJECT DeviceObject
);
363 USBSTOR_SelectConfigurationAndInterface(
364 IN PDEVICE_OBJECT DeviceObject
,
365 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
368 USBSTOR_GetPipeHandles(
369 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
371 //---------------------------------------------------------------------
376 USBSTOR_HandleExecuteSCSI(
377 IN PDEVICE_OBJECT DeviceObject
,
381 USBSTOR_SendInquiryCmd(
382 IN PDEVICE_OBJECT DeviceObject
);
384 //---------------------------------------------------------------------
389 USBSTOR_HandleInternalDeviceControl(
390 IN PDEVICE_OBJECT DeviceObject
,
394 USBSTOR_HandleDeviceControl(
395 IN PDEVICE_OBJECT DeviceObject
,
398 //---------------------------------------------------------------------
405 PDEVICE_OBJECT DeviceObject
,
409 USBSTOR_QueueFlushIrps(
410 IN PDEVICE_OBJECT DeviceObject
);
413 USBSTOR_QueueRelease(
414 IN PDEVICE_OBJECT DeviceObject
);
418 IN PDEVICE_OBJECT DeviceObject
,
424 IN PDEVICE_OBJECT DeviceObject
,
428 USBSTOR_QueueInitialize(
429 PFDO_DEVICE_EXTENSION FDODeviceExtension
);
433 ErrorHandlerWorkItemRoutine(
437 USBSTOR_QueueNextRequest(
438 IN PDEVICE_OBJECT DeviceObject
);
441 USBSTOR_QueueTerminateRequest(
442 IN PDEVICE_OBJECT DeviceObject
,
443 IN BOOLEAN ModifySrbState
);