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:
Dmitry Fleytman 2014-02-10 16:10:53 +02:00
parent d811f996f7
commit 3eca24570d
5 changed files with 196 additions and 12 deletions

View file

@ -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) \

View file

@ -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>

View file

@ -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
View 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
View 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;
};