NTSTATUS CUsbDkFilterDeviceInit::Configure(ULONG InstanceNumber) { PAGED_CODE(); WDF_OBJECT_ATTRIBUTES requestAttributes; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&requestAttributes, WDF_REQUEST_CONTEXT); requestAttributes.ContextSizeOverride = CUsbDkFilterDevice::CStrategist::GetRequestContextSize(); SetRequestAttributes(requestAttributes); SetFilter(); CString DeviceName; auto status = DeviceName.Create(TEXT("\\Device\\UsbDkFilter"), InstanceNumber); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Failed to allocate filter device name (%!STATUS!)", status); return status; } status = SetName(*DeviceName); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! SetName failed %!STATUS!", status); return status; } SetPowerCallbacks([](_In_ WDFDEVICE Device) { return Strategy(Device)->MakeAvailable(); }); SetIoInCallerContextCallback([](_In_ WDFDEVICE Device, WDFREQUEST Request) { return Strategy(Device)->IoInCallerContext(Device, Request); }); SetFileEventCallbacks(WDF_NO_EVENT_CALLBACK, [](_In_ WDFFILEOBJECT FileObject) { WDFDEVICE Device = WdfFileObjectGetDevice(FileObject); Strategy(Device)->OnClose(); }, WDF_NO_EVENT_CALLBACK); status = SetPreprocessCallback([](_In_ WDFDEVICE Device, _Inout_ PIRP Irp) { return Strategy(Device)->PNPPreProcess(Irp); }, IRP_MJ_PNP); return status; }
void CUsbDkRedirectorStrategy::PatchDeviceID(PIRP Irp) { static const WCHAR RedirectorDeviceId[] = L"USB\\Vid_2B23&Pid_CAFE&Rev_0001"; static const WCHAR RedirectorHardwareIds[] = L"USB\\Vid_2B23&Pid_CAFE&Rev_0001\0USB\\Vid_2B23&Pid_CAFE\0"; static const WCHAR RedirectorCompatibleIds[] = L"USB\\Class_FF&SubClass_FF&Prot_FF\0USB\\Class_FF&SubClass_FF\0USB\\Class_FF\0"; static const size_t MAX_DEC_NUMBER_LEN = 11; WCHAR SzInstanceID[ARRAY_SIZE(USBDK_DRIVER_NAME) + MAX_DEC_NUMBER_LEN + 1]; const WCHAR *Buffer; SIZE_T Size = 0; PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp); switch (irpStack->Parameters.QueryId.IdType) { case BusQueryDeviceID: Buffer = &RedirectorDeviceId[0]; Size = sizeof(RedirectorDeviceId); break; case BusQueryInstanceID: { CString InstanceID; auto status = InstanceID.Create(USBDK_DRIVER_NAME, m_Owner->GetInstanceNumber()); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR, "%!FUNC! Failed to create instance ID string %!STATUS!", status); return; } Size = InstanceID.ToWSTR(SzInstanceID, sizeof(SzInstanceID)); Buffer = &SzInstanceID[0]; break; } case BusQueryHardwareIDs: Buffer = &RedirectorHardwareIds[0]; Size = sizeof(RedirectorHardwareIds); break; case BusQueryCompatibleIDs: Buffer = &RedirectorCompatibleIds[0]; Size = sizeof(RedirectorCompatibleIds); break; default: Buffer = nullptr; break; } if (Buffer != nullptr) { auto Result = DuplicateStaticBuffer(Buffer, Size); if (Result == nullptr) { return; } if (Irp->IoStatus.Information) { ExFreePool(reinterpret_cast<PVOID>(Irp->IoStatus.Information)); } Irp->IoStatus.Information = reinterpret_cast<ULONG_PTR>(Result); } }