FilterDevice: Extend IRP post processing logic

This patch adds support for IRP post processing
on failure and in all cases.

New logic will be used by following commits to
implement device text patching.

Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
This commit is contained in:
Dmitry Fleytman 2016-07-03 14:57:02 +03:00
parent e0c43569d3
commit 8c7edd9997
3 changed files with 25 additions and 10 deletions

View file

@ -244,7 +244,7 @@ NTSTATUS CUsbDkHubFilterStrategy::PNPPreProcess(PIRP Irp)
(BusRelations == irpStack->Parameters.QueryDeviceRelations.Type))
{
return PostProcessOnSuccess(Irp,
[this](PIRP Irp)
[this](PIRP Irp) -> NTSTATUS
{
CNonPagedDeviceRelations Relations;
auto status = Relations.Create((PDEVICE_RELATIONS)Irp->IoStatus.Information);
@ -252,7 +252,7 @@ NTSTATUS CUsbDkHubFilterStrategy::PNPPreProcess(PIRP Irp)
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Failed to create device relations object: %!STATUS!", status);
return;
return STATUS_SUCCESS;
}
TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Starting relations array processing:");
@ -261,6 +261,7 @@ NTSTATUS CUsbDkHubFilterStrategy::PNPPreProcess(PIRP Irp)
DropRemovedDevices(Relations);
AddNewDevices(Relations);
TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Finished relations array processing");
return STATUS_SUCCESS;
});
}

View file

@ -70,17 +70,29 @@ protected:
template<typename PostProcessFuncT>
NTSTATUS PostProcessOnSuccess(PIRP Irp, PostProcessFuncT PostProcessFunc)
{
return PostProcess(Irp, [PostProcessFunc](PIRP Irp, NTSTATUS Status) -> NTSTATUS
{ return NT_SUCCESS(Status) ? PostProcessFunc(Irp) : Status; });
}
template<typename PostProcessFuncT>
NTSTATUS PostProcessOnFailure(PIRP Irp, PostProcessFuncT PostProcessFunc)
{
return PostProcess(Irp, [PostProcessFunc](PIRP Irp, NTSTATUS Status) -> NTSTATUS
{ return !NT_SUCCESS(Status) ? PostProcessFunc(Irp, Status) : Status; });
}
template<typename PostProcessFuncT>
NTSTATUS PostProcess(PIRP Irp, PostProcessFuncT PostProcessFunc)
{
IoCopyCurrentIrpStackLocationToNext(Irp);
auto status = CIrp::ForwardAndWait(Irp, [this, Irp]()
{ return WdfDeviceWdmDispatchPreprocessedIrp(m_Owner->WdfObject(), Irp); });
{ return WdfDeviceWdmDispatchPreprocessedIrp(m_Owner->WdfObject(), Irp); });
if (NT_SUCCESS(status))
{
PostProcessFunc(Irp);
}
status = PostProcessFunc(Irp, status);
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}

View file

@ -105,14 +105,15 @@ NTSTATUS CUsbDkHiderStrategy::PNPPreProcess(PIRP Irp)
{
case IRP_MN_QUERY_ID:
return PostProcessOnSuccess(Irp,
[this](PIRP Irp)
[this](PIRP Irp) -> NTSTATUS
{
PatchDeviceID(Irp);
return STATUS_SUCCESS;
});
case IRP_MN_QUERY_CAPABILITIES:
return PostProcessOnSuccess(Irp,
[](PIRP Irp)
[](PIRP Irp) -> NTSTATUS
{
auto irpStack = IoGetCurrentIrpStackLocation(Irp);
irpStack->Parameters.DeviceCapabilities.Capabilities->RawDeviceOK = 1;
@ -120,7 +121,8 @@ NTSTATUS CUsbDkHiderStrategy::PNPPreProcess(PIRP Irp)
irpStack->Parameters.DeviceCapabilities.Capabilities->Removable = 0;
irpStack->Parameters.DeviceCapabilities.Capabilities->EjectSupported = 0;
irpStack->Parameters.DeviceCapabilities.Capabilities->SilentInstall = 1;
});
return STATUS_SUCCESS;
});
default:
return CUsbDkNullFilterStrategy::PNPPreProcess(Irp);
}