【问题标题】:Are winapi handles global?winapi 句柄是全球性的吗?
【发布时间】:2012-03-22 20:02:24
【问题描述】:

一个非常简单的问题,如果我在 app1.exe 中创建一个 HANDLE 并获得值 0x01,那么该值是全局唯一的吗?

或者是否有可能当某个其他进程创建一个HANDLE 时也具有0x01 的值。

如果它们不是唯一的,我可以使用什么其他构造来获得与句柄兼容的唯一 ID(这样在其他任何地方创建具有该 ID 的 HANDLE 是不可能或极不可能的)。

【问题讨论】:

  • 您已将两个问题合二为一。我回答了一个关于 HANDLE 是否唯一的问题,但另一个问题的答案取决于你需要一个唯一 ID 来做什么。
  • 使用钩子欺骗另一个进程(也包括其他东西)的 CreateFileW ReadFile。
  • @SteveValliere 另一个问题是关于 HWND 是另一回事
  • 对不起,在这里太久了。当我开始为 Windows 编程时,HWND 是一种特殊类型的句柄。现在有一些句柄的 HANDLE 类型和用于 HWND 和其他一些东西的 DECLARE_HANDLE 类型。显然,句柄不再是句柄了。

标签: winapi


【解决方案1】:

要理解的重要一点是句柄不是对象。句柄是指向每个进程对象表的指针(或索引)。为了回答您的问题,HANDLES 并不是全球唯一的,但它们的范围仅限于在特定流程中才有意义。

要让其他进程可以访问任何内核对象,您必须DuplicateHandle

另一种跨进程共享对象的方法是调用 CreateProcess 并将 bInheritHandles 设置为 true

【讨论】:

  • inherithandles 需要一个进程来创建另一个进程.. 不行;P
【解决方案2】:

它们不是唯一的。 HANDLE 值是当前进程的本地值。相同的值可能是无效句柄或引用另一个进程中的不同对象。此规则的一个例外是从父进程继承的句柄。

在没有集中式注册表的情况下拥有唯一 ID 的唯一方法是使用 GUID。但它们与 HANDLE 不兼容,它们是 128 位的,而句柄是 32 位或 64 位的。

【讨论】:

    【解决方案3】:

    使用DuplicateHandle 在进程之间传递句柄。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多