reactos/sdk/lib/drivers/wdf/shared/inc/private/common/fxusbdevice.hpp
Victor Perevertkin 1f377076d7
[WDF] Fix KMDF so it can compile with ReactOS SDK
Not all files are included, but these are necessary to compile cdrom driver.
So far it can only be statically linked with drivers, a proper
implementation requires wdfldr helper driver
2020-11-03 00:06:27 +03:00

667 lines
12 KiB
C++

/*++
Copyright (c) Microsoft Corporation
Module Name:
FxUsbDevice.hpp
Abstract:
Author:
Environment:
kernel mode only
Revision History:
--*/
#ifndef _FXUSBDEVICE_H_
#define _FXUSBDEVICE_H_
#include "fxusbrequestcontext.hpp"
typedef enum _FX_URB_TYPE : UCHAR {
FxUrbTypeLegacy,
FxUrbTypeUsbdAllocated
} FX_URB_TYPE;
struct FxUsbDeviceControlContext : public FxUsbRequestContext {
FxUsbDeviceControlContext(
__in FX_URB_TYPE FxUrbType
);
~FxUsbDeviceControlContext(
VOID
);
__checkReturn
NTSTATUS
AllocateUrb(
__in USBD_HANDLE USBDHandle
);
virtual
VOID
Dispose(
VOID
);
virtual
VOID
CopyParameters(
__in FxRequestBase* Request
);
VOID
StoreAndReferenceMemory(
__in FxUsbDevice* Device,
__in FxRequestBuffer* Buffer,
__in PWDF_USB_CONTROL_SETUP_PACKET SetupPacket
);
virtual
VOID
ReleaseAndRestore(
__in FxRequestBase* Request
);
USBD_STATUS
GetUsbdStatus(
VOID
);
private:
USBD_HANDLE m_USBDHandle;
public:
_URB_CONTROL_TRANSFER m_UrbLegacy;
//
// m_Urb will either point to m_UrbLegacy or one allocated by USBD_UrbAllocate
//
_URB_CONTROL_TRANSFER* m_Urb;
PMDL m_PartialMdl;
BOOLEAN m_UnlockPages;
};
struct FxUsbDeviceStringContext : public FxUsbRequestContext {
FxUsbDeviceStringContext(
__in FX_URB_TYPE FxUrbType
);
~FxUsbDeviceStringContext(
VOID
);
__checkReturn
NTSTATUS
AllocateUrb(
__in USBD_HANDLE USBDHandle
);
virtual
VOID
Dispose(
VOID
);
virtual
VOID
CopyParameters(
__in FxRequestBase* Request
);
VOID
SetUrbInfo(
__in UCHAR StringIndex,
__in USHORT LangID
);
USBD_STATUS
GetUsbdStatus(
VOID
);
_Must_inspect_result_
NTSTATUS
AllocateDescriptor(
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
__in size_t BufferSize
);
private:
USBD_HANDLE m_USBDHandle;
public:
_URB_CONTROL_DESCRIPTOR_REQUEST m_UrbLegacy;
//
// m_Urb will either point to m_UrbLegacy or one allocated by USBD_UrbAllocate
//
_URB_CONTROL_DESCRIPTOR_REQUEST* m_Urb;
PUSB_STRING_DESCRIPTOR m_StringDescriptor;
ULONG m_StringDescriptorLength;
};
class FxUsbUrb : public FxMemoryBufferPreallocated {
public:
FxUsbUrb(
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
__in USBD_HANDLE USBDHandle,
__in_bcount(BufferSize) PVOID Buffer,
__in size_t BufferSize
);
protected:
virtual
BOOLEAN
Dispose(
VOID
);
~FxUsbUrb();
private:
USBD_HANDLE m_USBDHandle;
};
#define FX_USB_DEVICE_TAG 'sUfD'
class FxUsbDevice : public FxIoTarget {
public:
friend FxUsbPipe;
friend FxUsbInterface;
FxUsbDevice(
__in PFX_DRIVER_GLOBALS FxDriverGlobals
);
_Must_inspect_result_
NTSTATUS
InitDevice(
__in ULONG USBDClientContractVersionForWdfClient
);
_Must_inspect_result_
NTSTATUS
GetConfigDescriptor(
__out PVOID ConfigDescriptor,
__inout PUSHORT ConfigDescriptorLength
);
_Must_inspect_result_
NTSTATUS
GetString(
__in_ecount(*NumCharacters) PUSHORT String,
__in PUSHORT NumCharacters,
__in UCHAR StringIndex,
__in_opt USHORT LangID,
__in_opt WDFREQUEST Request = NULL,
__in_opt PWDF_REQUEST_SEND_OPTIONS Options = NULL
);
__inline
VOID
CopyDeviceDescriptor(
__out PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor
)
{
RtlCopyMemory(UsbDeviceDescriptor,
&m_DeviceDescriptor,
sizeof(m_DeviceDescriptor));
}
VOID
GetInformation(
__out PWDF_USB_DEVICE_INFORMATION Information
);
__inline
USBD_CONFIGURATION_HANDLE
GetConfigHandle(
VOID
)
{
return m_ConfigHandle;
}
_Must_inspect_result_
__inline
NTSTATUS
GetCurrentFrameNumber(
__in PULONG Current
)
{
if (m_QueryBusTime != NULL) {
return m_QueryBusTime(m_BusInterfaceContext, Current);
}
else {
return STATUS_UNSUCCESSFUL;
}
}
_Must_inspect_result_
NTSTATUS
SelectConfigAuto(
__in PWDF_OBJECT_ATTRIBUTES PipeAttributes
);
_Must_inspect_result_
NTSTATUS
SelectConfigInterfaces(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
__in_ecount(NumInterfaces)PUSB_INTERFACE_DESCRIPTOR* InterfaceDescriptors,
__in ULONG NumInterfaces
);
_Must_inspect_result_
NTSTATUS
SelectConfig(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in PURB Urb,
__in FX_URB_TYPE FxUrbType,
__out_opt PUCHAR NumConfiguredInterfaces
);
_Must_inspect_result_
NTSTATUS
Deconfig(
VOID
);
_Must_inspect_result_
NTSTATUS
SelectInterfaceByInterface(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
);
_Must_inspect_result_
NTSTATUS
SelectInterface(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in PURB Urb
);
UCHAR
GetNumInterfaces(
VOID
)
{
return m_NumInterfaces;
}
UCHAR
GetInterfaceNumEndpoints(
__in UCHAR InterfaceNumber
);
WDFUSBPIPE
GetInterfacePipeReferenced(
__in UCHAR InterfaceNumber,
__in UCHAR EndpointNumber
);
_Must_inspect_result_
NTSTATUS
FormatStringRequest(
__in FxRequestBase* Request,
__in FxRequestBuffer *RequestBuffer,
__in UCHAR StringIndex,
__in USHORT LangID
);
_Must_inspect_result_
NTSTATUS
FormatControlRequest(
__in FxRequestBase* Request,
__in PWDF_USB_CONTROL_SETUP_PACKET Packet,
__in FxRequestBuffer *RequestBuffer
);
_Must_inspect_result_
NTSTATUS
IsConnected(
VOID
);
_Must_inspect_result_
NTSTATUS
Reset(
VOID
);
_Must_inspect_result_
NTSTATUS
CyclePort(
VOID
);
_Must_inspect_result_
NTSTATUS
FormatCycleRequest(
__in FxRequestBase* Request
);
BOOLEAN
OnUSBD(
VOID
)
{
return m_OnUSBD;
}
USBD_PIPE_HANDLE
GetControlPipeHandle(
VOID
)
{
return m_ControlPipe;
}
_Must_inspect_result_
NTSTATUS
CreateInterfaces(
VOID
);
_Must_inspect_result_
NTSTATUS
SelectConfigSingle(
__in PWDF_OBJECT_ATTRIBUTES PipeAttributes,
__in PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
);
_Must_inspect_result_
NTSTATUS
SelectConfigMulti(
__in PWDF_OBJECT_ATTRIBUTES PipeAttributes,
__in PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
);
_Must_inspect_result_
NTSTATUS
SelectConfigDescriptor(
__in PWDF_OBJECT_ATTRIBUTES PipeAttributes,
__in PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS Params
);
FxUsbInterface *
GetInterfaceFromIndex(
__in UCHAR InterfaceIndex
);
BOOLEAN
HasMismatchedInterfacesInConfigDescriptor(
VOID
)
{
return m_MismatchedInterfacesInConfigDescriptor;
}
VOID
CancelSentIo(
VOID
);
BOOLEAN
IsEnabled(
VOID
);
_Must_inspect_result_
NTSTATUS
QueryUsbCapability(
__in
CONST GUID* CapabilityType,
__in
ULONG CapabilityBufferLength,
__drv_when(CapabilityBufferLength == 0, __out_opt)
__drv_when(CapabilityBufferLength != 0 && ResultLength == NULL, __out_bcount(CapabilityBufferLength))
__drv_when(CapabilityBufferLength != 0 && ResultLength != NULL, __out_bcount_part_opt(CapabilityBufferLength, *ResultLength))
PVOID CapabilityBuffer,
__out_opt
__drv_when(ResultLength != NULL,__deref_out_range(<=,CapabilityBufferLength))
PULONG ResultLength
);
__checkReturn
NTSTATUS
CreateUrb(
__in_opt
PWDF_OBJECT_ATTRIBUTES Attributes,
__out
WDFMEMORY* UrbMemory,
__deref_opt_out_bcount(sizeof(URB))
PURB* Urb
);
#ifdef _MSC_VER
#pragma warning(disable:28285)
#endif
__checkReturn
NTSTATUS
CreateIsochUrb(
__in_opt
PWDF_OBJECT_ATTRIBUTES Attributes,
__in
ULONG NumberOfIsochPackets,
__out
WDFMEMORY* UrbMemory,
__deref_opt_out_bcount(GET_ISOCH_URB_SIZE(NumberOfIsochPackets))
PURB* Urb
);
USBD_HANDLE
GetUSBDHandle(
VOID
)
{
return m_USBDHandle;
}
FX_URB_TYPE
GetUrbType(
VOID
)
{
return m_UrbType;
}
FX_URB_TYPE
GetFxUrbTypeForRequest(
__in FxRequestBase* Request
);
BOOLEAN
IsObjectDisposedOnRemove(
__in FxObject* Object
);
protected:
~FxUsbDevice(
VOID
);
VOID
RemoveDeletedInterface(
__in FxUsbInterface* Interface
);
//
// FxIoTarget overrides
//
virtual
_Must_inspect_result_
NTSTATUS
Start(
VOID
);
virtual
VOID
Stop(
__in WDF_IO_TARGET_SENT_IO_ACTION Action
);
virtual
VOID
Purge(
__in WDF_IO_TARGET_PURGE_IO_ACTION Action
);
// end FxIoTarget overrides
VOID
PipesGotoRemoveState(
__in BOOLEAN ForceRemovePipes
);
static
VOID
_CleanupPipesRequests(
__in PLIST_ENTRY PendHead,
__in PSINGLE_LIST_ENTRY SentHead
);
FxUsbInterface *
GetInterfaceFromNumber(
__in UCHAR InterfaceNumber
);
_Must_inspect_result_
NTSTATUS
GetInterfaceNumberFromInterface(
__in WDFUSBINTERFACE UsbInterface,
__out PUCHAR InterfaceNumber
);
VOID
CleanupInterfacePipesAndDelete(
__in FxUsbInterface * UsbInterface
);
_Acquires_lock_(_Global_critical_region_)
VOID
AcquireInterfaceIterationLock(
VOID
)
{
m_InterfaceIterationLock.AcquireLock(GetDriverGlobals());
}
_Releases_lock_(_Global_critical_region_)
VOID
ReleaseInterfaceIterationLock(
VOID
)
{
m_InterfaceIterationLock.ReleaseLock(GetDriverGlobals());
}
ULONG
GetDefaultMaxTransferSize(
VOID
);
VOID
FormatInterfaceSelectSettingUrb(
__in PURB Urb,
__in USHORT NumEndpoints,
__in UCHAR InterfaceNumber,
__in UCHAR SettingNumber
);
virtual
BOOLEAN
Dispose(
VOID
);
_Must_inspect_result_
NTSTATUS
GetPortStatus(
__out PULONG PortStatus
);
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
_Must_inspect_result_
NTSTATUS
FxUsbDevice::SendSyncRequest(
__in FxSyncRequest* Request,
__in ULONGLONG Time
);
_Must_inspect_result_
NTSTATUS
SendSyncUmUrb(
__inout PUMURB Urb,
__in ULONGLONG Time,
__in_opt WDFREQUEST Request = NULL,
__in_opt PWDF_REQUEST_SEND_OPTIONS Options = NULL
);
#endif
protected:
USBD_HANDLE m_USBDHandle;
USBD_PIPE_HANDLE m_ControlPipe;
FxUsbInterface ** m_Interfaces;
USBD_CONFIGURATION_HANDLE m_ConfigHandle;
USB_DEVICE_DESCRIPTOR m_DeviceDescriptor;
PUSB_CONFIGURATION_DESCRIPTOR m_ConfigDescriptor;
USBD_VERSION_INFORMATION m_UsbdVersionInformation;
PUSB_BUSIFFN_QUERY_BUS_TIME m_QueryBusTime;
PVOID m_BusInterfaceContext;
PINTERFACE_DEREFERENCE m_BusInterfaceDereference;
FxWaitLockInternal m_InterfaceIterationLock;
ULONG m_HcdPortCapabilities;
ULONG m_Traits;
BOOLEAN m_OnUSBD;
UCHAR m_NumInterfaces;
BOOLEAN m_MismatchedInterfacesInConfigDescriptor;
FX_URB_TYPE m_UrbType;
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
private:
//
// Used to format the IWudfIrp for user-mode requests
//
IWudfFile* m_pHostTargetFile;
//
// Handle to the default USB interface exposed by WinUsb
//
WINUSB_INTERFACE_HANDLE m_WinUsbHandle;
#endif
};
#endif // _FXUSBDEVICE_H_