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:
parent
e0c43569d3
commit
8c7edd9997
3 changed files with 25 additions and 10 deletions
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue