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)
42 IoAttachDeviceToDeviceStackSafe(
43 IN PDEVICE_OBJECT SourceDevice
,
44 IN PDEVICE_OBJECT TargetDevice
,
45 OUT PDEVICE_OBJECT
*AttachedToDeviceObject
);
47 typedef struct __COMMON_DEVICE_EXTENSION__
51 }USBSTOR_COMMON_DEVICE_EXTENSION
, *PUSBSTOR_COMMON_DEVICE_EXTENSION
;
55 USBSTOR_COMMON_DEVICE_EXTENSION Common
; // common device extension
57 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
58 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
59 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
60 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
61 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
62 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
63 PUSB_STRING_DESCRIPTOR SerialNumber
; // usb serial number
64 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
65 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
66 UCHAR BulkInPipeIndex
; // bulk in pipe index
67 UCHAR BulkOutPipeIndex
; // bulk out pipe index
68 UCHAR MaxLUN
; // max lun for device
69 PDEVICE_OBJECT ChildPDO
[16]; // max 16 child pdo devices
70 KSPIN_LOCK IrpListLock
; // irp list lock
71 LIST_ENTRY IrpListHead
; // irp list head
72 BOOLEAN IrpListFreeze
; // if true the irp list is freezed
73 BOOLEAN ResetInProgress
; // if hard reset is in progress
74 ULONG IrpPendingCount
; // count of irp pending
75 BOOLEAN SrbActive
; // debug field if srb is pending
76 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
80 USBSTOR_COMMON_DEVICE_EXTENSION Common
;
81 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
83 PVOID InquiryData
; // USB SCSI inquiry data
84 UCHAR Claimed
; // indicating if it has been claimed by upper driver
85 ULONG BlockLength
; // length of block
86 ULONG LastLogicBlockAddress
; // last block address
87 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
90 // max lun command identifier
92 #define USB_BULK_GET_MAX_LUN 0xFE
97 ULONG Signature
; // CBW signature
98 ULONG Tag
; // CBW Tag of operation
99 ULONG DataTransferLength
; // data transfer length
100 UCHAR Flags
; // CBW Flags endpoint direction
101 UCHAR LUN
; // lun unit
102 UCHAR CommandBlockLength
; // Command block length
103 UCHAR CommandBlock
[16];
106 C_ASSERT(sizeof(CBW
) == 31);
109 #define CBW_SIGNATURE 0x43425355
114 ULONG Signature
; // CSW signature
115 ULONG Tag
; // CSW tag
116 ULONG DataResidue
; // CSW data transfer diff
117 UCHAR Status
; // CSW status
120 //--------------------------------------------------------------------------------------------------------------------------------------------
122 // UFI INQUIRY command
126 UCHAR Code
; // operation code 0x12
127 UCHAR LUN
; // lun address
128 UCHAR PageCode
; // product data information, always 0x00
129 UCHAR Reserved
; // reserved 0x00
130 UCHAR AllocationLength
; // length of inquiry data to be returned, default 36 bytes
131 UCHAR Reserved1
[7]; //reserved bytes 0x00
132 }UFI_INQUIRY_CMD
, *PUFI_INQUIRY_CMD
;
134 C_ASSERT(sizeof(UFI_INQUIRY_CMD
) == 12);
136 #define UFI_INQUIRY_CMD_LEN 0x6
139 // UFI INQUIRY command response
143 UCHAR DeviceType
; // device type
144 UCHAR RMB
; // removable media bit
145 UCHAR Version
; // contains version 0x00
146 UCHAR Format
; // response format
147 UCHAR Length
; // additional length
148 UCHAR Reserved
[3]; // reserved
149 UCHAR Vendor
[8]; // vendor identification string
150 UCHAR Product
[16]; // product identification string
151 UCHAR Revision
[4]; // product revision code
152 }UFI_INQUIRY_RESPONSE
, *PUFI_INQUIRY_RESPONSE
;
154 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE
) == 36);
156 //--------------------------------------------------------------------------------------------------------------------------------------------
162 UCHAR Code
; // operation code
164 UCHAR LogicalBlockByte0
; // lba byte 0
165 UCHAR LogicalBlockByte1
; // lba byte 1
166 UCHAR LogicalBlockByte2
; // lba byte 2
167 UCHAR LogicalBlockByte3
; // lba byte 3
168 UCHAR Reserved
; // reserved 0x00
169 UCHAR ContiguousLogicBlocksByte0
; // msb contigious logic blocks byte
170 UCHAR ContiguousLogicBlocksByte1
; // msb contigious logic blocks
171 UCHAR Reserved1
[3]; // reserved 0x00
174 C_ASSERT(sizeof(UFI_READ_WRITE_CMD
) == 12);
176 #define UFI_READ_WRITE_CMD_LEN (0xA)
178 //--------------------------------------------------------------------------------------------------------------------------------------------
180 // UFI read capacity cmd
184 UCHAR Code
; // operation code 0x25
185 UCHAR LUN
; // lun address
186 UCHAR LBA
[4]; // logical block address, should be zero
187 UCHAR Reserved1
[2]; // reserved 0x00
188 UCHAR PMI
; // PMI = 0x00
189 UCHAR Reserved2
[3]; // reserved 0x00
190 }UFI_CAPACITY_CMD
, *PUFI_CAPACITY_CMD
;
192 C_ASSERT(sizeof(UFI_CAPACITY_CMD
) == 12);
194 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
197 // UFI Read Capcacity command response
201 ULONG LastLogicalBlockAddress
; // last logical block address
202 ULONG BlockLength
; // block length in bytes
203 }UFI_CAPACITY_RESPONSE
, *PUFI_CAPACITY_RESPONSE
;
205 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE
) == 8);
207 //--------------------------------------------------------------------------------------------------------------------------------------------
209 // UFI sense mode cmd
213 UCHAR Code
; // operation code
214 UCHAR LUN
; // lun address
215 UCHAR PageCode
:6; // page code selector
216 UCHAR PC
:2; // type of parameters to be returned
217 UCHAR Reserved
[4]; // reserved 0x00
218 USHORT AllocationLength
; // parameters length
220 }UFI_SENSE_CMD
, *PUFI_SENSE_CMD
;
222 C_ASSERT(sizeof(UFI_SENSE_CMD
) == 12);
224 #define UFI_SENSE_CMD_LEN (6)
228 USHORT ModeDataLength
; // length of parameters for sense cmd
229 UCHAR MediumTypeCode
; // 00 for mass storage, 0x94 for floppy
230 UCHAR WP
:1; // write protect bit
231 UCHAR Reserved1
:2; // reserved 00
232 UCHAR DPOFUA
:1; // should be zero
233 UCHAR Reserved2
:4; // reserved
234 UCHAR Reserved
[4]; // reserved
235 }UFI_MODE_PARAMETER_HEADER
, *PUFI_MODE_PARAMETER_HEADER
;
238 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER
) == 8);
248 }UFI_TIMER_PROTECT_PAGE
, *PUFI_TIMER_PROTECT_PAGE
;
249 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE
) == 8);
251 //--------------------------------------------------------------------------------------------------------------------------------------------
253 // UFI test unit command
258 UCHAR Code
; // operation code 0x00
260 UCHAR Reserved
[10]; // reserved 0x00
261 }UFI_TEST_UNIT_CMD
, *PUFI_TEST_UNIT_CMD
;
263 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD
) == 12);
265 #define UFI_TEST_UNIT_CMD_LEN (6)
276 ULONG TransferDataLength
;
278 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
279 PPDO_DEVICE_EXTENSION PDODeviceExtension
;
280 PMDL TransferBufferMDL
;
282 }IRP_CONTEXT
, *PIRP_CONTEXT
;
284 typedef struct _ERRORHANDLER_WORKITEM_DATA
286 PDEVICE_OBJECT DeviceObject
;
288 PIRP_CONTEXT Context
;
289 WORK_QUEUE_ITEM WorkQueueItem
;
290 } ERRORHANDLER_WORKITEM_DATA
, *PERRORHANDLER_WORKITEM_DATA
;
293 //---------------------------------------------------------------------
298 USBSTOR_FdoHandlePnp(
299 IN PDEVICE_OBJECT DeviceObject
,
302 //---------------------------------------------------------------------
307 USBSTOR_PdoHandlePnp(
308 IN PDEVICE_OBJECT DeviceObject
,
313 IN PDEVICE_OBJECT DeviceObject
,
314 OUT PDEVICE_OBJECT
*ChildDeviceObject
);
316 //---------------------------------------------------------------------
322 USBSTOR_SyncForwardIrp(
323 IN PDEVICE_OBJECT DeviceObject
,
328 USBSTOR_GetBusInterface(
329 IN PDEVICE_OBJECT DeviceObject
,
330 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
334 IN POOL_TYPE PoolType
,
342 USBSTOR_SyncUrbRequest(
343 IN PDEVICE_OBJECT DeviceObject
,
344 OUT PURB UrbRequest
);
348 IN PDEVICE_OBJECT DeviceObject
,
349 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
353 USBSTOR_SyncForwardIrpCompletionRoutine(
354 PDEVICE_OBJECT DeviceObject
,
359 //---------------------------------------------------------------------
361 // descriptor.c routines
365 USBSTOR_GetDescriptors(
366 IN PDEVICE_OBJECT DeviceObject
);
369 USBSTOR_SelectConfigurationAndInterface(
370 IN PDEVICE_OBJECT DeviceObject
,
371 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
374 USBSTOR_GetPipeHandles(
375 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
377 //---------------------------------------------------------------------
382 USBSTOR_HandleExecuteSCSI(
383 IN PDEVICE_OBJECT DeviceObject
,
387 USBSTOR_SendInquiryCmd(
388 IN PDEVICE_OBJECT DeviceObject
);
390 //---------------------------------------------------------------------
395 USBSTOR_HandleInternalDeviceControl(
396 IN PDEVICE_OBJECT DeviceObject
,
400 USBSTOR_HandleDeviceControl(
401 IN PDEVICE_OBJECT DeviceObject
,
404 //---------------------------------------------------------------------
411 PDEVICE_OBJECT DeviceObject
,
415 USBSTOR_QueueFlushIrps(
416 IN PDEVICE_OBJECT DeviceObject
);
419 USBSTOR_QueueRelease(
420 IN PDEVICE_OBJECT DeviceObject
);
424 IN PDEVICE_OBJECT DeviceObject
,
430 IN PDEVICE_OBJECT DeviceObject
,
434 USBSTOR_QueueInitialize(
435 PFDO_DEVICE_EXTENSION FDODeviceExtension
);
439 ErrorHandlerWorkItemRoutine(
443 USBSTOR_QueueNextRequest(
444 IN PDEVICE_OBJECT DeviceObject
);
447 USBSTOR_QueueTerminateRequest(
448 IN PDEVICE_OBJECT DeviceObject
,
449 IN BOOLEAN ModifySrbState
);