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

时间:2018-10-25 19:40:00

标签: c++ service

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

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

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

1 个答案:

答案 0 :(得分:3)

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

NotifyServiceStatusChange()还可以使用SERVICE_NOTIFY_CREATEDSERVICE_NOTIFY_DELETED通知掩码来检测正在添加和删除的服务。 Windows Vista和更高版本中提供了此方法。

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

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