ControlDevice: Split dynamic and persistent hide rules lists
Required to properly support removal of persistent hide rule Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
This commit is contained in:
parent
cc1092cf45
commit
e05ca16aaa
2 changed files with 25 additions and 14 deletions
|
|
@ -238,7 +238,7 @@ bool CUsbDkControlDevice::ShouldHide(const USB_DEVICE_DESCRIPTOR &DevDescriptor)
|
|||
{
|
||||
auto Hide = false;
|
||||
|
||||
const_cast<HideRulesSet*>(&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<HideRulesSet*>(&m_HideRules)->ForEach(HideVisitor);
|
||||
const_cast<HideRulesSet*>(&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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<CUsbDkControlDeviceQueue> m_DeviceQueue;
|
||||
static CRefCountingHolder<CUsbDkControlDevice> *m_UsbDkControlDevice;
|
||||
|
|
@ -275,6 +280,9 @@ private:
|
|||
|
||||
typedef CWdmSet<CUsbDkHideRule, CLockedAccess, CNonCountingObject> HideRulesSet;
|
||||
HideRulesSet m_HideRules;
|
||||
HideRulesSet m_PersistentHideRules;
|
||||
|
||||
NTSTATUS AddHideRuleToSet(const USB_DK_HIDE_RULE &UsbDkRule, HideRulesSet &Set);
|
||||
|
||||
template <typename TPredicate, typename TFunctor>
|
||||
bool UsbDevicesForEachIf(TPredicate Predicate, TFunctor Functor)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue