UsbDk: Simplify QDR processing
QDR processing greatly simplified by using "Forward-Wait-Process" scheme instead of "Forward-Completion-Workitem-Process". Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
This commit is contained in:
parent
fada79a253
commit
bd7c2fd950
2 changed files with 20 additions and 53 deletions
|
|
@ -5,6 +5,7 @@
|
|||
#include "ControlDevice.h"
|
||||
#include "RedirectorDevice.h"
|
||||
#include "UsbDkNames.h"
|
||||
#include "Irp.h"
|
||||
|
||||
void CUsbDkChildDevice::Dump()
|
||||
{
|
||||
|
|
@ -35,41 +36,28 @@ NTSTATUS CUsbDkFilterDeviceInit::Configure(PFN_WDFDEVICE_WDM_IRP_PREPROCESS QDRP
|
|||
|
||||
NTSTATUS CUsbDkFilterDevice::QDRPreProcess(PIRP Irp)
|
||||
{
|
||||
PDEVICE_OBJECT wdmDevice = WdfDeviceWdmGetDeviceObject(m_Device);
|
||||
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
if (BusRelations != irpStack->Parameters.QueryDeviceRelations.Type)
|
||||
{
|
||||
IoSkipCurrentIrpStackLocation(Irp);
|
||||
return WdfDeviceWdmDispatchPreprocessedIrp(m_Device, Irp);
|
||||
}
|
||||
else
|
||||
{
|
||||
IoCopyCurrentIrpStackLocationToNext(Irp);
|
||||
IoSetCompletionRoutineEx(wdmDevice,
|
||||
Irp,
|
||||
(PIO_COMPLETION_ROUTINE) CUsbDkFilterDevice::QDRPostProcessWrap,
|
||||
this,
|
||||
TRUE, FALSE, FALSE);
|
||||
|
||||
auto status = CIrp::ForwardAndWait(Irp, [this, Irp]()
|
||||
{ return WdfDeviceWdmDispatchPreprocessedIrp(m_Device, Irp); });
|
||||
|
||||
if (NT_SUCCESS(status))
|
||||
{
|
||||
QDRPostProcess(Irp);
|
||||
}
|
||||
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
return status;
|
||||
}
|
||||
|
||||
return WdfDeviceWdmDispatchPreprocessedIrp(m_Device, Irp);
|
||||
}
|
||||
|
||||
NTSTATUS CUsbDkFilterDevice::QDRPostProcess(PIRP Irp)
|
||||
{
|
||||
if (Irp->PendingReturned)
|
||||
{
|
||||
IoMarkIrpPending(Irp);
|
||||
}
|
||||
|
||||
ASSERT(m_QDRIrp == nullptr);
|
||||
|
||||
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Queuing work item");
|
||||
|
||||
m_QDRIrp = Irp;
|
||||
m_QDRCompletionWorkItem.Enqueue();
|
||||
|
||||
return STATUS_MORE_PROCESSING_REQUIRED;
|
||||
}
|
||||
|
||||
class CDeviceRelations
|
||||
|
|
@ -247,22 +235,15 @@ void CUsbDkFilterDevice::FillRelationsArray(CDeviceRelations &Relations)
|
|||
});
|
||||
}
|
||||
|
||||
void CUsbDkFilterDevice::QDRPostProcessWi()
|
||||
void CUsbDkFilterDevice::QDRPostProcess(PIRP Irp)
|
||||
{
|
||||
ASSERT(m_QDRIrp != NULL);
|
||||
|
||||
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Entry");
|
||||
|
||||
CDeviceRelations Relations((PDEVICE_RELATIONS)m_QDRIrp->IoStatus.Information);
|
||||
CDeviceRelations Relations((PDEVICE_RELATIONS)Irp->IoStatus.Information);
|
||||
|
||||
DropRemovedDevices(Relations);
|
||||
AddNewDevices(Relations);
|
||||
FillRelationsArray(Relations);
|
||||
|
||||
auto QDRIrp = m_QDRIrp;
|
||||
m_QDRIrp = NULL;
|
||||
|
||||
IoCompleteRequest(QDRIrp, IO_NO_INCREMENT);
|
||||
}
|
||||
|
||||
CUsbDkFilterDevice::~CUsbDkFilterDevice()
|
||||
|
|
@ -324,18 +305,14 @@ NTSTATUS CUsbDkFilterDevice::CreateFilterDevice(PWDFDEVICE_INIT DevInit)
|
|||
|
||||
if (ShouldAttach())
|
||||
{
|
||||
status = m_QDRCompletionWorkItem.Create(m_Device);
|
||||
|
||||
ULONG traceLevel = NT_SUCCESS(status) ? TRACE_LEVEL_INFORMATION : TRACE_LEVEL_ERROR;
|
||||
TraceEvents(traceLevel, TRACE_FILTERDEVICE, "%!FUNC! Attachment status: %!STATUS!", status);
|
||||
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Attached");
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
status = STATUS_NOT_SUPPORTED;
|
||||
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Not attached");
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void CUsbDkFilterDevice::ContextCleanup(_In_ WDFOBJECT DeviceObject)
|
||||
|
|
|
|||
|
|
@ -84,7 +84,6 @@ class CUsbDkFilterDevice : public CWdfDevice, public CAllocatable<NonPagedPool,
|
|||
{
|
||||
public:
|
||||
CUsbDkFilterDevice()
|
||||
: m_QDRCompletionWorkItem(CUsbDkFilterDevice::QDRPostProcessWiWrap, this)
|
||||
{}
|
||||
|
||||
~CUsbDkFilterDevice();
|
||||
|
|
@ -118,13 +117,7 @@ private:
|
|||
{ return UsbDkFilterGetContext(Device)->UsbDkFilter->QDRPreProcess(Irp); }
|
||||
NTSTATUS QDRPreProcess(PIRP Irp);
|
||||
|
||||
static NTSTATUS QDRPostProcessWrap(_In_ PDEVICE_OBJECT, _In_ PIRP Irp, _In_ CUsbDkFilterDevice *This)
|
||||
{ return This->QDRPostProcess(Irp); }
|
||||
NTSTATUS QDRPostProcess(PIRP Irp);
|
||||
|
||||
static VOID CUsbDkFilterDevice::QDRPostProcessWiWrap(_In_ PVOID This)
|
||||
{ static_cast<CUsbDkFilterDevice*>(This)->QDRPostProcessWi(); }
|
||||
void CUsbDkFilterDevice::QDRPostProcessWi();
|
||||
void CUsbDkFilterDevice::QDRPostProcess(PIRP Irp);
|
||||
|
||||
bool ShouldAttach();
|
||||
|
||||
|
|
@ -136,9 +129,6 @@ private:
|
|||
void ApplyRedirectionPolicy(CUsbDkChildDevice &Device);
|
||||
void FillRelationsArray(CDeviceRelations &Relations);
|
||||
|
||||
CWdfWorkitem m_QDRCompletionWorkItem;
|
||||
|
||||
PIRP m_QDRIrp = nullptr;
|
||||
CUsbDkControlDevice *m_ControlDevice = nullptr;
|
||||
|
||||
WDFDRIVER m_Driver = WDF_NO_HANDLE;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue