ReactOS  0.4.15-dev-3177-gd6a0299
usbutil.hpp File Reference

Go to the source code of this file.

Enumerations

enum  FxUsbValidateDescriptorOp { FxUsbValidateDescriptorOpEqual, FxUsbValidateDescriptorOpAtLeast }
 

Functions

BOOLEAN __inline FxBitArraySet (__inout_xcount((BitNumber/sizeof(UCHAR))+1) PUCHAR BitArray, __in UCHAR BitNumber)
 
VOID __inline FxBitArrayClear (__inout_xcount((BitNumber/sizeof(UCHAR))+1) PUCHAR BitArray, __in UCHAR BitNumber)
 
VOID FxFormatUsbRequest (__in FxRequestBase *Request, __in PURB Urb, __in FX_URB_TYPE FxUrbType, __drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE UsbdHandle)
 
NTSTATUS FxFormatUrbRequest (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in FxIoTarget *Target, __in FxRequestBase *Request, __in FxRequestBuffer *Buffer, __in FX_URB_TYPE FxUrbType, __drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE UsbdHandle)
 
PUSB_INTERFACE_DESCRIPTOR FxUsbParseConfigurationDescriptor (__in PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, __in UCHAR InterfaceNumber=-1, __in UCHAR AlternateSetting=1)
 
PURB FxUsbCreateConfigRequest (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, __in PUSBD_INTERFACE_LIST_ENTRY InterfaceList, __in ULONG DefaultMaxPacketSize)
 
NTSTATUS FxUsbValidateConfigDescriptorHeaders (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor, __in size_t ConfigDescriptorLength)
 
PUSB_COMMON_DESCRIPTOR FxUsbFindDescriptorType (__in PVOID Buffer, __in size_t BufferLength, __in PVOID Start, __in LONG DescriptorType)
 
NTSTATUS FxUsbValidateDescriptorType (__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptor, __in PVOID Start, __in PVOID End, __in LONG DescriptorType, __in size_t SizeToValidate, __in FxUsbValidateDescriptorOp Op, __in ULONG MaximumNumDescriptorsToValidate)
 
VOID FxUsbUmFormatRequest (__in FxRequestBase *Request, __in_xcount(Urb->Length) PUMURB_HEADER Urb, __in IWudfFile *HostFile, __in BOOLEAN Reuse=FALSE)
 
VOID FxUsbUmInitDescriptorUrb (__inout PUMURB UmUrb, __in WINUSB_INTERFACE_HANDLE WinUsbHandle, __in UCHAR DescriptorType, __in ULONG BufferLength, __in PVOID Buffer)
 
VOID FxUsbUmInitControlTransferUrb (__inout PUMURB UmUrb, __in WINUSB_INTERFACE_HANDLE WinUsbHandle, __in ULONG BufferLength, __in PVOID Buffer)
 
VOID FxUsbUmInitInformationUrb (__inout PUMURB UmUrb, __in WINUSB_INTERFACE_HANDLE WinUsbHandle, __in ULONG BufferLength, __in PVOID Buffer)
 

Enumeration Type Documentation

◆ FxUsbValidateDescriptorOp

Enumerator
FxUsbValidateDescriptorOpEqual 
FxUsbValidateDescriptorOpAtLeast 

Definition at line 126 of file usbutil.hpp.

Function Documentation

◆ FxBitArrayClear()

VOID __inline FxBitArrayClear ( __inout_xcount((BitNumber/sizeof(UCHAR))+1) PUCHAR  BitArray,
__in UCHAR  BitNumber 
)

Definition at line 49 of file usbutil.hpp.

64 {
65  UCHAR index;
66  UCHAR bit;
67 
68  index = BitNumber / sizeof(UCHAR);
69  bit = (UCHAR) (1 << (BitNumber % sizeof(UCHAR)) );
70 
71  BitArray[index] &= ~bit;
72 }
GLuint index
Definition: glext.h:6031
unsigned char UCHAR
Definition: xmlstorage.h:181
#define index(s, c)
Definition: various.h:29

◆ FxBitArraySet()

BOOLEAN __inline FxBitArraySet ( __inout_xcount((BitNumber/sizeof(UCHAR))+1) PUCHAR  BitArray,
__in UCHAR  BitNumber 
)

Definition at line 9 of file usbutil.hpp.

29 {
30  UCHAR index;
31  UCHAR bit;
32 
33  index = (BitNumber) / sizeof(UCHAR);
34  bit = (UCHAR) (1 << (BitNumber % sizeof(UCHAR)) );
35 
36  if ((BitArray[index] & bit) == 0x0) {
37  //
38  // bit not set
39  //
40  BitArray[index] |= bit;
41  return FALSE;
42  }
43 
44  return TRUE;
45 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
GLuint index
Definition: glext.h:6031
unsigned char UCHAR
Definition: xmlstorage.h:181
#define index(s, c)
Definition: various.h:29

Referenced by FxUsbDevice::CreateInterfaces(), and FxUsbDevice::SelectConfigMulti().

◆ FxFormatUrbRequest()

NTSTATUS FxFormatUrbRequest ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in FxIoTarget Target,
__in FxRequestBase Request,
__in FxRequestBuffer Buffer,
__in FX_URB_TYPE  FxUrbType,
__drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE  UsbdHandle 
)

Definition at line 62 of file usbutil.cpp.

72 {
73  FxUsbUrbContext* pContext;
75 
76  status = Request->ValidateTarget(Target);
77  if (!NT_SUCCESS(status)) {
79  "FormatUrbRequest: Target %p, Request %p, "
80  "setting target failed, %!STATUS!",
82 
83  return status;
84  }
85 
86  if (Request->HasContextType(FX_RCT_USB_URB_REQUEST)) {
87  pContext = (FxUsbUrbContext*) Request->GetContext();
88  }
89  else {
90  pContext = new(Target->GetDriverGlobals()) FxUsbUrbContext();
91 
92  if (pContext == NULL) {
94  }
95 
96  Request->SetContext(pContext);
97  }
98 
99  //
100  // Always set the memory after determining the context. This way we can
101  // free a previously referenced memory object if necessary.
102  //
103  pContext->StoreAndReferenceMemory(Buffer);
104 
105  FxFormatUsbRequest(Request, pContext->m_pUrb, FxUrbType, UsbdHandle);
106 
107  return STATUS_SUCCESS;
108 }
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
LONG NTSTATUS
Definition: precomp.h:26
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
#define TRACE_LEVEL_VERBOSE
Definition: storswtr.h:30
Definition: bufpool.h:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
#define STATUS_SUCCESS
Definition: shellext.h:65
virtual VOID StoreAndReferenceMemory(__in FxRequestBuffer *Buffer)
Definition: fxusbpipe.cpp:937
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
VOID FxFormatUsbRequest(__in FxRequestBase *Request, __in PURB Urb, __in FX_URB_TYPE FxUrbType, __drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE UsbdHandle)
Definition: usbutil.cpp:29
Definition: ps.c:97

Referenced by __in_xcount().

◆ FxFormatUsbRequest()

VOID FxFormatUsbRequest ( __in FxRequestBase Request,
__in PURB  Urb,
__in FX_URB_TYPE  FxUrbType,
__drv_when(FxUrbType==FxUrbTypeUsbdAllocated, __in) __drv_when(FxUrbType !=FxUrbTypeUsbdAllocated, __in_opt) USBD_HANDLE  UsbdHandle 
)

Definition at line 29 of file usbutil.cpp.

37 {
38  FxIrp* irp;
39 
40  ASSERT(Urb->UrbHeader.Length >= sizeof(_URB_HEADER));
41 
42  irp = Request->GetSubmitFxIrp();
46 
47 
48 
49 
50 
51  if (FxUrbType == FxUrbTypeUsbdAllocated) {
53  }
54  else {
56  }
57 
58  Request->VerifierSetFormatted();
59 }
VOID SetMajorFunction(__in UCHAR MajorFunction)
Definition: fxirpum.cpp:905
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
VOID SetNextStackParameterOthersArgument1(__in PVOID Argument1)
Definition: fxirpum.cpp:1411
Definition: fxirp.hpp:28
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
VOID USBD_AssignUrbToIoStackLocation(_In_ USBD_HANDLE USBDHandle, _In_ PIO_STACK_LOCATION IoStackLocation, _In_ PURB Urb)
Definition: usbstubum.cpp:136
VOID ClearNextStackLocation(VOID)
Definition: fxirpum.cpp:1581
PIO_STACK_LOCATION GetNextIrpStackLocation(VOID)
Definition: fxirpum.cpp:387
#define ASSERT(a)
Definition: mode.c:44
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
VOID SetParameterIoctlCode(__in ULONG DeviceIoControlCode)
Definition: fxirpum.cpp:1157
FxIrp * irp

