1#pragma once
2
3#ifndef DECLSPEC_EXPORT
4#define DECLSPEC_EXPORT __declspec(dllexport)
5#endif
6
7typedef struct _USBD_INTERFACE_LIST_ENTRY {
8  PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
9  PUSBD_INTERFACE_INFORMATION Interface;
10} USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY;
11
12#define UsbBuildInterruptOrBulkTransferRequest(urb,length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link) \
13{												\
14	(urb)->UrbHeader.Function = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;			\
15	(urb)->UrbHeader.Length = (length);							\
16	(urb)->UrbBulkOrInterruptTransfer.PipeHandle = (pipeHandle);				\
17	(urb)->UrbBulkOrInterruptTransfer.TransferBufferLength = (transferBufferLength);	\
18	(urb)->UrbBulkOrInterruptTransfer.TransferBufferMDL = (transferBufferMDL);		\
19	(urb)->UrbBulkOrInterruptTransfer.TransferBuffer = (transferBuffer);			\
20	(urb)->UrbBulkOrInterruptTransfer.TransferFlags = (transferFlags);			\
21	(urb)->UrbBulkOrInterruptTransfer.UrbLink = (link);					\
22}
23
24#define UsbBuildGetDescriptorRequest(urb, length, descriptorType, descriptorIndex, languageId, transferBuffer, transferBufferMDL, transferBufferLength, link) \
25{												\
26	(urb)->UrbHeader.Function =  URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE;			\
27	(urb)->UrbHeader.Length = (length);							\
28	(urb)->UrbControlDescriptorRequest.TransferBufferLength = (transferBufferLength);	\
29	(urb)->UrbControlDescriptorRequest.TransferBufferMDL = (transferBufferMDL);		\
30	(urb)->UrbControlDescriptorRequest.TransferBuffer = (transferBuffer);			\
31	(urb)->UrbControlDescriptorRequest.DescriptorType = (descriptorType);			\
32	(urb)->UrbControlDescriptorRequest.Index = (descriptorIndex);				\
33	(urb)->UrbControlDescriptorRequest.LanguageId = (languageId);				\
34	(urb)->UrbControlDescriptorRequest.UrbLink = (link);					\
35}
36
37#define UsbBuildGetStatusRequest(urb, op, index, transferBuffer, transferBufferMDL, link)	\
38{												\
39	(urb)->UrbHeader.Function =  (op);							\
40	(urb)->UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_STATUS_REQUEST);		\
41	(urb)->UrbControlGetStatusRequest.TransferBufferLength = sizeof(USHORT);		\
42	(urb)->UrbControlGetStatusRequest.TransferBufferMDL = (transferBufferMDL);		\
43	(urb)->UrbControlGetStatusRequest.TransferBuffer = (transferBuffer);			\
44	(urb)->UrbControlGetStatusRequest.Index = (index);					\
45	(urb)->UrbControlGetStatusRequest.UrbLink = (link);					\
46}
47
48#define UsbBuildFeatureRequest(urb, op, featureSelector, index, link)				\
49{												\
50	(urb)->UrbHeader.Function =  (op);							\
51	(urb)->UrbHeader.Length = sizeof(struct _URB_CONTROL_FEATURE_REQUEST);			\
52	(urb)->UrbControlFeatureRequest.FeatureSelector = (featureSelector);			\
53	(urb)->UrbControlFeatureRequest.Index = (index);					\
54	(urb)->UrbControlFeatureRequest.UrbLink = (link);					\
55}
56
57#define UsbBuildSelectConfigurationRequest(urb, length, configurationDescriptor)		\
58{												\
59	(urb)->UrbHeader.Function =  URB_FUNCTION_SELECT_CONFIGURATION;				\
60	(urb)->UrbHeader.Length = (length);							\
61	(urb)->UrbSelectConfiguration.ConfigurationDescriptor = (configurationDescriptor);	\
62}
63
64#define UsbBuildSelectInterfaceRequest(urb, length, configurationHandle, interfaceNumber, alternateSetting) \
65{												\
66	(urb)->UrbHeader.Function =  URB_FUNCTION_SELECT_INTERFACE;				\
67	(urb)->UrbHeader.Length = (length);							\
68	(urb)->UrbSelectInterface.Interface.AlternateSetting = (alternateSetting);		\
69	(urb)->UrbSelectInterface.Interface.InterfaceNumber = (interfaceNumber);		\
70	(urb)->UrbSelectInterface.Interface.Length =						\
71		(length - sizeof(struct _URB_HEADER) - sizeof(USBD_CONFIGURATION_HANDLE));	\
72	(urb)->UrbSelectInterface.ConfigurationHandle = (configurationHandle);			\
73}
74
75#define UsbBuildVendorRequest(urb, cmd, length, transferFlags, reservedbits, request, value, index, transferBuffer, transferBufferMDL, transferBufferLength, link) \
76{												\
77	(urb)->UrbHeader.Function =  cmd;							\
78	(urb)->UrbHeader.Length = (length);							\
79	(urb)->UrbControlVendorClassRequest.TransferBufferLength = (transferBufferLength);	\
80	(urb)->UrbControlVendorClassRequest.TransferBufferMDL = (transferBufferMDL);		\
81	(urb)->UrbControlVendorClassRequest.TransferBuffer = (transferBuffer);			\
82	(urb)->UrbControlVendorClassRequest.RequestTypeReservedBits = (reservedbits);		\
83	(urb)->UrbControlVendorClassRequest.Request = (request);				\
84	(urb)->UrbControlVendorClassRequest.Value = (value);					\
85	(urb)->UrbControlVendorClassRequest.Index = (index);					\
86	(urb)->UrbControlVendorClassRequest.TransferFlags = (transferFlags);			\
87	(urb)->UrbControlVendorClassRequest.UrbLink = (link);					\
88}
89
90#if (NTDDI_VERSION >= NTDDI_WINXP)
91
92#define UsbBuildOsFeatureDescriptorRequest(urb, length, interface, index, transferBuffer, transferBufferMDL, transferBufferLength, link)  \
93{												\
94	(urb)->UrbHeader.Function = URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR;			\
95	(urb)->UrbHeader.Length = (length);							\
96	(urb)->UrbOSFeatureDescriptorRequest.TransferBufferLength = (transferBufferLength);	\
97	(urb)->UrbOSFeatureDescriptorRequest.TransferBufferMDL = (transferBufferMDL);		\
98	(urb)->UrbOSFeatureDescriptorRequest.TransferBuffer = (transferBuffer);			\
99	(urb)->UrbOSFeatureDescriptorRequest.InterfaceNumber = (interface);			\
100	(urb)->UrbOSFeatureDescriptorRequest.MS_FeatureDescriptorIndex = (index);		\
101	(urb)->UrbOSFeatureDescriptorRequest.UrbLink = (link);					\
102}
103
104#endif	/* NTDDI_VERSION >= NTDDI_WINXP */
105
106#define URB_STATUS(urb)					((urb)->UrbHeader.Status)
107
108#define GET_SELECT_CONFIGURATION_REQUEST_SIZE(totalInterfaces, totalPipes)			\
109	(sizeof(struct _URB_SELECT_CONFIGURATION) +						\
110	  ((totalInterfaces-1) * sizeof(USBD_INTERFACE_INFORMATION)) +				\
111	  ((totalPipes-totalInterfaces)*sizeof(USBD_PIPE_INFORMATION)))
112
113#define GET_SELECT_INTERFACE_REQUEST_SIZE(totalPipes)						\
114	(sizeof(struct _URB_SELECT_INTERFACE) +							\
115	  ((totalPipes-1)*sizeof(USBD_PIPE_INFORMATION)))
116
117#define GET_USBD_INTERFACE_SIZE(numEndpoints) (sizeof(USBD_INTERFACE_INFORMATION) +		\
118	(sizeof(USBD_PIPE_INFORMATION)*(numEndpoints))						\
119	  - sizeof(USBD_PIPE_INFORMATION))
120
121#define  GET_ISO_URB_SIZE(n) (sizeof(struct _URB_ISOCH_TRANSFER)+				\
122			      sizeof(USBD_ISO_PACKET_DESCRIPTOR)*n)
123
124#ifndef _USBD_
125
126DECLSPEC_IMPORT
127VOID
128NTAPI
129USBD_GetUSBDIVersion(
130  OUT PUSBD_VERSION_INFORMATION VersionInformation);
131
132DECLSPEC_IMPORT
133PUSB_INTERFACE_DESCRIPTOR
134NTAPI
135USBD_ParseConfigurationDescriptor(
136  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
137  IN UCHAR InterfaceNumber,
138  IN UCHAR AlternateSetting);
139
140DECLSPEC_IMPORT
141PURB
142NTAPI
143USBD_CreateConfigurationRequest(
144  IN  PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
145  OUT PUSHORT Siz);
146
147DECLSPEC_IMPORT
148PUSB_COMMON_DESCRIPTOR
149NTAPI
150USBD_ParseDescriptors(
151  IN PVOID DescriptorBuffer,
152  IN ULONG TotalLength,
153  IN PVOID StartPosition,
154  IN LONG DescriptorType);
155
156DECLSPEC_IMPORT
157PUSB_INTERFACE_DESCRIPTOR
158NTAPI
159USBD_ParseConfigurationDescriptorEx(
160  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
161  IN PVOID StartPosition,
162  IN LONG InterfaceNumber,
163  IN LONG AlternateSetting,
164  IN LONG InterfaceClass,
165  IN LONG InterfaceSubClass,
166  IN LONG InterfaceProtocol);
167
168DECLSPEC_IMPORT
169PURB
170NTAPI
171USBD_CreateConfigurationRequestEx(
172  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
173  IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList);
174
175DECLSPEC_EXPORT
176ULONG
177NTAPI
178USBD_GetInterfaceLength(
179  IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor,
180  IN PUCHAR BufferEnd);
181
182DECLSPEC_EXPORT
183VOID
184NTAPI
185USBD_RegisterHcFilter(
186  IN PDEVICE_OBJECT DeviceObject,
187  IN PDEVICE_OBJECT FilterDeviceObject);
188
189DECLSPEC_EXPORT
190NTSTATUS
191NTAPI
192USBD_GetPdoRegistryParameter(
193  IN PDEVICE_OBJECT PhysicalDeviceObject,
194  IN OUT PVOID Parameter,
195  IN ULONG ParameterLength,
196  IN PWSTR KeyName,
197  IN ULONG KeyNameLength);
198
199DECLSPEC_EXPORT
200NTSTATUS
201NTAPI
202USBD_QueryBusTime(
203  IN PDEVICE_OBJECT RootHubPdo,
204  OUT PULONG CurrentFrame);
205
206#if (NTDDI_VERSION >= NTDDI_WINXP)
207
208DECLSPEC_IMPORT
209ULONG
210NTAPI
211USBD_CalculateUsbBandwidth(
212  IN ULONG MaxPacketSize,
213  IN UCHAR EndpointType,
214  IN BOOLEAN LowSpeed);
215
216#endif
217
218#if (NTDDI_VERSION >= NTDDI_VISTA)
219
220DECLSPEC_IMPORT
221USBD_STATUS
222NTAPI
223USBD_ValidateConfigurationDescriptor(
224  IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc,
225  IN ULONG BufferLength,
226  IN USHORT Level,
227  OUT PUCHAR *Offset,
228  IN ULONG Tag OPTIONAL);
229
230#endif
231
232#endif /* ! _USBD_ */
233
234