reactos/sdk/lib/drivers/wdf/shared/inc/private/common/fxusbinterface.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

270 lines
4.9 KiB
C++

//
// Copyright (C) Microsoft. All rights reserved.
//
#ifndef _FXUSBINTERFACE_H_
#define _FXUSBINTERFACE_H_
extern "C" {
#include <usbdrivr.h>
#include <wdfusb.h>
}
#include "fxusbrequestcontext.hpp"
#define FX_USB_INTERFACE_TAG 'uItG' //using a random uniqure value
struct FxUsbInterfaceSetting{
PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
USB_INTERFACE_DESCRIPTOR InterfaceDescriptorAlloc;
#endif
};
class FxUsbInterface : public FxNonPagedObject { //any base class
public:
friend FxUsbDevice;
friend FxUsbPipe;
//friend FxUsbTarget;
FxUsbInterface(
_In_ PFX_DRIVER_GLOBALS FxDriverGlobals,
_In_ FxUsbDevice* UsbDevice,
_In_ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
);
VOID
SetInfo(
__in PUSBD_INTERFACE_INFORMATION Interface
);
VOID
CleanUpAndDelete(
__in BOOLEAN ClearDestroyCallback
);
_Must_inspect_result_
NTSTATUS
SelectSetting(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in PURB Urb
);
UCHAR
GetNumConfiguredPipes(
VOID
)
{
return m_NumberOfConfiguredPipes;
}
UCHAR
GetInterfaceNumber(
VOID
)
{
return m_InterfaceNumber;
}
UCHAR
GetNumSettings(
VOID
)
{
return m_NumSettings;
}
UCHAR
GetNumEndpoints(
__in UCHAR SettingIndex
);
VOID
GetEndpointInformation(
__in UCHAR SettingIndex,
__in UCHAR PipeIndex,
__in PWDF_USB_PIPE_INFORMATION PipeInfo
);
VOID
GetDescriptor(
__in PUSB_INTERFACE_DESCRIPTOR UsbInterfaceDescriptor,
__in UCHAR SettingIndex
);
//post config
UCHAR
GetConfiguredSettingIndex(
VOID
) ;
WDFUSBPIPE
GetConfiguredPipe(
__in UCHAR PipeIndex,
__out_opt PWDF_USB_PIPE_INFORMATION PipeInfo
);
_Must_inspect_result_
NTSTATUS
CreateSettings(
VOID
);
VOID
SetNumConfiguredPipes(
__in UCHAR NumberOfPipes
)
{
m_NumberOfConfiguredPipes = NumberOfPipes;
}
VOID
SetConfiguredPipes(
__in FxUsbPipe **ppPipes
)
{
m_ConfiguredPipes = ppPipes;
}
BOOLEAN
IsInterfaceConfigured(
VOID
)
{
return m_ConfiguredPipes != NULL ? TRUE : FALSE;
}
_Must_inspect_result_
NTSTATUS
SelectSettingByDescriptor(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor
);
_Must_inspect_result_
NTSTATUS
SelectSettingByIndex(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in UCHAR SettingIndex
);
VOID
CopyEndpointFieldsFromDescriptor(
__in PWDF_USB_PIPE_INFORMATION PipeInfo,
__in PUSB_ENDPOINT_DESCRIPTOR EndpointDesc,
__in UCHAR SettingIndex
);
ULONG
DetermineDefaultMaxTransferSize(
VOID
);
WDFUSBINTERFACE
GetHandle(VOID)
{
return (WDFUSBINTERFACE) GetObjectHandle();
}
PUSB_INTERFACE_DESCRIPTOR
GetSettingDescriptor(
__in UCHAR Setting
);
NTSTATUS
CheckAndSelectSettingByIndex(
__in UCHAR SettingIndex
);
NTSTATUS
UpdatePipeAttributes(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes
);
protected:
~FxUsbInterface(
VOID
);
VOID
RemoveDeletedPipe(
__in FxUsbPipe* Pipe
);
VOID
FormatSelectSettingUrb(
__in_bcount(GET_SELECT_INTERFACE_REQUEST_SIZE(NumEndpoints)) PURB Urb,
__in USHORT NumEndpoints,
__in UCHAR SettingNumber
);
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
public:
NTSTATUS
SetWinUsbHandle(
_In_ UCHAR FrameworkInterfaceIndex
);
NTSTATUS
MakeAndConfigurePipes(
__in PWDF_OBJECT_ATTRIBUTES PipesAttributes,
__in UCHAR NumPipes
);
#endif
protected:
//
// Backpointer to the owning device
//
FxUsbDevice* m_UsbDevice;
//
// Array of pipe pointers
//
FxUsbPipe** m_ConfiguredPipes;
//
// Array of alternative settings for the interface
//
__field_ecount(m_NumSettings) FxUsbInterfaceSetting* m_Settings;
//
// Number of elements in m_Settings
//
UCHAR m_NumSettings;
//
// Number of elements in m_ConfiguredPipes
//
UCHAR m_NumberOfConfiguredPipes;
//
// Information out of the interface descriptor
//
UCHAR m_InterfaceNumber;
UCHAR m_CurAlternateSetting;
UCHAR m_Class;
UCHAR m_SubClass;
UCHAR m_Protocol;
#if (FX_CORE_MODE == FX_CORE_USER_MODE)
private:
//
// Handle to USB interface exposed by WinUsb
//
WINUSB_INTERFACE_HANDLE m_WinUsbHandle;
#endif
};
#endif // _FXUSBINTERFACE_H_