UsbDk: Introduce generic WDF device wrappers
Classes for WDFDEVICE, WDFQUEUE, WDFDEVICEINIT introduced Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
This commit is contained in:
parent
d811f996f7
commit
3eca24570d
5 changed files with 196 additions and 12 deletions
|
|
@ -24,6 +24,10 @@
|
|||
WPP_DEFINE_BIT(TRACE_FILTER) \
|
||||
WPP_DEFINE_BIT(TRACE_DEVACCESS) \
|
||||
WPP_DEFINE_BIT(TRACE_REGTEXT) \
|
||||
WPP_DEFINE_BIT(TRACE_DEVICEINIT) \
|
||||
WPP_DEFINE_BIT(TRACE_CONTROLDEVICE) \
|
||||
WPP_DEFINE_BIT(TRACE_WDFDEVICE) \
|
||||
WPP_DEFINE_BIT(TRACE_WDFQUEUE) \
|
||||
)
|
||||
|
||||
#define WPP_FLAG_LEVEL_LOGGER(flag, level) \
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@
|
|||
<ClCompile Include="Irp.cpp" />
|
||||
<ClCompile Include="MemoryBuffer.cpp" />
|
||||
<ClCompile Include="RegText.cpp" />
|
||||
<ClCompile Include="WdfDevice.cpp" />
|
||||
<ClCompile Include="WdfWorkitem.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
@ -71,6 +72,7 @@
|
|||
<ClInclude Include="Public.h" />
|
||||
<ClInclude Include="RegText.h" />
|
||||
<ClInclude Include="Trace.h" />
|
||||
<ClInclude Include="WdfDevice.h" />
|
||||
<ClInclude Include="WdfWorkitem.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
|
|
@ -254,7 +256,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'">
|
||||
|
|
@ -264,7 +266,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'">
|
||||
|
|
@ -274,7 +276,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'">
|
||||
|
|
@ -284,7 +286,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|Win32'">
|
||||
|
|
@ -294,7 +296,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|Win32'">
|
||||
|
|
@ -304,7 +306,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|x64'">
|
||||
|
|
@ -314,7 +316,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|x64'">
|
||||
|
|
@ -324,7 +326,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|x64'">
|
||||
|
|
@ -334,7 +336,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|x64'">
|
||||
|
|
@ -344,7 +346,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Debug|x64'">
|
||||
|
|
@ -354,7 +356,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Win7 Release|x64'">
|
||||
|
|
@ -364,7 +366,7 @@
|
|||
<WppKernelMode>true</WppKernelMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\usbdex.lib;$(DDK_LIB_PATH)\ntstrsafe.lib;$(DDK_LIB_PATH)\wdmsec.lib</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -52,6 +52,9 @@
|
|||
<ClInclude Include="RegText.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="WdfDevice.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Filter.cpp">
|
||||
|
|
@ -78,5 +81,8 @@
|
|||
<ClCompile Include="RegText.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="WdfDevice.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
83
UsbDk/WdfDevice.cpp
Normal file
83
UsbDk/WdfDevice.cpp
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
#include "WdfDevice.h"
|
||||
#include "trace.h"
|
||||
#include "WdfDevice.tmh"
|
||||
|
||||
bool CDeviceInit::Create(_In_ WDFDRIVER Driver, _In_ CONST UNICODE_STRING &SDDLString)
|
||||
{
|
||||
m_DeviceInit = WdfControlDeviceInitAllocate(Driver, &SDDLString);
|
||||
return m_DeviceInit != nullptr;
|
||||
}
|
||||
|
||||
CDeviceInit::~CDeviceInit()
|
||||
{
|
||||
if (m_DeviceInit != nullptr)
|
||||
{
|
||||
WdfDeviceInitFree(m_DeviceInit);
|
||||
}
|
||||
}
|
||||
|
||||
NTSTATUS CDeviceInit::SetName(const UNICODE_STRING &Name)
|
||||
{
|
||||
auto status = WdfDeviceInitAssignName(m_DeviceInit, &Name);
|
||||
|
||||
if (!NT_SUCCESS(status)) {
|
||||
TraceEvents(TRACE_LEVEL_ERROR, TRACE_DEVICEINIT, "%!FUNC! failed %!STATUS!", status);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
NTSTATUS CWdfDevice::CreateSymLink(const UNICODE_STRING &Name)
|
||||
{
|
||||
auto status = WdfDeviceCreateSymbolicLink(m_Device, &Name);
|
||||
if (!NT_SUCCESS(status)) {
|
||||
TraceEvents(TRACE_LEVEL_ERROR, TRACE_WDFDEVICE, "%!FUNC! failed %!STATUS!", status);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
NTSTATUS CWdfDevice::Create(CDeviceInit &DeviceInit, WDF_OBJECT_ATTRIBUTES &DeviceAttr)
|
||||
{
|
||||
auto status = WdfDeviceCreate(DeviceInit, &DeviceAttr, &m_Device);
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(TRACE_LEVEL_ERROR, TRACE_WDFDEVICE, "%!FUNC! failed %!STATUS!", status);
|
||||
return status;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS CWdfQueue::Create()
|
||||
{
|
||||
WDF_IO_QUEUE_CONFIG QueueConfig;
|
||||
WDFQUEUE Queue;
|
||||
WDF_OBJECT_ATTRIBUTES Attributes;
|
||||
|
||||
InitConfig(QueueConfig);
|
||||
SetCallbacks(QueueConfig);
|
||||
|
||||
Attributes.ExecutionLevel = WdfExecutionLevelPassive;
|
||||
|
||||
auto status = m_OwnerDevice.AddQueue(QueueConfig, Attributes, Queue);
|
||||
if (!NT_SUCCESS(status)) {
|
||||
TraceEvents(TRACE_LEVEL_ERROR, TRACE_WDFQUEUE, "%!FUNC! failed %!STATUS!", status);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
NTSTATUS CWdfDevice::AddQueue(WDF_IO_QUEUE_CONFIG &Config, WDF_OBJECT_ATTRIBUTES &Attributes, WDFQUEUE &Queue)
|
||||
{
|
||||
auto status = WdfIoQueueCreate(m_Device, &Config, &Attributes, &Queue);
|
||||
if (!NT_SUCCESS(status)) {
|
||||
TraceEvents(TRACE_LEVEL_ERROR, TRACE_WDFDEVICE, "%!FUNC! failed %!STATUS!", status);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void CWdfDefaultQueue::InitConfig(WDF_IO_QUEUE_CONFIG &QueueConfig)
|
||||
{
|
||||
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(&QueueConfig, m_DispatchType);
|
||||
}
|
||||
89
UsbDk/WdfDevice.h
Normal file
89
UsbDk/WdfDevice.h
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
#pragma once
|
||||
|
||||
#include "ntddk.h"
|
||||
#include "wdf.h"
|
||||
|
||||
class CDeviceInit
|
||||
{
|
||||
public:
|
||||
bool Create(_In_ WDFDRIVER Driver, _In_ CONST UNICODE_STRING &SDDLString);
|
||||
CDeviceInit()
|
||||
{}
|
||||
~CDeviceInit();
|
||||
|
||||
void SetExclusive()
|
||||
{ WdfDeviceInitSetExclusive(m_DeviceInit, TRUE); }
|
||||
|
||||
void SetIoBuffered()
|
||||
{ WdfDeviceInitSetIoType(m_DeviceInit, WdfDeviceIoBuffered); }
|
||||
|
||||
NTSTATUS SetName(const UNICODE_STRING &Name);
|
||||
|
||||
operator PWDFDEVICE_INIT*()
|
||||
{ return &m_DeviceInit; }
|
||||
|
||||
CDeviceInit(const CDeviceInit&) = delete;
|
||||
CDeviceInit& operator= (const CDeviceInit&) = delete;
|
||||
private:
|
||||
PWDFDEVICE_INIT m_DeviceInit = nullptr;
|
||||
};
|
||||
|
||||
class CWdfDevice
|
||||
{
|
||||
public:
|
||||
CWdfDevice() {}
|
||||
|
||||
NTSTATUS CreateSymLink(const UNICODE_STRING &Name);
|
||||
NTSTATUS Create(CDeviceInit &DeviceInit, WDF_OBJECT_ATTRIBUTES &DeviceAttr);
|
||||
|
||||
CWdfDevice(const CWdfDevice&) = delete;
|
||||
CWdfDevice& operator= (const CWdfDevice&) = delete;
|
||||
protected:
|
||||
WDFDEVICE m_Device;
|
||||
|
||||
private:
|
||||
NTSTATUS AddQueue(WDF_IO_QUEUE_CONFIG &Config, WDF_OBJECT_ATTRIBUTES &Attributes, WDFQUEUE &Queue);
|
||||
|
||||
friend class CWdfQueue;
|
||||
};
|
||||
|
||||
class CWdfControlDevice : public CWdfDevice
|
||||
{
|
||||
public:
|
||||
void FinishInitializing()
|
||||
{ WdfControlFinishInitializing(m_Device); }
|
||||
};
|
||||
|
||||
class CWdfQueue
|
||||
{
|
||||
public:
|
||||
CWdfQueue(CWdfDevice &Device, WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
|
||||
: m_OwnerDevice(Device)
|
||||
, m_DispatchType(DispatchType)
|
||||
{}
|
||||
|
||||
NTSTATUS Create();
|
||||
protected:
|
||||
virtual void InitConfig(WDF_IO_QUEUE_CONFIG &QueueConfig) = 0;
|
||||
virtual void SetCallbacks(WDF_IO_QUEUE_CONFIG &QueueConfig) = 0;
|
||||
|
||||
CWdfDevice &m_OwnerDevice;
|
||||
WDF_IO_QUEUE_DISPATCH_TYPE m_DispatchType;
|
||||
|
||||
CWdfQueue(const CWdfQueue&) = delete;
|
||||
CWdfQueue& operator= (const CWdfQueue&) = delete;
|
||||
};
|
||||
|
||||
class CWdfDefaultQueue : public CWdfQueue
|
||||
{
|
||||
public:
|
||||
CWdfDefaultQueue(CWdfDevice &Device, WDF_IO_QUEUE_DISPATCH_TYPE DispatchType)
|
||||
: CWdfQueue(Device, DispatchType)
|
||||
{}
|
||||
|
||||
private:
|
||||
virtual void InitConfig(WDF_IO_QUEUE_CONFIG &QueueConfig) override;
|
||||
|
||||
CWdfDefaultQueue(const CWdfDefaultQueue&) = delete;
|
||||
CWdfDefaultQueue& operator= (const CWdfDefaultQueue&) = delete;
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue