ReactOS 0.4.17-dev-1281-g065abb3
HubControlRequest Struct Reference

#include <hubreq.h>

Collaboration diagram for HubControlRequest:

Public Member Functions

_Must_inspect_result_ NTSTATUS Create (_In_ WDFOBJECT Parent, _In_ WDFIOTARGET SizingTarget)
 
VOID SetSetup (_In_ UCHAR RequestType, _In_ UCHAR RequestCode, _In_ USHORT Value, _In_ USHORT Index, _In_ USHORT Length)
 
NTSTATUS Send (_In_ WDFIOTARGET Target, _In_opt_ UCXUSBDEVICE Device, _In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE Completion, _In_ WDFCONTEXT Context, _In_reads_bytes_opt_(Length) PVOID Buffer, _In_ ULONG Length, _In_ BOOLEAN ShortTransferOk, _In_ BOOLEAN ForwardProgress)
 
VOID Reuse ()
 

Public Attributes

WDFREQUEST Request
 
PIRP Irp
 
struct _URB_CONTROL_TRANSFER_EX Urb
 
ULONG UsbdFlags
 

Detailed Description

A WDFREQUEST and the URB it carries, reused for every control transfer of one owner.

Definition at line 17 of file hubreq.h.

Member Function Documentation

◆ Create()

_Must_inspect_result_ NTSTATUS HubControlRequest::Create ( _In_ WDFOBJECT  Parent,
_In_ WDFIOTARGET  SizingTarget 
)

Definition at line 22 of file hubreq.cpp.

25{
28
30 Attributes.ParentObject = Parent;
31
32 Status = WdfRequestCreate(&Attributes, SizingTarget, &Request);
33 if (!NT_SUCCESS(Status))
34 {
35 DPRINT1("Control request create for %p failed 0x%lx\n", Parent, Status);
36 return Status;
37 }
38
39 Irp = WdfRequestWdmGetIrp(Request);
40 UsbdFlags = 0;
41 return STATUS_SUCCESS;
42}
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
_In_ ULONG Attributes
Definition: dispmprt.h:1077
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
Status
Definition: gdiplustypes.h:24
_In_ PIRP Irp
Definition: kse.h:79
#define STATUS_SUCCESS
Definition: shellext.h:65
ULONG UsbdFlags
Definition: hubreq.h:24
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFREQUEST Request
FORCEINLINE VOID WDF_OBJECT_ATTRIBUTES_INIT(_Out_ PWDF_OBJECT_ATTRIBUTES Attributes)
Definition: wdfobject.h:147

◆ Reuse()

VOID HubControlRequest::Reuse ( )

Definition at line 45 of file hubreq.cpp.

46{
49
51
52 Status = WdfRequestReuse(Request, &Params);
53 if (!NT_SUCCESS(Status))
54 DPRINT1("Reusing request %p failed 0x%lx\n", Request, Status);
55}
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
Definition: wdfrequest.h:308
@ WDF_REQUEST_REUSE_NO_FLAGS
Definition: wdfrequest.h:92
FORCEINLINE VOID WDF_REQUEST_REUSE_PARAMS_INIT(_Out_ PWDF_REQUEST_REUSE_PARAMS Params, _In_ ULONG Flags, _In_ NTSTATUS Status)
Definition: wdfrequest.h:364

Referenced by HubControlComplete(), HubMailboxComplete(), HubPipeResetComplete(), HubMachine::ResetStatusChangePipe(), and Send().

◆ Send()

NTSTATUS HubControlRequest::Send ( _In_ WDFIOTARGET  Target,
_In_opt_ UCXUSBDEVICE  Device,
_In_ PFN_WDF_REQUEST_COMPLETION_ROUTINE  Completion,
_In_ WDFCONTEXT  Context,
_In_reads_bytes_opt_(Length) PVOID  Buffer,
_In_ ULONG  Length,
_In_ BOOLEAN  ShortTransferOk,
_In_ BOOLEAN  ForwardProgress 
)

On failure the request was refused and is ready for reuse; on success the completion owns it.

Definition at line 62 of file hubreq.cpp.

71{
74
75 Urb.Hdr.Length = sizeof(Urb);
76 Urb.Hdr.Function = URB_FUNCTION_CONTROL_TRANSFER_EX;
77 Urb.Hdr.UsbdDeviceHandle = Device;
78 Urb.Hdr.UsbdFlags = UsbdFlags;
79
80 Urb.TransferFlags = USBD_DEFAULT_PIPE_TRANSFER;
81 if (ShortTransferOk)
82 Urb.TransferFlags |= USBD_SHORT_TRANSFER_OK;
83 if (Urb.SetupPacket[0] & 0x80)
84 Urb.TransferFlags |= USBD_TRANSFER_DIRECTION_IN;
85 if (ForwardProgress)
86 Urb.TransferFlags |= USB3_URB_RESERVED_RESOURCES;
87
88 Urb.TransferBufferLength = Length;
89 Urb.TransferBuffer = Buffer;
90 Urb.TransferBufferMDL = NULL;
92
93 RtlZeroMemory(&Stack, sizeof(Stack));
95 Stack.Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
96 Stack.Parameters.Others.Argument1 = &Urb;
97 WdfRequestWdmFormatUsingStackLocation(Request, &Stack);
98
99 WdfRequestSetCompletionRoutine(Request, Completion, Context);
100
102 return STATUS_SUCCESS;
103
104 Status = WdfRequestGetStatus(Request);
105 if (!NT_SUCCESS(Status))
106 {
107 DPRINT1("Control request 0x%x to device %p not sent 0x%lx\n", Urb.SetupPacket[1], Device, Status);
108 Reuse();
109 }
110
111 return Status;
112}
Definition: bufpool.h:45
#define NULL
Definition: types.h:112
#define USB3_URB_RESERVED_RESOURCES
Definition: hubreq.cpp:15
#define HUB_SETUP_REQUEST_TIMEOUT_MS
Definition: hubreq.h:11
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
Definition: hubucx.h:258
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
Definition: kse.h:81
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
struct _URB_CONTROL_TRANSFER_EX Urb
Definition: hubreq.h:21
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define USBD_TRANSFER_DIRECTION_IN
Definition: usb.h:167
#define USBD_SHORT_TRANSFER_OK
Definition: usb.h:161
#define USBD_DEFAULT_PIPE_TRANSFER
Definition: usb.h:163
#define IOCTL_INTERNAL_USB_SUBMIT_URB
Definition: usbioctl.h:32
_Must_inspect_result_ FORCEINLINE BOOLEAN WdfRequestSend(_In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_opt_ PWDF_REQUEST_SEND_OPTIONS Options)
Definition: wdfrequest.h:677
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:639
#define WDF_NO_SEND_OPTIONS
Definition: wdftypes.h:109
#define IRP_MJ_INTERNAL_DEVICE_CONTROL

Referenced by HubMachine::GetConfigDescriptor(), HubMailboxTransfer(), and HubSendControl().

◆ SetSetup()

VOID HubControlRequest::SetSetup ( _In_ UCHAR  RequestType,
_In_ UCHAR  RequestCode,
_In_ USHORT  Value,
_In_ USHORT  Index,
_In_ USHORT  Length 
)
inline

Setup packet fields, little endian as on the wire.

Definition at line 34 of file hubreq.h.

40 {
41 Urb.SetupPacket[0] = RequestType;
42 Urb.SetupPacket[1] = RequestCode;
43 Urb.SetupPacket[2] = (UCHAR)(Value & 0xFF);
44 Urb.SetupPacket[3] = (UCHAR)(Value >> 8);
45 Urb.SetupPacket[4] = (UCHAR)(Index & 0xFF);
46 Urb.SetupPacket[5] = (UCHAR)(Index >> 8);
47 Urb.SetupPacket[6] = (UCHAR)(Length & 0xFF);
48 Urb.SetupPacket[7] = (UCHAR)(Length >> 8);
49 }
unsigned char UCHAR
Definition: typedefs.h:53
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFQUEUE _In_ _Strict_type_match_ WDF_REQUEST_TYPE RequestType
Definition: wdfdevice.h:4239
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by HubMachine::AckHubChange(), HubMachine::GetConfigDescriptor(), HubMachine::GetHubDescriptor(), HubMachine::GetHubStatus(), HubMachine::GetPortStatus(), HubMachine::GetStandardStatus(), HubMailboxTransfer(), and HubMachine::SetHubDepth().

Member Data Documentation

◆ Irp

PIRP HubControlRequest::Irp

Definition at line 20 of file hubreq.h.

◆ Request

WDFREQUEST HubControlRequest::Request

Definition at line 19 of file hubreq.h.

Referenced by DeviceMachine::CancelTransfer(), and HubMachine::ResetStatusChangePipe().

◆ Urb

struct _URB_CONTROL_TRANSFER_EX HubControlRequest::Urb

◆ UsbdFlags

ULONG HubControlRequest::UsbdFlags

Definition at line 24 of file hubreq.h.

Referenced by Create(), and Send().


The documentation for this struct was generated from the following files: