From e05ca16aaa39a8e6f1e076f24e274d35ea8a4481 Mon Sep 17 00:00:00 2001 From: Dmitry Fleytman Date: Sun, 22 Mar 2015 18:47:36 +0200 Subject: [PATCH] ControlDevice: Split dynamic and persistent hide rules lists Required to properly support removal of persistent hide rule Signed-off-by: Dmitry Fleytman --- UsbDk/ControlDevice.cpp | 25 ++++++++++++++----------- UsbDk/ControlDevice.h | 14 +++++++++++--- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/UsbDk/ControlDevice.cpp b/UsbDk/ControlDevice.cpp index 9ed9798..b30e836 100644 --- a/UsbDk/ControlDevice.cpp +++ b/UsbDk/ControlDevice.cpp @@ -238,7 +238,7 @@ bool CUsbDkControlDevice::ShouldHide(const USB_DEVICE_DESCRIPTOR &DevDescriptor) { auto Hide = false; - const_cast(&m_HideRules)->ForEach([&DevDescriptor, &Hide](CUsbDkHideRule *Entry) -> bool + const auto &HideVisitor = [&DevDescriptor, &Hide](CUsbDkHideRule *Entry) -> bool { if (Entry->Match(DevDescriptor)) { @@ -247,7 +247,10 @@ bool CUsbDkControlDevice::ShouldHide(const USB_DEVICE_DESCRIPTOR &DevDescriptor) } return true; - }); + }; + + const_cast(&m_HideRules)->ForEach(HideVisitor); + const_cast(&m_PersistentHideRules)->ForEach(HideVisitor); return Hide; } @@ -424,7 +427,7 @@ NTSTATUS CUsbDkControlDevice::Register() if (NT_SUCCESS(status)) { FinishInitializing(); - LoadPersistentHideRules(); + ReloadPersistentHideRules(); } return status; @@ -637,7 +640,7 @@ NTSTATUS CUsbDkControlDevice::AddRedirect(const USB_DK_DEVICE_ID &DeviceId, PHAN return STATUS_SUCCESS; } -NTSTATUS CUsbDkControlDevice::AddHideRule(const USB_DK_HIDE_RULE &UsbDkRule) +NTSTATUS CUsbDkControlDevice::AddHideRuleToSet(const USB_DK_HIDE_RULE &UsbDkRule, HideRulesSet &Set) { TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_CONTROLDEVICE, "%!FUNC! entry"); @@ -656,14 +659,14 @@ NTSTATUS CUsbDkControlDevice::AddHideRule(const USB_DK_HIDE_RULE &UsbDkRule) return STATUS_INSUFFICIENT_RESOURCES; } - if(!m_HideRules.Add(NewRule)) + if(!Set.Add(NewRule)) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_CONTROLDEVICE, "%!FUNC! failed. Hide rule already present."); return STATUS_OBJECT_NAME_COLLISION; } TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_CONTROLDEVICE, "%!FUNC! Current hide rules:"); - m_HideRules.Dump(); + Set.Dump(); NewRule.detach(); return STATUS_SUCCESS; @@ -672,9 +675,7 @@ NTSTATUS CUsbDkControlDevice::AddHideRule(const USB_DK_HIDE_RULE &UsbDkRule) void CUsbDkControlDevice::ClearHideRules() { m_HideRules.Clear(); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_CONTROLDEVICE, "%!FUNC! All hide rules dropped."); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_CONTROLDEVICE, "%!FUNC! Reloading persistent hide rules."); - LoadPersistentHideRules(); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_CONTROLDEVICE, "%!FUNC! All dynamic hide rules dropped."); } class CHideRulesRegKey final : public CRegKey @@ -825,8 +826,10 @@ private: } }; -NTSTATUS CUsbDkControlDevice::LoadPersistentHideRules() +NTSTATUS CUsbDkControlDevice::ReloadPersistentHideRules() { + m_PersistentHideRules.Clear(); + CHideRulesRegKey RulesKey; auto status = RulesKey.Open(); if (NT_SUCCESS(status)) @@ -839,7 +842,7 @@ NTSTATUS CUsbDkControlDevice::LoadPersistentHideRules() if (NT_SUCCESS(Rule.Open(RulesKey, *Name)) && NT_SUCCESS(Rule.Read(ParsedRule))) { - AddHideRule(ParsedRule); + AddPersistentHideRule(ParsedRule); } }); } diff --git a/UsbDk/ControlDevice.h b/UsbDk/ControlDevice.h index 7056e71..209e193 100644 --- a/UsbDk/ControlDevice.h +++ b/UsbDk/ControlDevice.h @@ -218,12 +218,17 @@ public: ULONG CountDevices(); NTSTATUS RescanRegistry() - { return LoadPersistentHideRules(); } + { return ReloadPersistentHideRules(); } bool EnumerateDevices(USB_DK_DEVICE_INFO *outBuff, size_t numberAllocatedDevices, size_t &numberExistingDevices); NTSTATUS ResetUsbDevice(const USB_DK_DEVICE_ID &DeviceId); NTSTATUS AddRedirect(const USB_DK_DEVICE_ID &DeviceId, PHANDLE ObjectHandle); - NTSTATUS AddHideRule(const USB_DK_HIDE_RULE &UsbDkRule); + + NTSTATUS AddHideRule(const USB_DK_HIDE_RULE &UsbDkRule) + { return AddHideRuleToSet(UsbDkRule, m_HideRules); } + NTSTATUS AddPersistentHideRule(const USB_DK_HIDE_RULE &UsbDkRule) + { return AddHideRuleToSet(UsbDkRule, m_PersistentHideRules); } + void ClearHideRules(); NTSTATUS RemoveRedirect(const USB_DK_DEVICE_ID &DeviceId); @@ -261,7 +266,7 @@ public: bool WaitForDetachment(const USB_DK_DEVICE_ID &ID); private: - NTSTATUS LoadPersistentHideRules(); + NTSTATUS ReloadPersistentHideRules(); CObjHolder m_DeviceQueue; static CRefCountingHolder *m_UsbDkControlDevice; @@ -275,6 +280,9 @@ private: typedef CWdmSet HideRulesSet; HideRulesSet m_HideRules; + HideRulesSet m_PersistentHideRules; + + NTSTATUS AddHideRuleToSet(const USB_DK_HIDE_RULE &UsbDkRule, HideRulesSet &Set); template bool UsbDevicesForEachIf(TPredicate Predicate, TFunctor Functor)