1

我想为跨各种进程使用的某些资源创建事件并按名称访问这些事件。问题似乎是所有引用它们的应用程序都必须知道事件的名称。

有没有办法在系统中获取名称事件列表?

我知道我可能会使用一些标准名称,但在未来的可扩展性方面似乎相当不灵活(所有应用程序都需要重新编译)。


恐怕我连ZwOpenDirectoryObject都不能考虑,因为它被描述为需要Windows XP或更高版本,所以它是没有问题的。(还是)感谢你的建议。

我对共享内存有点不确定,因为到目前为止我还没有尝试过。我猜可能会在那个领域做一些阅读。配置文件和注册表是一个小问题,因为由于访问问题,它们在 Vista 中往往会失败。我有点害怕,共享内存也会有同样的问题。

ProcessExplorer 的想法听起来很有希望。有谁知道可用于列出流程事件的 API?而且,它是否可以在没有管理权限的情况下工作?


谢谢你的澄清。

没有真正的主进程。它更像是从不同进程使用的驱动程序 dll,事件将用于“锁定”这些进程使用的资源。

我正在考虑建立一个中央服务,即使在 Vista 下也有足够的访问权限。这肯定会使事情复杂化,但它可能是唯一面临安全问题的事情。

4

3 回答 3

2

不,没有任何工具可以枚举命名事件。您可以使用 ZwOpenDirectoryObject 枚举相应对象管理器目录中的所有对象,然后过滤事件。但此例程没有记录,因此不应在没有充分理由的情况下使用。

为什么不使用单独的机制来共享事件名称?您可以将它们列在配置文件、注册表项甚至共享内存中。

于 2008-08-30T08:39:48.373 回答
1

ProcessExplorer能够枚举某个特定进程持有的所有命名事件。您可以查看整个流程列表并执行类似的操作,尽管我现在知道使用什么 API 来获取列表...

于 2008-08-30T08:59:10.400 回答
1

不要将用户模式 ​​ZwOpenDirectoryObject 与内核模式 ZwOpenDirectoryObject 混为一谈——内核模式 API ( http://msdn.microsoft.com/en-us/library/ms800966.aspx ) 确实似乎仅在 XP 中可用,但是用户模式版本应该至少从 NT 4 开始可用。无论如何,我不建议使用 ZwOpenDirectoryObject。

为什么配置文件和注册表项在 Vista 上会失败?当然,您必须正确设置安全设置——但您也必须为命名事件这样做——所以这里应该没有太大区别。也许您应该告诉我们有关您的进程性质的更多详细信息——它们是否都在同一个登录会话中运行,或者它们甚至作为不同的用户运行?是否有一些主流程或谁首先创建了这些事件?

坦率地说,我倾向于发现 Process Explorer 的想法不是一个很好的想法。尽管如果不使用未记录的 API 和/或设备驱动程序,您可能无法做到这一点,但我认为一个进程不应该在另一个进程的句柄表中寻找一些名称内核对象。当然,同样的安全问题也同样适用。

于 2008-08-30T11:58:22.887 回答