18 #define USB_STOR_TAG 'sbsu'
19 #define USB_MAXCHILDREN (16)
22 IoAttachDeviceToDeviceStackSafe(
23 IN PDEVICE_OBJECT SourceDevice
,
24 IN PDEVICE_OBJECT TargetDevice
,
25 OUT PDEVICE_OBJECT
*AttachedToDeviceObject
);
27 typedef struct _COMMON_DEVICE_EXTENSION
31 }COMMON_DEVICE_EXTENSION
, *PCOMMON_DEVICE_EXTENSION
;
35 COMMON_DEVICE_EXTENSION Common
; // common device extension
37 PDEVICE_OBJECT FunctionalDeviceObject
; // functional device object
38 PDEVICE_OBJECT PhysicalDeviceObject
; // physical device object
39 PDEVICE_OBJECT LowerDeviceObject
; // lower device object
40 USB_BUS_INTERFACE_USBDI_V2 BusInterface
; // bus interface of device
41 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor
; // usb device descriptor
42 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
; // usb configuration descriptor
43 PUSBD_INTERFACE_INFORMATION InterfaceInformation
; // usb interface information
44 USBD_CONFIGURATION_HANDLE ConfigurationHandle
; // usb configuration handle
45 UCHAR BulkInPipeIndex
; // bulk in pipe index
46 UCHAR BulkOutPipeIndex
; // bulk out pipe index
47 UCHAR MaxLUN
; // max lun for device
48 PDEVICE_OBJECT ChildPDO
[16]; // max 16 child pdo devices
49 }FDO_DEVICE_EXTENSION
, *PFDO_DEVICE_EXTENSION
;
53 COMMON_DEVICE_EXTENSION Common
;
54 PDEVICE_OBJECT LowerDeviceObject
; // points to FDO
56 PVOID InquiryData
; // USB SCSI inquiry data
57 }PDO_DEVICE_EXTENSION
, *PPDO_DEVICE_EXTENSION
;
61 // max lun command identifier
63 #define USB_BULK_GET_MAX_LUN 0xFE
68 ULONG Signature
; // CBW signature
69 ULONG Tag
; // CBW Tag of operation
70 ULONG DataTransferLength
; // data transfer length
71 UCHAR Flags
; // CBW Flags endpoint direction
72 UCHAR LUN
; // lun unit
73 UCHAR CommandBlockLength
; // Command block length
74 UCHAR CommandBlock
[16];
77 #define CBW_SIGNATURE 0x43425355
82 ULONG Signature
; // CSW signature
84 ULONG DataResidue
; // CSW data transfer diff
85 UCHAR Status
; // CSW status
88 //--------------------------------------------------------------------------------------------------------------------------------------------
90 // UFI INQUIRY command
94 UCHAR Code
; // operation code 0x12
95 UCHAR LUN
; // lun address
96 UCHAR PageCode
; // product data information, always 0x00
97 UCHAR Reserved
; // reserved 0x00
98 UCHAR AllocationLength
; // length of inquiry data to be returned, default 36 bytes
99 UCHAR Reserved1
[7]; //reserved bytes 0x00
100 }UFI_INQUIRY_CMD
, *PUFI_INQUIRY_CMD
;
102 C_ASSERT(sizeof(UFI_INQUIRY_CMD
) == 12);
104 #define UFI_INQURIY_CODE 0x12
105 #define UFI_INQUIRY_CMD_LEN 0x6
108 // UFI INQUIRY command response
112 UCHAR DeviceType
; // device type
113 UCHAR RMB
; // removable media bit
114 UCHAR Version
; // contains version 0x00
115 UCHAR Format
; // response format
116 UCHAR Length
; // additional length
117 USHORT Reserved
; // reserved
118 UCHAR Vendor
[8]; // vendor identification string
119 UCHAR Product
[16]; // product identification string
120 UCHAR Revision
[4]; // product revision code
121 }UFI_INQUIRY_RESPONSE
, *PUFI_INQUIRY_RESPONSE
;
123 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE
) == 36);
125 //---------------------------------------------------------------------
130 USBSTOR_FdoHandlePnp(
131 IN PDEVICE_OBJECT DeviceObject
,
134 //---------------------------------------------------------------------
139 USBSTOR_PdoHandlePnp(
140 IN PDEVICE_OBJECT DeviceObject
,
145 IN PDEVICE_OBJECT DeviceObject
,
146 OUT PDEVICE_OBJECT
*ChildDeviceObject
);
148 //---------------------------------------------------------------------
154 USBSTOR_SyncForwardIrp(
155 IN PDEVICE_OBJECT DeviceObject
,
160 USBSTOR_GetBusInterface(
161 IN PDEVICE_OBJECT DeviceObject
,
162 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface
);
166 IN POOL_TYPE PoolType
,
174 USBSTOR_SyncUrbRequest(
175 IN PDEVICE_OBJECT DeviceObject
,
176 OUT PURB UrbRequest
);
180 IN PDEVICE_OBJECT DeviceObject
,
181 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
185 USBSTOR_SyncForwardIrpCompletionRoutine(
186 PDEVICE_OBJECT DeviceObject
,
191 //---------------------------------------------------------------------
193 // descriptor.c routines
197 USBSTOR_GetDescriptors(
198 IN PDEVICE_OBJECT DeviceObject
);
201 USBSTOR_SelectConfigurationAndInterface(
202 IN PDEVICE_OBJECT DeviceObject
,
203 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
206 USBSTOR_GetPipeHandles(
207 IN PFDO_DEVICE_EXTENSION DeviceExtension
);
209 //---------------------------------------------------------------------
214 USBSTOR_SendInquiryCmd(
215 IN PDEVICE_OBJECT DeviceObject
);