ReactOS 0.4.15-dev-7131-ge4d03f4
usbstor.h
Go to the documentation of this file.
1#ifndef _USBSTOR_H_
2#define _USBSTOR_H_
3
4#include <wdm.h>
5#include <usbdi.h>
6#include <usbbusif.h>
7#include <usbdlib.h>
8#include <classpnp.h>
9
10#define USB_STOR_TAG 'sbsu'
11
12#ifndef BooleanFlagOn
13#define BooleanFlagOn(Flags, SingleFlag) ((BOOLEAN)((((Flags) & (SingleFlag)) != 0)))
14#endif
15
16#ifndef SrbGetCdb
17#define SrbGetCdb(srb) ((PCDB)(srb->Cdb))
18#endif
19
20// Storage subclass codes
21
22#define USB_SUBCLASS_RBC 0x01 // Typically, flash devices
23#define USB_SUBCLASS_8020 0x02 // CD-ROM
24#define USB_SUBCLASS_QIC 0x03 // QIC-157 Tapes
25#define USB_SUBCLASS_UFI 0x04 // Floppy
26#define USB_SUBCLASS_8070 0x05 // Removable media
27#define USB_SUBCLASS_SCSI 0x06 // Transparent
28#define USB_SUBCLASS_LOCKABLE 0x07 // Password-protected
29
30#define USB_SUBCLASS_ISD200 0xF0 // ISD200 ATA
31#define USB_SUBCLASS_CYP_ATACB 0xF1 // Cypress ATACB
32#define USB_SUBCLASS_VENDOR 0xFF // Use vendor specific
33
34// Storage protocol codes
35
36#define USB_PROTOCOL_CBI 0x00 // Control/Bulk/Interrupt
37#define USB_PROTOCOL_CB 0x01 // Control/Bulk w/o interrupt
38#define USB_PROTOCOL_BULK 0x50 // bulk only
39#define USB_PROTOCOL_UAS 0x62 // USB Attached SCSI
40#define USB_PROTOCOL_USBAT 0x80 // SCM-ATAPI bridge
41#define USB_PROTOCOL_EUSB_SDDR09 0x81 // SCM-SCSI bridge for SDDR-09
42#define USB_PROTOCOL_SDDR55 0x82 // SDDR-55 (made up)
43
44#define USB_PROTOCOL_DPCM_USB 0xF0 // Combination CB/SDDR09
45#define USB_PROTOCOL_FREECOM 0xF1 // Freecom
46#define USB_PROTOCOL_DATAFAB 0xF2 // Datafab chipsets
47#define USB_PROTOCOL_JUMPSHOT 0xF3 // Lexar Jumpshot
48#define USB_PROTOCOL_ALAUDA 0xF4 // Alauda chipsets
49#define USB_PROTOCOL_KARMA 0xF5 // Rio Karma
50#define USB_PROTOCOL_VENDOR 0xFF // Use vendor specific
51
52// Mass storage class-specific commands
53
54#define USB_BULK_GET_MAX_LUN 0xFE
55#define USB_BULK_RESET_DEVICE 0xFF
56
57#define USB_RECOVERABLE_ERRORS (USBD_STATUS_STALL_PID | USBD_STATUS_DEV_NOT_RESPONDING \
58 | USBD_STATUS_ENDPOINT_HALTED | USBD_STATUS_NO_BANDWIDTH)
59
60#define USB_MAXCHILDREN 16
61#define MAX_LUN 0xF
62#define USBSTOR_DEFAULT_MAX_TRANSFER_LENGTH 0x10000
63
64#define CBW_SIGNATURE 0x43425355
65#define CSW_SIGNATURE 0x53425355
66
67#include <pshpack1.h>
68
69typedef struct
70{
71 ULONG Signature; // CBW signature
72 ULONG Tag; // CBW Tag of operation
73 ULONG DataTransferLength; // data transfer length
74 UCHAR Flags; // CBW Flags endpoint direction
75 UCHAR LUN; // lun unit
76 UCHAR CommandBlockLength; // Command block length
77 UCHAR CommandBlock[16];
79
80C_ASSERT(sizeof(CBW) == 31);
81
82#define CSW_STATUS_COMMAND_PASSED 0x00
83#define CSW_STATUS_COMMAND_FAILED 0x01
84#define CSW_STATUS_PHASE_ERROR 0x02
85
86typedef struct
87{
88 ULONG Signature; // CSW signature
89 ULONG Tag; // CSW tag
90 ULONG DataResidue; // CSW data transfer diff
91 UCHAR Status; // CSW status
93
94#include <poppack.h>
95
96typedef struct
97{
100 ULONG StallRetryCount; // the number of retries after receiving USBD_STATUS_STALL_PID status
101 union
102 {
105 };
109
111{
113
115
116#define USBSTOR_FDO_FLAGS_DEVICE_RESETTING 0x00000001 // hard reset is in progress
117#define USBSTOR_FDO_FLAGS_IRP_LIST_FREEZE 0x00000002 // the irp list is freezed
118
119typedef struct
120{
121 USBSTOR_COMMON_DEVICE_EXTENSION Common; // common device extension
122
123 PDEVICE_OBJECT FunctionalDeviceObject; // functional device object
124 PDEVICE_OBJECT PhysicalDeviceObject; // physical device object
125 PDEVICE_OBJECT LowerDeviceObject; // lower device object
126 USB_BUS_INTERFACE_USBDI_V2 BusInterface; // bus interface of device
127 PUSB_DEVICE_DESCRIPTOR DeviceDescriptor; // usb device descriptor
128 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; // usb configuration descriptor
131 USBD_CONFIGURATION_HANDLE ConfigurationHandle; // usb configuration handle
132 UCHAR BulkInPipeIndex; // bulk in pipe index
133 UCHAR BulkOutPipeIndex; // bulk out pipe index
134 UCHAR MaxLUN; // max lun for device
135 PDEVICE_OBJECT ChildPDO[USB_MAXCHILDREN]; // max 16 child pdo devices
136 KSPIN_LOCK IrpListLock; // irp list lock
137 LIST_ENTRY IrpListHead; // irp list head
138 ULONG IrpPendingCount; // count of irp pending
139 PSCSI_REQUEST_BLOCK ActiveSrb; // stores the current active SRB
140 KEVENT NoPendingRequests; // set if no pending or in progress requests
141 PSCSI_REQUEST_BLOCK LastTimerActiveSrb; // last timer tick active srb
142 ULONG SrbErrorHandlingActive; // error handling of srb is activated
143 ULONG TimerWorkQueueEnabled; // timer work queue enabled
144 ULONG InstanceCount; // pdo instance count
150
151typedef struct
152{
154
155 UCHAR LUN; // lun id
156 BOOLEAN Claimed; // indicating if it has been claimed by upper driver
158 PDEVICE_OBJECT *PDODeviceObject; // entry in pdo list
160 // the whole structure is not stored
161 UCHAR InquiryData[INQUIRYDATABUFFERSIZE]; // USB SCSI inquiry data
163
165{
171
172// we need this to be compatible with ReactOS' classpnp (which is compiled with NTDDI_WIN8)
175 ULONG Size;
189
190
191//---------------------------------------------------------------------
192//
193// fdo.c routines
194//
198 IN OUT PIRP Irp);
199
200//---------------------------------------------------------------------
201//
202// pdo.c routines
203//
207 IN OUT PIRP Irp);
208
212 IN UCHAR LUN);
213
214//---------------------------------------------------------------------
215//
216// misc.c routines
217//
218
220NTAPI
223 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
224
225PVOID
229
230VOID
232 IN PVOID Item);
233
237 OUT PURB UrbRequest);
238
242 IN PFDO_DEVICE_EXTENSION DeviceExtension);
243
247 IN PFDO_DEVICE_EXTENSION DeviceExtension);
248
249//---------------------------------------------------------------------
250//
251// descriptor.c routines
252//
253
257
261 IN PFDO_DEVICE_EXTENSION DeviceExtension);
262
265 IN PFDO_DEVICE_EXTENSION DeviceExtension);
266
267//---------------------------------------------------------------------
268//
269// scsi.c routines
270//
274 IN PIRP Irp);
275
278 PFDO_DEVICE_EXTENSION FDODeviceExtension,
279 PIRP Irp);
280
281
282//---------------------------------------------------------------------
283//
284// disk.c routines
285//
289 IN PIRP Irp);
290
294 IN PIRP Irp);
295
296//---------------------------------------------------------------------
297//
298// queue.c routines
299//
300VOID
301NTAPI
304 PIRP Irp);
305
306VOID
309
310VOID
313
317 IN PIRP Irp);
318
319VOID
320NTAPI
323 IN PIRP Irp);
324
325VOID
327 PFDO_DEVICE_EXTENSION FDODeviceExtension);
328
329VOID
332
333VOID
336 IN PIRP Irp);
337
338//---------------------------------------------------------------------
339//
340// error.c routines
341//
345 IN UCHAR bEndpointAddress,
347
352
353VOID
354NTAPI
357 PVOID Context);
358
359VOID
360NTAPI
362 IN PFDO_DEVICE_EXTENSION FDODeviceExtension);
363
364VOID
365NTAPI
367 IN PFDO_DEVICE_EXTENSION FDODeviceExtension);
368
369#endif // _USBSTOR_H_
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define INQUIRYDATABUFFERSIZE
Definition: cdrw_hw.h:1113
_In_ PIRP Irp
Definition: csq.h:116
static HANDLE PipeHandle
Definition: dhcpcsvc.c:22
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define C_ASSERT(e)
Definition: intsafe.h:73
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE ConfigurationHandle
Definition: ndis.h:3945
unsigned short USHORT
Definition: pedump.c:61
static UCHAR ItemSize[4]
Definition: parser.c:16
const KSDEVICE_DESCRIPTOR DeviceDescriptor
Definition: splitter.c:257
Definition: usbstor.h:70
UCHAR LUN
Definition: usbstor.h:75
UCHAR CommandBlockLength
Definition: usbstor.h:76
ULONG Signature
Definition: usbstor.h:71
ULONG Tag
Definition: usbstor.h:72
UCHAR Flags
Definition: usbstor.h:74
ULONG DataTransferLength
Definition: usbstor.h:73
Definition: usbstor.h:87
ULONG Signature
Definition: usbstor.h:88
ULONG DataResidue
Definition: usbstor.h:90
ULONG Tag
Definition: usbstor.h:89
UCHAR Status
Definition: usbstor.h:91
USBSTOR_COMMON_DEVICE_EXTENSION Common
Definition: usbstor.h:121
ULONG TimerWorkQueueEnabled
Definition: usbstor.h:143
UCHAR BulkOutPipeIndex
Definition: usbstor.h:133
PIO_WORKITEM ResetDeviceWorkItem
Definition: usbstor.h:146
PDEVICE_OBJECT FunctionalDeviceObject
Definition: usbstor.h:123
LIST_ENTRY IrpListHead
Definition: usbstor.h:137
PSCSI_REQUEST_BLOCK LastTimerActiveSrb
Definition: usbstor.h:141
PUSBD_INTERFACE_INFORMATION InterfaceInformation
Definition: usbstor.h:130
USB_BUS_INTERFACE_USBDI_V2 BusInterface
Definition: usbstor.h:126
IRP_CONTEXT CurrentIrpContext
Definition: usbstor.h:148
KSPIN_LOCK IrpListLock
Definition: usbstor.h:136
KEVENT NoPendingRequests
Definition: usbstor.h:140
PSCSI_REQUEST_BLOCK ActiveSrb
Definition: usbstor.h:139
PDEVICE_OBJECT LowerDeviceObject
Definition: usbstor.h:125
PUSB_STRING_DESCRIPTOR SerialNumber
Definition: usbstor.h:129
KSPIN_LOCK CommonLock
Definition: usbstor.h:145
ULONG SrbErrorHandlingActive
Definition: usbstor.h:142
ULONG ErrorIndex
Definition: usbstor.h:99
PIRP Irp
Definition: usbstor.h:98
ULONG StallRetryCount
Definition: usbstor.h:100
SCSI_REQUEST_BLOCK SenseSrb
Definition: usbstor.h:107
PDEVICE_OBJECT LowerDeviceObject
Definition: usbstor.h:157
PDEVICE_OBJECT * PDODeviceObject
Definition: usbstor.h:158
USBSTOR_COMMON_DEVICE_EXTENSION Common
Definition: usbstor.h:153
PDEVICE_OBJECT Self
Definition: usbstor.h:159
PDEVICE_OBJECT DeviceObject
Definition: usbstor.h:166
WORK_QUEUE_ITEM WorkQueueItem
Definition: usbstor.h:168
Definition: typedefs.h:120
Definition: usb.h:529
INT POOL_TYPE
Definition: typedefs.h:78
#define NTAPI
Definition: typedefs.h:36
uint16_t * PUSHORT
Definition: typedefs.h:56
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
NTSTATUS USBSTOR_HandleExecuteSCSI(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: scsi.c:540
NTSTATUS USBSTOR_SendCSWRequest(PFDO_DEVICE_EXTENSION FDODeviceExtension, PIRP Irp)
Definition: scsi.c:242
struct PDO_DEVICE_EXTENSION * PPDO_DEVICE_EXTENSION
struct __COMMON_DEVICE_EXTENSION__ USBSTOR_COMMON_DEVICE_EXTENSION
struct _STORAGE_ADAPTER_DESCRIPTOR_WIN8 * PSTORAGE_ADAPTER_DESCRIPTOR_WIN8
BOOLEAN USBSTOR_QueueAddIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: queue.c:75
VOID USBSTOR_QueueRelease(IN PDEVICE_OBJECT DeviceObject)
Definition: queue.c:262
NTSTATUS USBSTOR_FdoHandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
Definition: fdo.c:282
NTSTATUS USBSTOR_SyncUrbRequest(IN PDEVICE_OBJECT DeviceObject, OUT PURB UrbRequest)
Definition: misc.c:83
VOID NTAPI USBSTOR_QueueResetDevice(IN PFDO_DEVICE_EXTENSION FDODeviceExtension)
Definition: error.c:148
NTSTATUS USBSTOR_ResetPipeWithHandle(IN PDEVICE_OBJECT DeviceObject, IN USBD_PIPE_HANDLE PipeHandle)
Definition: error.c:46
struct FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
VOID NTAPI USBSTOR_QueueResetPipe(IN PFDO_DEVICE_EXTENSION FDODeviceExtension)
Definition: error.c:135
NTSTATUS USBSTOR_GetMaxLUN(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: misc.c:173
NTSTATUS USBSTOR_HandleInternalDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: disk.c:81
NTSTATUS USBSTOR_ResetDevice(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: misc.c:219
NTSTATUS USBSTOR_CreatePDO(IN PDEVICE_OBJECT DeviceObject, IN UCHAR LUN)
Definition: pdo.c:841
VOID USBSTOR_QueueInitialize(PFDO_DEVICE_EXTENSION FDODeviceExtension)
Definition: queue.c:17
#define USB_MAXCHILDREN
Definition: usbstor.h:60
NTSTATUS USBSTOR_GetDescriptors(IN PDEVICE_OBJECT DeviceObject)
Definition: descriptor.c:75
struct _ERRORHANDLER_WORKITEM_DATA * PERRORHANDLER_WORKITEM_DATA
struct CBW * PCBW
VOID USBSTOR_QueueTerminateRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: queue.c:186
PVOID AllocateItem(IN POOL_TYPE PoolType, IN ULONG ItemSize)
Definition: misc.c:29
struct _ERRORHANDLER_WORKITEM_DATA ERRORHANDLER_WORKITEM_DATA
struct CSW * PCSW
struct __COMMON_DEVICE_EXTENSION__ * PUSBSTOR_COMMON_DEVICE_EXTENSION
NTSTATUS USBSTOR_PdoHandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
Definition: pdo.c:511
VOID USBSTOR_QueueWaitForPendingRequests(IN PDEVICE_OBJECT DeviceObject)
Definition: queue.c:171
NTSTATUS NTAPI USBSTOR_GetBusInterface(IN PDEVICE_OBJECT DeviceObject, OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface)
Definition: misc.c:33
NTSTATUS USBSTOR_HandleDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: disk.c:413
struct IRP_CONTEXT * PIRP_CONTEXT
NTSTATUS USBSTOR_GetPipeHandles(IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: descriptor.c:319
VOID USBSTOR_QueueNextRequest(IN PDEVICE_OBJECT DeviceObject)
Definition: queue.c:220
NTSTATUS USBSTOR_SelectConfigurationAndInterface(IN PDEVICE_OBJECT DeviceObject, IN PFDO_DEVICE_EXTENSION DeviceExtension)
Definition: descriptor.c:234
NTSTATUS USBSTOR_GetEndpointStatus(IN PDEVICE_OBJECT DeviceObject, IN UCHAR bEndpointAddress, OUT PUSHORT Value)
Definition: error.c:18
VOID NTAPI USBSTOR_CancelIo(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: queue.c:28
VOID FreeItem(IN PVOID Item)
Definition: misc.c:37
VOID NTAPI USBSTOR_StartIo(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: queue.c:300
struct _STORAGE_ADAPTER_DESCRIPTOR_WIN8 STORAGE_ADAPTER_DESCRIPTOR_WIN8
VOID NTAPI USBSTOR_TimerRoutine(PDEVICE_OBJECT DeviceObject, PVOID Context)
Definition: error.c:205
_In_ WDFCOLLECTION _In_ WDFOBJECT Item
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3815
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
unsigned char UCHAR
Definition: xmlstorage.h:181