NTSTATUS CUsbDkFilterDevice::Create(PWDFDEVICE_INIT DevInit) { CUsbDkFilterDeviceInit DeviceInit(DevInit); TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Entry"); auto status = DeviceInit.Configure(GetInstanceNumber()); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Failed to create device init"); return status; } WDF_OBJECT_ATTRIBUTES attr; WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attr, USBDK_FILTER_DEVICE_EXTENSION); attr.EvtCleanupCallback = CUsbDkFilterDevice::ContextCleanup; status = CWdfDevice::Create(DeviceInit, attr); if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Failed to create device"); return status; } auto deviceContext = UsbDkFilterGetContext(m_Device); deviceContext->UsbDkFilter = this; return STATUS_SUCCESS; }
void CUsbDkFilterDevice::ContextCleanup(_In_ WDFOBJECT DeviceObject) { PAGED_CODE(); TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_FILTERDEVICE, "%!FUNC! Entry"); auto deviceContext = UsbDkFilterGetContext(DeviceObject); deviceContext->UsbDkFilter->Release(); }
static CUsbDkFilterDevice::CStrategist &Strategy(WDFDEVICE Device) { return UsbDkFilterGetContext(Device)->UsbDkFilter->m_Strategy; }
void CUsbDkRedirectorQueueConfig::SetCallbacks(WDF_IO_QUEUE_CONFIG &QueueConfig) { QueueConfig.EvtIoDeviceControl = [](WDFQUEUE Q, WDFREQUEST R, size_t OL, size_t IL, ULONG CTL) { UsbDkFilterGetContext(WdfIoQueueGetDevice(Q))->UsbDkFilter->m_Strategy->IoDeviceControlConfig(R, OL, IL, CTL); }; }