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