usbdlib.h 8.2 KB

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