Referenced by FxUsbDevice::Deconfig(), FxUsbPipe::FormatAbortRequest(), FxUsbDevice::FormatControlRequest(), FxUsbPipe::FormatResetRequest(), FxUsbDevice::FormatStringRequest(), FxUsbPipe::FormatTransferRequest(), FxFormatUrbRequest(), FxUsbDevice::GetString(), FxUsbDevice::InitDevice(), FxUsbDevice::SelectConfig(), and FxUsbInterface::SelectSetting().

◆ FxUsbCreateConfigRequest()

PURB FxUsbCreateConfigRequest ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in PUSB_CONFIGURATION_DESCRIPTOR  ConfigDesc,
__in PUSBD_INTERFACE_LIST_ENTRY  InterfaceList,
__in ULONG  DefaultMaxPacketSize 
)

Definition at line 364 of file usbutil.cpp.

370 {
371  PURB urb;
373  USHORT size;
374 
375  //
376  // Our mission here is to construct a URB of the proper
377  // size and format for a select_configuration request.
378  //
379  // This function uses the configuration descriptor as a
380  // reference and builds a URB with interface_information
381  // structures for each interface requested in the interface
382  // list passed in
383  //
384  // NOTE: the config descriptor may contain interfaces that
385  // the caller does not specify in the list -- in this case
386  // the other interfaces will be ignored.
387  //
388 
389  //
390  // First figure out how many interfaces we are dealing with
391  //
393 
394  //
395  // For a multiple interface configuration, GET_SELECT_CONFIGURATION_REQUEST_SIZE
396  // doesn't work as expected. This is because it subtracts one from totalPipes
397  // to compensate for the embedded USBD_PIPE_INFORMATION in USBD_INTERFACE_INFORMATION.
398  // A multiple interface device will have more then one embedded
399  // USBD_PIPE_INFORMATION in its configuration request and any of these interfaces
400  // might not have any pipes on them.
401  //
402  // To fix, just iterate and compute the size incrementally.
403  //
406 
407  while (pList->InterfaceDescriptor != NULL) {
409 
410  status = RtlUShortAdd(size,
412  pList->InterfaceDescriptor->bNumEndpoints),
413  &size);
414  if (!NT_SUCCESS(status)) {
416  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIOTARGET,
417  "InterfaceList %p, NumEndPoints 0x%x, "
418  "Integer overflow while calculating interface size, %!STATUS!",
420  pList->InterfaceDescriptor->bNumEndpoints,
421  status);
422  return NULL;
423  }
424  pList++;
425  }
426  }
427  else {
429  }
430 
431  //
432  // Make sure we are dealing with a value that fits into a USHORT
433  //
434  ASSERT(size <= 0xFFFF);
435 
436  urb = (PURB) FxPoolAllocate(FxDriverGlobals, NonPagedPool, size);
437 
438  if (urb != NULL) {
439  PUCHAR pCur;
440 
441  //
442  // now all we have to do is initialize the urb
443  //
444  RtlZeroMemory(urb, size);
445 
447 
448  pCur = (PUCHAR) &urb->UrbSelectConfiguration.Interface;
449  while (pList->InterfaceDescriptor != NULL) {
450  PUSB_INTERFACE_DESCRIPTOR pInterfaceDesc;
451  PUSBD_INTERFACE_INFORMATION pInterfaceInfo;
452 
453  pInterfaceDesc = pList->InterfaceDescriptor;
454 
455  pInterfaceInfo = (PUSBD_INTERFACE_INFORMATION) pCur;
456 #pragma prefast(suppress: __WARNING_BUFFER_OVERFLOW, "Esp:675");
457  pInterfaceInfo->InterfaceNumber = pInterfaceDesc->bInterfaceNumber;
458  pInterfaceInfo->AlternateSetting = pInterfaceDesc->bAlternateSetting;
459  pInterfaceInfo->NumberOfPipes = pInterfaceDesc->bNumEndpoints;
460  pInterfaceInfo->Length = (USHORT)
461  GET_USBD_INTERFACE_SIZE(pInterfaceDesc->bNumEndpoints);
462 
463  for (LONG j = 0; j < pInterfaceDesc->bNumEndpoints; j++) {
464  pInterfaceInfo->Pipes[j].PipeFlags = 0;
465  pInterfaceInfo->Pipes[j].MaximumTransferSize = DefaultMaxPacketSize;
466  }
467 
468  ASSERT(pCur + pInterfaceInfo->Length <= ((PUCHAR) urb) + size);
469 
470  pList->Interface = pInterfaceInfo;
471 
472  pList++;
473  pCur += pInterfaceInfo->Length;
474  }
475 
476  urb->UrbHeader.Length = size;
478  urb->UrbSelectConfiguration.ConfigurationDescriptor = ConfigDesc;
479  }
480 
481  return urb;
482 }
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
unsigned char * PUCHAR
Definition: retypes.h:3
USBD_PIPE_INFORMATION Pipes[1]
Definition: usb.h:286
_In_ WDFUSBINTERFACE _In_ UCHAR _Out_ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
Definition: wdfusb.h:2329
_In_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList
Definition: usbdlib.h:181
LONG NTSTATUS
Definition: precomp.h:26
struct _USBD_INTERFACE_INFORMATION * PUSBD_INTERFACE_INFORMATION
Definition: usbdlib.h:7
long LONG
Definition: pedump.c:60
FxChildList * pList
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
struct _URB_HEADER UrbHeader
Definition: usb.h:531
GLsizeiptr size
Definition: glext.h:5919
#define ASSERT(a)
Definition: mode.c:44
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define GET_USBD_INTERFACE_SIZE(numEndpoints)
Definition: usbdlib.h:121
ULONG MaximumTransferSize
Definition: usb.h:265
#define URB_FUNCTION_SELECT_CONFIGURATION
Definition: usb.h:86
struct _URB * PURB
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration
Definition: usb.h:533
Definition: usb.h:529
unsigned short USHORT
Definition: pedump.c:61
SINGLE_LIST_ENTRY * pCur
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
static SERVICE_STATUS status
Definition: service.c:31
#define TRACINGIOTARGET
Definition: dbgtrace.h:72
Definition: ps.c:97

Referenced by FxUsbDevice::SelectConfigDescriptor(), FxUsbDevice::SelectConfigInterfaces(), FxUsbDevice::SelectConfigMulti(), and FxUsbDevice::SelectConfigSingle().

◆ FxUsbFindDescriptorType()

PUSB_COMMON_DESCRIPTOR FxUsbFindDescriptorType ( __in PVOID  Buffer,
__in size_t  BufferLength,
__in PVOID  Start,
__in LONG  DescriptorType 
)

Definition at line 174 of file usbutil.cpp.

180 {
182  PUCHAR pCur, pEnd;
183 
184  pCur = (PUCHAR) Start;
185  pEnd = ((PUCHAR) Buffer) + BufferLength;
186 
187  while (pCur < pEnd) {
188  //
189  // Check to see if the current point is the desired descriptor type
190  //
192 
193  if (descriptor->bDescriptorType == DescriptorType) {
194  return descriptor;
195  }
196 
197  pCur += descriptor->bLength;
198  }
199 
200  //
201  // Iterated to the end and found nothing
202  //
203  return NULL;
204 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
unsigned char * PUCHAR
Definition: retypes.h:3
descriptor
Definition: scsi.h:3951
Definition: bufpool.h:45
struct _USB_COMMON_DESCRIPTOR * PUSB_COMMON_DESCRIPTOR
Definition: partlist.h:33
SINGLE_LIST_ENTRY * pCur
#define NULL
Definition: types.h:112
_In_ ULONG _In_ PVOID _In_ LONG DescriptorType
Definition: usbdlib.h:158

Referenced by FxUsbDevice::CreateInterfaces(), FxUsbInterface::CreateSettings(), FxUsbParseConfigurationDescriptor(), and FxUsbValidateDescriptorType().

◆ FxUsbParseConfigurationDescriptor()

PUSB_INTERFACE_DESCRIPTOR FxUsbParseConfigurationDescriptor ( __in PUSB_CONFIGURATION_DESCRIPTOR  ConfigDesc,
__in UCHAR  InterfaceNumber = -1,
__in UCHAR  AlternateSetting = 1 
)

Definition at line 307 of file usbutil.cpp.

312 {
313  PUSB_INTERFACE_DESCRIPTOR found, usbInterface;
314  PVOID pStart;
315 
316  found = NULL,
317 
318  ASSERT(ConfigDesc->bDescriptorType == USB_CONFIGURATION_DESCRIPTOR_TYPE);
319 
320  //
321  // Walk the table of descriptors looking for an interface descriptor with
322  // parameters matching those passed in.
323  //
324  pStart = ConfigDesc;
325 
326  do {
327  //
328  // Search for descriptor type 'interface'
329  //
330  usbInterface = (PUSB_INTERFACE_DESCRIPTOR)
331  FxUsbFindDescriptorType(ConfigDesc,
332  ConfigDesc->wTotalLength,
333  pStart,
335 
336  //
337  // Check to see if have a matching descriptor by eliminating mismatches
338  //
339  if (usbInterface != NULL) {
340  found = usbInterface;
341 
342  if (InterfaceNumber != -1 &&
343  usbInterface->bInterfaceNumber != InterfaceNumber) {
344  found = NULL;
345  }
346 
347  if (AlternateSetting != -1 &&
348  usbInterface->bAlternateSetting != AlternateSetting) {
349  found = NULL;
350  }
351 
352  pStart = ((PUCHAR)usbInterface) + usbInterface->bLength;
353  }
354 
355  if (found != NULL) {
356  break;
357  }
358  } while (usbInterface!= NULL);
359 
360  return found;
361 }
_In_ PVOID _In_ LONG _In_ LONG AlternateSetting
Definition: usbdlib.h:168
unsigned char * PUCHAR
Definition: retypes.h:3
struct _USB_INTERFACE_DESCRIPTOR * PUSB_INTERFACE_DESCRIPTOR
PUSB_COMMON_DESCRIPTOR FxUsbFindDescriptorType(__in PVOID Buffer, __in size_t BufferLength, __in PVOID Start, __in LONG DescriptorType)
Definition: usbutil.cpp:174
#define USB_CONFIGURATION_DESCRIPTOR_TYPE
Definition: usb100.h:50
#define USB_INTERFACE_DESCRIPTOR_TYPE
Definition: usb100.h:52
_In_ PVOID _In_ LONG InterfaceNumber
Definition: usbdlib.h:168
#define ASSERT(a)
Definition: mode.c:44
#define NULL
Definition: types.h:112

Referenced by FxUsbDevice::SelectConfigMulti().

◆ FxUsbUmFormatRequest()

VOID FxUsbUmFormatRequest ( __in FxRequestBase Request,
__in_xcount(Urb->Length) PUMURB_HEADER  Urb,
__in IWudfFile *  HostFile,
__in BOOLEAN  Reuse = FALSE 
)

Definition at line 486 of file usbutil.cpp.

511 {
512  FX_VERIFY(INTERNAL, CHECK_NOT_NULL(Request));
513  FX_VERIFY(INTERNAL, CHECK_NOT_NULL(Urb));
514  FX_VERIFY(INTERNAL, CHECK_TODO(Urb->Length >= sizeof(_UMURB_HEADER)));
515  FX_VERIFY(INTERNAL, CHECK_NOT_NULL(HostFile));
516 
517  IWudfIoIrp* pIoIrp = NULL;
518  IWudfIrp* pIrp = Request->GetSubmitIrp();
519 
520  if (Reuse) {
521  //
522  // This allows us to use the same FxSyncRequest
523  // stack object multiple times.
524  //
525  Request->GetSubmitFxIrp()->Reuse(STATUS_SUCCESS);
526  Request->ClearFieldsForReuse();
527  }
528 
529  HRESULT hrQI = pIrp->QueryInterface(IID_IWudfIoIrp, (PVOID*)&pIoIrp);
530  FX_VERIFY(INTERNAL, CHECK_QI(hrQI, pIoIrp));
531 
532  pIoIrp->SetTypeForNextStackLocation(UMINT::WdfRequestInternalIoctl);
533 
534 
535 
536 
537  pIoIrp->SetDeviceIoControlParametersForNextStackLocation(IOCTL_INETRNAL_USB_SUBMIT_UMURB,
538  0,
539  0);
540 
541  pIoIrp->SetOtherParametersForNextStackLocation((PVOID*)&Urb,
542  NULL,
543  NULL,
544  NULL);
545 
546  pIoIrp->SetFileForNextIrpStackLocation(HostFile);
547 
548  //
549  // Release reference taken by QI
550  //
551  SAFE_RELEASE(pIoIrp);
552  Request->VerifierSetFormatted();
553 }
#define IOCTL_INETRNAL_USB_SUBMIT_UMURB
Definition: umusb.h:259
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
FxIrp * pIrp
#define SAFE_RELEASE(p)
HRESULT hrQI
Definition: framework.cpp:106
FX_VERIFY(INTERNAL, CHECK_NOT_NULL(LoaderInterface->pIWudfHost))
LONG HRESULT
Definition: typedefs.h:79
return pRequest Reuse(ReuseParams)
#define NULL
Definition: types.h:112
VOID Reuse(__in NTSTATUS Status=STATUS_SUCCESS)
Definition: fxirpum.cpp:661
#define STATUS_SUCCESS
Definition: shellext.h:65

Referenced by FxUsbPipe::FormatAbortRequest(), FxUsbPipe::FormatResetRequest(), and FxUsbDevice::SendSyncUmUrb().

◆ FxUsbUmInitControlTransferUrb()

VOID FxUsbUmInitControlTransferUrb ( __inout PUMURB  UmUrb,
__in WINUSB_INTERFACE_HANDLE  WinUsbHandle,
__in ULONG  BufferLength,
__in PVOID  Buffer 
)

Definition at line 578 of file usbutil.cpp.

584 {
585  RtlZeroMemory(UmUrb, sizeof(UMURB));
586 
587  UmUrb->UmUrbControlTransfer.Hdr.InterfaceHandle = WinUsbHandle;
588  UmUrb->UmUrbControlTransfer.Hdr.Function = UMURB_FUNCTION_CONTROL_TRANSFER;
589  UmUrb->UmUrbControlTransfer.Hdr.Length = sizeof(_UMURB_CONTROL_TRANSFER);
590 
591  UmUrb->UmUrbControlTransfer.TransferBufferLength = BufferLength;
592  UmUrb->UmUrbControlTransfer.TransferBuffer = Buffer;
593 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
Definition: umusb.h:173
#define UMURB_FUNCTION_CONTROL_TRANSFER
Definition: umusb.h:16
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

◆ FxUsbUmInitDescriptorUrb()

VOID FxUsbUmInitDescriptorUrb ( __inout PUMURB  UmUrb,
__in WINUSB_INTERFACE_HANDLE  WinUsbHandle,
__in UCHAR  DescriptorType,
__in ULONG  BufferLength,
__in PVOID  Buffer 
)

Definition at line 556 of file usbutil.cpp.

563 {
564  RtlZeroMemory(UmUrb, sizeof(UMURB));
565 
566  UmUrb->UmUrbDescriptorRequest.Hdr.InterfaceHandle = WinUsbHandle;
567  UmUrb->UmUrbDescriptorRequest.Hdr.Function = UMURB_FUNCTION_GET_DESCRIPTOR;
568  UmUrb->UmUrbDescriptorRequest.Hdr.Length = sizeof(_UMURB_DESCRIPTOR_REQUEST);
569 
570  UmUrb->UmUrbDescriptorRequest.DescriptorType = DescriptorType;
571  UmUrb->UmUrbDescriptorRequest.Index = 0;
572  UmUrb->UmUrbDescriptorRequest.LanguageID = 0;
573  UmUrb->UmUrbDescriptorRequest.BufferLength = BufferLength;
574  UmUrb->UmUrbDescriptorRequest.Buffer = Buffer;
575 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
Definition: umusb.h:173
#define UMURB_FUNCTION_GET_DESCRIPTOR
Definition: umusb.h:56
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
_In_ ULONG _In_ PVOID _In_ LONG DescriptorType
Definition: usbdlib.h:158

◆ FxUsbUmInitInformationUrb()

VOID FxUsbUmInitInformationUrb ( __inout PUMURB  UmUrb,
__in WINUSB_INTERFACE_HANDLE  WinUsbHandle,
__in ULONG  BufferLength,
__in PVOID  Buffer 
)

Definition at line 596 of file usbutil.cpp.

602 {
603  RtlZeroMemory(UmUrb, sizeof(UMURB));
604 
605  UmUrb->UmUrbDeviceInformation.Hdr.InterfaceHandle = WinUsbHandle;
606  UmUrb->UmUrbDeviceInformation.Hdr.Function = UMURB_FUNCTION_GET_DEVICE_INFORMATION;
607  UmUrb->UmUrbDeviceInformation.Hdr.Length = sizeof(_UMURB_DEVICE_INFORMATION);
608 
609  UmUrb->UmUrbDeviceInformation.InformationType = DEVICE_SPEED;
610  UmUrb->UmUrbDeviceInformation.BufferLength = BufferLength;
611  UmUrb->UmUrbDeviceInformation.Buffer = Buffer;
612 }
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
Definition: umusb.h:173
#define UMURB_FUNCTION_GET_DEVICE_INFORMATION
Definition: umusb.h:55
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262

◆ FxUsbValidateConfigDescriptorHeaders()

NTSTATUS FxUsbValidateConfigDescriptorHeaders ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in PUSB_CONFIGURATION_DESCRIPTOR  ConfigDescriptor,
__in size_t  ConfigDescriptorLength 
)

Definition at line 111 of file usbutil.cpp.

116 {
117  PUCHAR pCur, pEnd;
118 
120  pEnd = pCur + ConfigDescriptorLength;
121 
122  while (pCur < pEnd) {
124 
125  //
126  // Make sure we can safely deref bLength, bDescriptorType
127  //
128  if (pCur + sizeof(USB_COMMON_DESCRIPTOR) > pEnd) {
130  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIOTARGET,
131  "USB Configuration packet contains bad data, expected "
132  "at least %d remaining bytes in config descriptor at "
133  "offset %I64d, total size is %I64d",
136  );
138  }
139 
140  //
141  // Make sure bLength is within bounds of the config descriptor
142  //
143  if ((pCur + pDescriptor->bLength) > pEnd) {
145  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIOTARGET,
146  "USB Configuration packet contains bad data, descriptor at offset "
147  "%I64d specified bLength %d, only %I64d bytes remaining in config "
148  "descriptor, total size is %I64d",
149  pCur-(PUCHAR)ConfigDescriptor, pDescriptor->bLength, pEnd-pCur,
151  );
153  }
154 
155  if (pDescriptor->bLength == 0) {
157  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIOTARGET,
158  "USB Configuration packet contains bad data, descriptor at offset "
159  "%I64d contains bLength == 0, this is due to a broken device or driver",
161  );
163  }
164 
165 
166  pCur += pDescriptor->bLength;
167  }
168 
169  return STATUS_SUCCESS;
170 }
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
unsigned char * PUCHAR
Definition: retypes.h:3
_Must_inspect_result_ _In_ WDFUSBDEVICE _Out_writes_bytes_to_opt_ ConfigDescriptorLength PVOID _Inout_ PUSHORT ConfigDescriptorLength
Definition: wdfusb.h:1036
_Must_inspect_result_ _In_ WDFUSBDEVICE _Out_writes_bytes_to_opt_ ConfigDescriptorLength PVOID ConfigDescriptor
Definition: wdfusb.h:1036
struct _USB_COMMON_DESCRIPTOR * PUSB_COMMON_DESCRIPTOR
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
SINGLE_LIST_ENTRY * pCur
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACINGIOTARGET
Definition: dbgtrace.h:72

