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

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

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


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

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

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


谢谢你的澄清。

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

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

有帮助吗?

解决方案

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

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

坦率地说,我倾向于认为 Process Explorer 的想法不是一个很好的想法。尽管如果不使用未记录的 API 和/或设备驱动程序,您可能无法完成此任务,但我不认为一个进程应该在另一个进程的句柄表中探索,只是为了找出某些进程的名称。内核对象。当然,同样的安全问题再次出现。

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top