| 1 | #pragma once |
| 2 | |
| 3 | #ifndef DECLSPEC_EXPORT |
| 4 | #define DECLSPEC_EXPORT __declspec(dllexport) |
| 5 | #endif |
| 6 | |
| 7 | typedef 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 | |
| 126 | DECLSPEC_IMPORT |
| 127 | VOID |
| 128 | NTAPI |
| 129 | USBD_GetUSBDIVersion( |
| 130 | OUT PUSBD_VERSION_INFORMATION VersionInformation); |
| 131 | |
| 132 | DECLSPEC_IMPORT |
| 133 | PUSB_INTERFACE_DESCRIPTOR |
| 134 | NTAPI |
| 135 | USBD_ParseConfigurationDescriptor( |
| 136 | IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, |
| 137 | IN UCHAR InterfaceNumber, |
| 138 | IN UCHAR AlternateSetting); |
| 139 | |
| 140 | DECLSPEC_IMPORT |
| 141 | PURB |
| 142 | NTAPI |
| 143 | USBD_CreateConfigurationRequest( |
| 144 | IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, |
| 145 | OUT PUSHORT Siz); |
| 146 | |
| 147 | DECLSPEC_IMPORT |
| 148 | PUSB_COMMON_DESCRIPTOR |
| 149 | NTAPI |
| 150 | USBD_ParseDescriptors( |
| 151 | IN PVOID DescriptorBuffer, |
| 152 | IN ULONG TotalLength, |
| 153 | IN PVOID StartPosition, |
| 154 | IN LONG DescriptorType); |
| 155 | |
| 156 | DECLSPEC_IMPORT |
| 157 | PUSB_INTERFACE_DESCRIPTOR |
| 158 | NTAPI |
| 159 | USBD_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 | |
| 168 | DECLSPEC_IMPORT |
| 169 | PURB |
| 170 | NTAPI |
| 171 | USBD_CreateConfigurationRequestEx( |
| 172 | IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, |
| 173 | IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList); |
| 174 | |
| 175 | DECLSPEC_EXPORT |
| 176 | ULONG |
| 177 | NTAPI |
| 178 | USBD_GetInterfaceLength( |
| 179 | IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, |
| 180 | IN PUCHAR BufferEnd); |
| 181 | |
| 182 | DECLSPEC_EXPORT |
| 183 | VOID |
| 184 | NTAPI |
| 185 | USBD_RegisterHcFilter( |
| 186 | IN PDEVICE_OBJECT DeviceObject, |
| 187 | IN PDEVICE_OBJECT FilterDeviceObject); |
| 188 | |
| 189 | DECLSPEC_EXPORT |
| 190 | NTSTATUS |
| 191 | NTAPI |
| 192 | USBD_GetPdoRegistryParameter( |
| 193 | IN PDEVICE_OBJECT PhysicalDeviceObject, |
| 194 | IN OUT PVOID Parameter, |
| 195 | IN ULONG ParameterLength, |
| 196 | IN PWSTR KeyName, |
| 197 | IN ULONG KeyNameLength); |
| 198 | |
| 199 | DECLSPEC_EXPORT |
| 200 | NTSTATUS |
| 201 | NTAPI |
| 202 | USBD_QueryBusTime( |
| 203 | IN PDEVICE_OBJECT RootHubPdo, |
| 204 | OUT PULONG CurrentFrame); |
| 205 | |
| 206 | #if (NTDDI_VERSION >= NTDDI_WINXP) |
| 207 | |
| 208 | DECLSPEC_IMPORT |
| 209 | ULONG |
| 210 | NTAPI |
| 211 | USBD_CalculateUsbBandwidth( |
| 212 | IN ULONG MaxPacketSize, |
| 213 | IN UCHAR EndpointType, |
| 214 | IN BOOLEAN LowSpeed); |
| 215 | |
| 216 | #endif |
| 217 | |
| 218 | #if (NTDDI_VERSION >= NTDDI_VISTA) |
| 219 | |
| 220 | DECLSPEC_IMPORT |
| 221 | USBD_STATUS |
| 222 | NTAPI |
| 223 | USBD_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 | |