diff --git a/UsbDk/FilterStrategy.h b/UsbDk/FilterStrategy.h index 5e8ab35..fb425c6 100644 --- a/UsbDk/FilterStrategy.h +++ b/UsbDk/FilterStrategy.h @@ -59,6 +59,9 @@ public: CUsbDkControlDevice* GetControlDevice() { return m_ControlDevice; } + + virtual void OnClose(){} + protected: CUsbDkFilterDevice *m_Owner = nullptr; CUsbDkControlDevice *m_ControlDevice = nullptr; diff --git a/UsbDk/RedirectorStrategy.cpp b/UsbDk/RedirectorStrategy.cpp index 609ca21..a72cf9d 100644 --- a/UsbDk/RedirectorStrategy.cpp +++ b/UsbDk/RedirectorStrategy.cpp @@ -584,6 +584,19 @@ size_t CUsbDkRedirectorStrategy::GetRequestContextSize() } //-------------------------------------------------------------------------------------------------- +void CUsbDkRedirectorStrategy::OnClose() +{ + USB_DK_DEVICE_ID ID; + UsbDkFillIDStruct(&ID, *m_DeviceID->begin(), *m_InstanceID->begin()); + + auto status = m_ControlDevice->RemoveRedirect(ID); + if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, TRACE_REDIRECTOR, "%!FUNC! RemoveRedirect failed: %!STATUS!", status); + } +} +//-------------------------------------------------------------------------------------------------- + void CUsbDkRedirectorQueueData::SetCallbacks(WDF_IO_QUEUE_CONFIG &QueueConfig) { QueueConfig.EvtIoWrite = [](WDFQUEUE Q, WDFREQUEST R, size_t L) diff --git a/UsbDk/RedirectorStrategy.h b/UsbDk/RedirectorStrategy.h index fa3ef8a..7ec90fb 100644 --- a/UsbDk/RedirectorStrategy.h +++ b/UsbDk/RedirectorStrategy.h @@ -77,6 +77,8 @@ public: virtual void WritePipe(WDFREQUEST Request, size_t Length) override; virtual void ReadPipe(WDFREQUEST Request, size_t Length) override; + virtual void OnClose() override; + void SetDeviceID(CRegText *DevID) { m_DeviceID = DevID; }