From 093251727ede3db3fa86cb997fa55ce0a33e806a Mon Sep 17 00:00:00 2001 From: Pavel Gurvich Date: Thu, 29 May 2014 17:49:17 +0300 Subject: [PATCH] UsbDk: Add OnClose callback to Strategies OnClose is called when device symlink is fully closed by used mode. For redirector strategy OnClose stops redirection. For other strategies OnClose is currently no-op. Signed-off-by: Pavel Gurvich Signed-off-by: Dmitry Fleytman --- UsbDk/FilterStrategy.h | 3 +++ UsbDk/RedirectorStrategy.cpp | 13 +++++++++++++ UsbDk/RedirectorStrategy.h | 2 ++ 3 files changed, 18 insertions(+) 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; }