Referenced by FxUsbDevice::CreateInterfaces().

◆ FxUsbValidateDescriptorType()

NTSTATUS FxUsbValidateDescriptorType ( __in PFX_DRIVER_GLOBALS  FxDriverGlobals,
__in PUSB_CONFIGURATION_DESCRIPTOR  ConfigDescriptor,
__in PVOID  Start,
__in PVOID  End,
__in LONG  DescriptorType,
__in size_t  SizeToValidate,
__in FxUsbValidateDescriptorOp  Op,
__in ULONG  MaximumNumDescriptorsToValidate 
)

Definition at line 207 of file usbutil.cpp.

240 {
241  PUSB_COMMON_DESCRIPTOR pDescriptor = NULL;
242  PVOID pCur = Start;
243  ULONG i = 1;
244 
245  while ((pDescriptor = FxUsbFindDescriptorType(Start,
246  (PUCHAR)End-(PUCHAR)Start,
247  pCur,
249  )) != NULL) {
250  //
251  // Make sure bLength is the correct value
252  //
253  if (Op == FxUsbValidateDescriptorOpEqual) {
254  if (pDescriptor->bLength != SizeToValidate) {
256  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIOTARGET,
257  "USB Configuration packet contains bad data, found descriptor "
258  "#%d of type %d at offset %I64d, expected bLength of %I64d, found %d",
259  i, DescriptorType, ((PUCHAR)pDescriptor)-((PUCHAR)ConfigDescriptor),
260  SizeToValidate, pDescriptor->bLength
261  );
263  }
264  }
265  else if (Op == FxUsbValidateDescriptorOpAtLeast) {
266  if (pDescriptor->bLength < SizeToValidate) {
268  FxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGIOTARGET,
269  "USB Configuration packet contains bad data, found descriptor "
270  "#%d of type %d at offset %I64d, expected minimum bLength of %I64d, "
271  "found %d",
272  i, DescriptorType, ((PUCHAR)pDescriptor)-((PUCHAR)ConfigDescriptor),
273  SizeToValidate, pDescriptor->bLength
274  );
276  }
277  }
278 
279  //
280  // No need to validate WDF_PTR_ADD_OFFSET(pDescriptor, pDescriptor->bLength) > End
281  // because FxUsbValidateConfigDescriptorHeaders already has done so. End is either
282  // 1) == end of the config descriptor, in which case FxUsbValidateConfigDescriptorHeaders
283  // directly validated bLength
284  // or
285  // 2) End is somewere in the middle of the config descriptor and ASSUMED to be the start
286  // of a common descriptor header. To find that value of End, we would have had to use
287  // pDescriptor->bLength to get to End, we would not overrun
288  //
289 
290  //
291  // i is one based, so the current value is Nth descriptor we have validated. If
292  // the caller wants to limit the number of descriptors validated by indicating a
293  // Max > 0, stop with success if the condition is met.
294  //
295  if (MaximumNumDescriptorsToValidate > 0 && i == MaximumNumDescriptorsToValidate) {
296  break;
297  }
298 
299  pCur = WDF_PTR_ADD_OFFSET(pDescriptor, pDescriptor->bLength);
300  i++;
301  }
302 
303  return STATUS_SUCCESS;
304 }
#define WDF_PTR_ADD_OFFSET(_ptr, _offset)
Definition: wdfcore.h:144
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
unsigned char * PUCHAR
Definition: retypes.h:3
PUSB_COMMON_DESCRIPTOR FxUsbFindDescriptorType(__in PVOID Buffer, __in size_t BufferLength, __in PVOID Start, __in LONG DescriptorType)
Definition: usbutil.cpp:174
_Must_inspect_result_ _In_ WDFUSBDEVICE _Out_writes_bytes_to_opt_ ConfigDescriptorLength PVOID ConfigDescriptor
Definition: wdfusb.h:1036
Definition: partlist.h:33
#define TRACE_LEVEL_ERROR
Definition: storswtr.h:27
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
SINGLE_LIST_ENTRY * pCur
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
#define NULL
Definition: types.h:112
unsigned int ULONG
Definition: retypes.h:1
#define STATUS_SUCCESS
Definition: shellext.h:65
_In_ ULONG _In_ PVOID _In_ LONG DescriptorType
Definition: usbdlib.h:158
#define TRACINGIOTARGET
Definition: dbgtrace.h:72

Referenced by FxUsbDevice::CreateInterfaces(), and FxUsbInterface::CreateSettings().