我正在尝试构建使用c ++监视服务的工具 我想检测新添加的服务和服务的删除,而无需连续使用EnumServicesStatusExW并将结果数组与上一个进行比较
所以我来到了两个函数SubscribeServiceChangeNotifications,NotifyServiceStatusChangeA
我不知道哪种方法更好,并且我在ProcessHacker的导入中看到了,并且在导入中没有找到它们中的任何一个,所以我假设ph使用了不同的方法
答案 0 :(得分:3)
SubscribeServiceChangeNotifications()
可以使用SC_EVENT_DATABASE_CHANGE
事件类型检测正在添加和删除的服务。 Windows 8和更高版本中提供了此方法。
NotifyServiceStatusChange()
还可以使用SERVICE_NOTIFY_CREATED
和SERVICE_NOTIFY_DELETED
通知掩码来检测正在添加和删除的服务。 Windows Vista和更高版本中提供了此方法。
否则,您可以监视HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
注册表项的子项更改,例如使用REG_NOTIFY_CHANGE_NAME
过滤器来监视RegNotifyChangeKeyValue()
。 Windows 2000和更高版本中提供了此方法。
因此,与其说“哪种方法最好”,不如说是“哪种方法适合我的应用运行的Windows版本”。您的应用可以使用所有3种方法。通过GetProcAddress()
使用动态加载,或使用编译器的延迟加载功能(如果有),您可以在运行时检查DLL函数是否存在并采取相应措施。如果SubscribeServiceChangeNotifications()
存在,则使用它;否则,如果NotifyServiceStatusChange()
存在,则使用它;否则,如果RegNotifyChangeKeyValue()
存在,则使用它。