检测 win32 服务创建和删除的最佳方法

0 c++ service

我正在尝试构建一个使用 C++ 监视服务的工具 我想检测新添加的服务和删除的服务,而不需要连续使用 EnumServicesStatusExW 并将结果数组与前一个数组进行比较

所以我找到了两个函数 SubscribeServiceChangeNotifications , NotifyServiceStatusChangeA

我不知道使用哪个更好,我在 ProcessHacker 的导入中看到,但在导入中没有找到任何它们,所以我假设 ph 使用不同的方法

Rem*_*eau 5

SubscribeServiceChangeNotifications()可以使用SC_EVENT_DATABASE_CHANGE事件类型检测正在添加和删除的服务。此方法适用于 Windows 8 及更高版本。

NotifyServiceStatusChange()SERVICE_NOTIFY_CREATED还可以使用和通知掩码检测正在添加和删除的服务SERVICE_NOTIFY_DELETED。此方法适用于 Windows Vista 及更高版本。

否则,您可以监视HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services注册表项的子项更改,例如RegNotifyChangeKeyValue()使用REG_NOTIFY_CHANGE_NAME过滤器。此方法在 Windows 2000 及更高版本中可用。

因此,与其说“哪种方法最好”,不如说“哪种方法适合我的应用程序运行的 Windows 版本”。您的应用程序可以利用所有 3 种方法。使用动态加载GetProcAddress()或编译器的延迟加载功能(如果有的话),您可以在运行时检查 DLL 函数是否存在并采取相应措施。如果SubscribeServiceChangeNotifications()存在则使用它,否则如果NotifyServiceStatusChange()存在则使用它,否则如果RegNotifyChangeKeyValue()存在则使用它。