是否可以在Windows中列出命名事件?
我想为跨各种进程使用的某些资源创建事件,并按名称访问这些事件。问题似乎在于,所有引用事件的应用程序都必须知道事件的名称。
是否有办法获取系统中的名称事件列表?
我知道我可能会使用一些标准名称,但是在将来的扩展性方面似乎不太灵活(所有应用程序都需要重新编译)。
恐怕,我什至不能考虑ZwOpenDirectoryObject,因为它被描述为需要Windows XP或者更高版本,因此毫无疑问。 (还是)感谢你的建议。
我对共享内存有点不确定,因为到目前为止我还没有尝试过。我猜可能在那方面做一些阅读。配置文件和注册表是一个小问题,因为由于访问问题,它们在Vista中确实会失败。我有点担心,共享内存会遇到同样的问题。
ProcessExplorer的想法听起来很有希望。有谁知道可用于列出流程事件的API?而且,它在没有管理权限的情况下还能正常工作吗?
谢谢你的澄清。
确实没有一个主过程。更多的是来自不同进程的驱动程序dll,这些事件将用于"锁定"这些进程使用的资源。
我正在考虑建立一个即使在Vista下也具有足够访问权限的中央服务。这肯定会使事情复杂化,但是它可能是唯一面临安全问题的事情。
解决方案
回答
不,没有任何枚举命名事件的功能。我们可以使用ZwOpenDirectoryObject枚举相应对象管理器目录中的所有对象,然后过滤事件。但是,此例程是未记录的,因此,没有正当理由不应该使用该例程。
为什么不使用单独的机制来共享事件名称?我们可以在配置文件,注册表项甚至共享内存中列出它们。
回答
ProcessExplorer能够枚举某个特定进程持有的所有命名事件。我们可以遍历整个流程列表并执行类似的操作,尽管我现在知道使用什么API来获取列表...
回答
请勿将用户模式ZwOpenDirectoryObject与内核模式ZwOpenDirectoryObject混合使用-内核模式API(http://msdn.microsoft.com/zh-cn/library/ms800966.aspx)确实仅在XP或者更高版本中可用,但是用户模式版本至少应从NT 4开始可用。无论如何,我不建议使用ZwOpenDirectoryObject。
为什么配置文件和注册表项在Vista上失败?当然,我们必须正确设置安全性设置-但我们也必须对命名事件执行此操作-因此此处应该没有太大的区别。也许我们应该向我们介绍有关流程性质的更多详细信息-它们都在同一登录会话中运行还是以不同的用户身份运行?并且是否有一些主要流程或者谁首先创建了事件?
坦率地说,我倾向于发现Process Explorer的想法不是一个好主意。尽管事实上,如果不使用未公开的API和/或者设备驱动程序,我们可能将无法完成此任务,但我认为不应在一个进程的句柄表中乱写一个进程,只是为了找出某个进程的名称。内核对象。而且,当然,同样的安全问题也会再次出现。