[USBSTOR]
[reactos.git] / drivers / usb / usbstor / usbstor.h
1
2 #pragma once
3
4 #include <ntddk.h>
5 #define NDEBUG
6 #include <debug.h>
7 #include <usbdi.h>
8 #include <hubbusif.h>
9 #include <usbbusif.h>
10 #include <usbioctl.h>
11 #include <usbiodef.h>
12 #include <usb.h>
13 #include <usbdlib.h>
14 #include <stdio.h>
15 #include <wdmguid.h>
16
17
18 #define USB_STOR_TAG 'sbsu'
19 #define USB_MAXCHILDREN (16)
20
21 NTSTATUS NTAPI
22 IoAttachDeviceToDeviceStackSafe(
23 IN PDEVICE_OBJECT SourceDevice,
24 IN PDEVICE_OBJECT TargetDevice,
25 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
26
27 typedef struct _COMMON_DEVICE_EXTENSION
28 {
29 BOOLEAN IsFDO;
30
31 }COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
32
33 typedef struct
34 {
35 COMMON_DEVICE_EXTENSION Common; // common device extension
36
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;
50
51 typedef struct
52 {
53 COMMON_DEVICE_EXTENSION Common;
54 PDEVICE_OBJECT LowerDeviceObject; // points to FDO
55 UCHAR LUN; // lun id
56 PVOID InquiryData; // USB SCSI inquiry data
57 }PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
58
59
60 //
61 // max lun command identifier
62 //
63 #define USB_BULK_GET_MAX_LUN 0xFE
64
65
66 typedef struct
67 {
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];
75 }CBW, *PCBW;
76
77 #define CBW_SIGNATURE 0x43425355
78 #define MAX_LUN 0xF
79
80 typedef struct
81 {
82 ULONG Signature; // CSW signature
83 ULONG Tag; // CSW tag
84 ULONG DataResidue; // CSW data transfer diff
85 UCHAR Status; // CSW status
86 }CSW, *PCSW;
87
88 //--------------------------------------------------------------------------------------------------------------------------------------------
89 //
90 // UFI INQUIRY command
91 //
92 typedef struct
93 {
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;
101
102 C_ASSERT(sizeof(UFI_INQUIRY_CMD) == 12);
103
104 #define UFI_INQURIY_CODE 0x12
105 #define UFI_INQUIRY_CMD_LEN 0x6
106
107 //
108 // UFI INQUIRY command response
109 //
110 typedef struct
111 {
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;
122
123 C_ASSERT(sizeof(UFI_INQUIRY_RESPONSE) == 36);
124
125 //---------------------------------------------------------------------
126 //
127 // fdo.c routines
128 //
129 NTSTATUS
130 USBSTOR_FdoHandlePnp(
131 IN PDEVICE_OBJECT DeviceObject,
132 IN OUT PIRP Irp);
133
134 //---------------------------------------------------------------------
135 //
136 // pdo.c routines
137 //
138 NTSTATUS
139 USBSTOR_PdoHandlePnp(
140 IN PDEVICE_OBJECT DeviceObject,
141 IN OUT PIRP Irp);
142
143 NTSTATUS
144 USBSTOR_CreatePDO(
145 IN PDEVICE_OBJECT DeviceObject,
146 OUT PDEVICE_OBJECT *ChildDeviceObject);
147
148 //---------------------------------------------------------------------
149 //
150 // misc.c routines
151 //
152 NTSTATUS
153 NTAPI
154 USBSTOR_SyncForwardIrp(
155 IN PDEVICE_OBJECT DeviceObject,
156 IN OUT PIRP Irp);
157
158 NTSTATUS
159 NTAPI
160 USBSTOR_GetBusInterface(
161 IN PDEVICE_OBJECT DeviceObject,
162 OUT PUSB_BUS_INTERFACE_USBDI_V2 BusInterface);
163
164 PVOID
165 AllocateItem(
166 IN POOL_TYPE PoolType,
167 IN ULONG ItemSize);
168
169 VOID
170 FreeItem(
171 IN PVOID Item);
172
173 NTSTATUS
174 USBSTOR_SyncUrbRequest(
175 IN PDEVICE_OBJECT DeviceObject,
176 OUT PURB UrbRequest);
177
178 NTSTATUS
179 USBSTOR_GetMaxLUN(
180 IN PDEVICE_OBJECT DeviceObject,
181 IN PFDO_DEVICE_EXTENSION DeviceExtension);
182
183 NTSTATUS
184 NTAPI
185 USBSTOR_SyncForwardIrpCompletionRoutine(
186 PDEVICE_OBJECT DeviceObject,
187 PIRP Irp,
188 PVOID Context);
189
190
191 //---------------------------------------------------------------------
192 //
193 // descriptor.c routines
194 //
195
196 NTSTATUS
197 USBSTOR_GetDescriptors(
198 IN PDEVICE_OBJECT DeviceObject);
199
200 NTSTATUS
201 USBSTOR_SelectConfigurationAndInterface(
202 IN PDEVICE_OBJECT DeviceObject,
203 IN PFDO_DEVICE_EXTENSION DeviceExtension);
204
205 NTSTATUS
206 USBSTOR_GetPipeHandles(
207 IN PFDO_DEVICE_EXTENSION DeviceExtension);
208
209 //---------------------------------------------------------------------
210 //
211 // scsi.c routines
212 //
213 NTSTATUS
214 USBSTOR_SendInquiryCmd(
215 IN PDEVICE_OBJECT DeviceObject);