NTSTATUS CUsbDkRedirectorStrategy::PNPPreProcess(PIRP Irp) { PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); switch (irpStack->MinorFunction) { case IRP_MN_QUERY_ID: return PostProcessOnSuccess(Irp, [this](PIRP Irp) { PatchDeviceID(Irp); }); case IRP_MN_QUERY_CAPABILITIES: return PostProcessOnSuccess(Irp, [](PIRP Irp) { auto irpStack = IoGetCurrentIrpStackLocation(Irp); irpStack->Parameters.DeviceCapabilities.Capabilities->RawDeviceOK = 1; irpStack->Parameters.DeviceCapabilities.Capabilities->NoDisplayInUI = 1; irpStack->Parameters.DeviceCapabilities.Capabilities->Removable = 0; irpStack->Parameters.DeviceCapabilities.Capabilities->EjectSupported = 0; irpStack->Parameters.DeviceCapabilities.Capabilities->SilentInstall = 1; }); default: return CUsbDkFilterStrategy::PNPPreProcess(Irp); } }
NTSTATUS CUsbDkHubFilterStrategy::PNPPreProcess(PIRP Irp) { auto irpStack = IoGetCurrentIrpStackLocation(Irp); if ((irpStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS) && (BusRelations == irpStack->Parameters.QueryDeviceRelations.Type)) { return PostProcessOnSuccess(Irp, [this](PIRP Irp) { CNonPagedDeviceRelations Relations; auto status = Relations.Create((PDEVICE_RELATIONS)Irp->IoStatus.Information); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Failed to create device relations object: %!STATUS!", status); return; } TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Starting relations array processing:"); Relations.Dump(); DropRemovedDevices(Relations); AddNewDevices(Relations); WipeHiddenDevices(Relations); TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Finished relations array processing"); }); } return CUsbDkFilterStrategy::PNPPreProcess(Irp); }
NTSTATUS CUsbDkHubFilterStrategy::PNPPreProcess(PIRP Irp) { auto irpStack = IoGetCurrentIrpStackLocation(Irp); if ((irpStack->MinorFunction == IRP_MN_QUERY_DEVICE_RELATIONS) && (BusRelations == irpStack->Parameters.QueryDeviceRelations.Type)) { return PostProcessOnSuccess(Irp, [this](PIRP Irp) { CDeviceRelations Relations((PDEVICE_RELATIONS)Irp->IoStatus.Information); DropRemovedDevices(Relations); AddNewDevices(Relations); WipeHiddenDevices(Relations); }); } return CUsbDkFilterStrategy::PNPPreProcess(Irp); }