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))
39 IoAttachDeviceToDeviceStackSafe(
40 IN PDEVICE_OBJECT SourceDevice
,
41 IN PDEVICE_OBJECT TargetDevice
,
42 OUT PDEVICE_OBJECT
*AttachedToDeviceObject
);
44 typedef struct __COMMON_DEVICE_EXTENSION__
48 }USBSTOR_COMMON_DEVICE_EXTENSION
, *PUSBSTOR_COMMON_DEVICE_EXTENSION
;
52 USBSTOR_COMMON_DEVICE_EXTENSION Common
; // common device extension
54 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
55 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
56 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
57 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
58 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
59 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
60 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
61 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
62 UCHAR BulkInPipeIndex
; // bulk in pipe index
63 UCHAR BulkOutPipeIndex
; // bulk out pipe index
64 UCHAR MaxLUN
; // max lun for device
65 PDEVICE_OBJECT ChildPDO
[16]; // max 16 child pdo devices
66 KSPIN_LOCK IrpListLock
; // irp list lock
67 LIST_ENTRY IrpListHead
; // irp list head
68 BOOLEAN IrpListFreeze
; // if true the irp list is freezed
69 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
73 USBSTOR_COMMON_DEVICE_EXTENSION Common
;
74 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
76 PVOID InquiryData
; // USB SCSI inquiry data
77 UCHAR Claimed
; // indicating if it has been claimed by upper driver
78 ULONG BlockLength
; // length of block
79 ULONG LastLogicBlockAddress
; // last block address
80 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
86 // max lun command identifier
88 #define USB_BULK_GET_MAX_LUN 0xFE
93 ULONG Signature
; // CBW signature
94 ULONG Tag
; // CBW Tag of operation
95 ULONG DataTransferLength
; // data transfer length
96 UCHAR Flags
; // CBW Flags endpoint direction
97 UCHAR LUN
; // lun unit
98 UCHAR CommandBlockLength
; // Command block length
99 UCHAR CommandBlock
[16];
102 C_ASSERT(sizeof(CBW
) == 31);
105 #define CBW_SIGNATURE 0x43425355
110 ULONG Signature
; // CSW signature
111 ULONG Tag
; // CSW tag
112 ULONG DataResidue
; // CSW data transfer diff
113 UCHAR Status
; // CSW status
116 //--------------------------------------------------------------------------------------------------------------------------------------------
118 // UFI INQUIRY command
122 UCHAR Code
; // operation code 0x12
123 UCHAR LUN
; // lun address
124 UCHAR PageCode
; // product data information, always 0x00
125 UCHAR Reserved
; // reserved 0x00
126 UCHAR AllocationLength
; // length of inquiry data to be returned, default 36 bytes
127 UCHAR Reserved1
[7]; //reserved bytes 0x00
128 }UFI_INQUIRY_CMD
, *PUFI_INQUIRY_CMD
;
130 C_ASSERT(sizeof(UFI_INQUIRY_CMD
) == 12);
132 #define UFI_INQUIRY_CMD_LEN 0x6
135 // UFI INQUIRY command response
139 UCHAR DeviceType
; // device type
140 UCHAR RMB
; // removable media bit
141 UCHAR Version
; // contains version 0x00
142 UCHAR Format
; // response format
143 UCHAR Length
; // additional length
144 UCHAR Reserved
[3]; // reserved
145 UCHAR Vendor
[8]; // vendor identification string
146 UCHAR Product
[16]; // product identification string
147 UCHAR Revision
[4]; // product revision code
148 }UFI_INQUIRY_RESPONSE
, *PUFI_INQUIRY_RESPONSE
;
150 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE
) == 36);
152 //--------------------------------------------------------------------------------------------------------------------------------------------
158 UCHAR Code
; // operation code
160 UCHAR LogicalBlockByte0
; // lba byte 0
161 UCHAR LogicalBlockByte1
; // lba byte 1
162 UCHAR LogicalBlockByte2
; // lba byte 2
163 UCHAR LogicalBlockByte3
; // lba byte 3
164 UCHAR Reserved
; // reserved 0x00
165 USHORT ContiguousLogicBlocks
; // num of contiguous logical blocks
166 UCHAR Reserved1
[3]; // reserved 0x00
169 C_ASSERT(sizeof(UFI_READ_WRITE_CMD
) == 12);
171 #define UFI_READ_WRITE_CMD_LEN (0xA)
173 //--------------------------------------------------------------------------------------------------------------------------------------------
175 // UFI read capacity cmd
179 UCHAR Code
; // operation code 0x25
180 UCHAR LUN
; // lun address
181 UCHAR LBA
[4]; // logical block address, should be zero
182 UCHAR Reserved1
[2]; // reserved 0x00
183 UCHAR PMI
; // PMI = 0x00
184 UCHAR Reserved2
[3]; // reserved 0x00
185 }UFI_CAPACITY_CMD
, *PUFI_CAPACITY_CMD
;
187 C_ASSERT(sizeof(UFI_CAPACITY_CMD
) == 12);
189 #define UFI_CAPACITY_CMD_LEN 0xA //FIXME support length 16 too if requested
192 // UFI Read Capcacity command response
196 ULONG LastLogicalBlockAddress
; // last logical block address
197 ULONG BlockLength
; // block length in bytes
198 }UFI_CAPACITY_RESPONSE
, *PUFI_CAPACITY_RESPONSE
;
200 C_ASSERT(sizeof(UFI_CAPACITY_RESPONSE
) == 8);
202 //--------------------------------------------------------------------------------------------------------------------------------------------
204 // UFI sense mode cmd
208 UCHAR Code
; // operation code
209 UCHAR LUN
; // lun address
210 UCHAR PageCode
:6; // page code selector
211 UCHAR PC
:2; // type of parameters to be returned
212 UCHAR Reserved
[4]; // reserved 0x00
213 USHORT AllocationLength
; // parameters length
215 }UFI_SENSE_CMD
, *PUFI_SENSE_CMD
;
217 C_ASSERT(sizeof(UFI_SENSE_CMD
) == 12);
219 #define UFI_SENSE_CMD_LEN (6)
223 USHORT ModeDataLength
; // length of parameters for sense cmd
224 UCHAR MediumTypeCode
; // 00 for mass storage, 0x94 for floppy
225 UCHAR WP
:1; // write protect bit
226 UCHAR Reserved1
:2; // reserved 00
227 UCHAR DPOFUA
:1; // should be zero
228 UCHAR Reserved2
:4; // reserved
229 UCHAR Reserved
[4]; // reserved
230 }UFI_MODE_PARAMETER_HEADER
, *PUFI_MODE_PARAMETER_HEADER
;
233 C_ASSERT(sizeof(UFI_MODE_PARAMETER_HEADER
) == 8);
243 }UFI_TIMER_PROTECT_PAGE
, *PUFI_TIMER_PROTECT_PAGE
;
244 C_ASSERT(sizeof(UFI_TIMER_PROTECT_PAGE
) == 8);
246 //--------------------------------------------------------------------------------------------------------------------------------------------
248 // UFI test unit command
253 UCHAR Code
; // operation code 0x00
255 UCHAR Reserved
[10]; // reserved 0x00
256 }UFI_TEST_UNIT_CMD
, *PUFI_TEST_UNIT_CMD
;
258 C_ASSERT(sizeof(UFI_TEST_UNIT_CMD
) == 12);
260 #define UFI_TEST_UNIT_CMD_LEN (6)
271 ULONG TransferDataLength
;
273 PFDO_DEVICE_EXTENSION FDODeviceExtension
;
274 PPDO_DEVICE_EXTENSION PDODeviceExtension
;
275 PMDL TransferBufferMDL
;
277 }IRP_CONTEXT
, *PIRP_CONTEXT
;
281 //---------------------------------------------------------------------
286 USBSTOR_FdoHandlePnp(
287 IN PDEVICE_OBJECT DeviceObject
,
290 //---------------------------------------------------------------------
295 USBSTOR_PdoHandlePnp(
296 IN PDEVICE_OBJECT DeviceObject
,
301 IN PDEVICE_OBJECT DeviceObject
,
302 OUT PDEVICE_OBJECT
*ChildDeviceObject
);
304 //---------------------------------------------------------------------
310 USBSTOR_SyncForwardIrp(
311 IN PDEVICE_OBJECT DeviceObject
,
316 USBSTOR_GetBusInterface(
317 IN PDEVICE_OBJECT DeviceObject
,
318 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
322 IN POOL_TYPE PoolType
,
330 USBSTOR_SyncUrbRequest(
331 IN PDEVICE_OBJECT DeviceObject
,
332 OUT PURB UrbRequest
);
336 IN PDEVICE_OBJECT DeviceObject
,
337 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
341 USBSTOR_SyncForwardIrpCompletionRoutine(
342 PDEVICE_OBJECT DeviceObject
,
347 //---------------------------------------------------------------------
349 // descriptor.c routines
353 USBSTOR_GetDescriptors(
354 IN PDEVICE_OBJECT DeviceObject
);
357 USBSTOR_SelectConfigurationAndInterface(
358 IN PDEVICE_OBJECT DeviceObject
,
359 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
362 USBSTOR_GetPipeHandles(
363 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
365 //---------------------------------------------------------------------
370 USBSTOR_HandleExecuteSCSI(
371 IN PDEVICE_OBJECT DeviceObject
,
374 //---------------------------------------------------------------------
379 USBSTOR_HandleInternalDeviceControl(
380 IN PDEVICE_OBJECT DeviceObject
,
384 USBSTOR_HandleDeviceControl(
385 IN PDEVICE_OBJECT DeviceObject
,
388 //---------------------------------------------------------------------
395 PDEVICE_OBJECT DeviceObject
,
399 USBSTOR_QueueFlushIrps(
400 IN PDEVICE_OBJECT DeviceObject
);
403 USBSTOR_QueueRelease(
404 IN PDEVICE_OBJECT DeviceObject
);
408 IN PDEVICE_OBJECT DeviceObject
,
414 IN PDEVICE_OBJECT DeviceObject
,
418 USBSTOR_QueueInitialize(
419 PFDO_DEVICE_EXTENSION FDODeviceExtension
);