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 234