通过 DCOM 传递 NT 句柄

Posted

技术标签:

【中文标题】通过 DCOM 传递 NT 句柄【英文标题】:Passing NT handles through DCOM 【发布时间】:2010-08-05 03:27:03 【问题描述】:

是否可以通过 DCOM 调用传递原始 NT 句柄(例如,传递给事件对象) - 当然是在本地机器上。如果是这样,人们将如何去做?

【问题讨论】:

如果你不离开本地机器,为什么需要使用 DCOM? @Gabe:他可能想用它来强制组件进入一个单独的进程——例如,如果组件是 32 位,而使用者是 64 位。 【参考方案1】:

查看这个 SO 答案:DuplicateHandle(), use in first or second process? 和评论,因此我建议 DuplicateHandle 是您所需要的。

【讨论】:

但是服务器怎么知道客户端是什么进程呢? 到目前为止,我有 2 票反对通过带外传递信息。 实际上,至少有一个反对意见是因为您的解决方案实际上不起作用 - 它所做的只是将句柄值传递给客户端。当 COM 服务器为 64 位而客户端为 32 位时,它可能无法工作,因为存根不匹配(INT_PTR 在 64 位代码中为 64 位宽,在 32 位代码中为 32 位宽)。 好点。如果 64 位内核设置了一个不适合 32 位的 HANDLE 值,然后客户端变成了 32 位,会发生什么? msdn.microsoft.com/en-us/library/windows/desktop/… 句柄——因为 kernel32 和 user32 句柄在 32 位和 64 位进程中只有 32 位有效,所以它们可以在进程之间毫无问题地传输。但是,Windows 定义为句柄的某些项实际上只是包装的指针(例如,HTREEITEM)。如果这些“句柄”从 64 位进程传递到 32 位进程,它们将被截断。【参考方案2】:

IntPtr(我认为在 COM 中拼写为 INT_PTR)。

【讨论】:

如果我要传递给远程进程,只传递原始整数值将无济于事 - 句柄需要复制到另一侧。这就像将 BSTR 转换为 INT_PTR 并希望获得最好的结果 - 不会在 DCOM 中工作:) 你说它是一个句柄。尽管 HANDLE 的值适合 INT_PTR,但它并不是真正的指针值,就像它不是整数值一样。这不像复制 BSTR 的指针值或任何实际的指针值。 “NT HANDLE”是一种更具体的句柄 :) 是的,内核知道每个句柄的值。这不像转换指针值为虚拟地址的 BSTR。 MSDN 说 HANDLE_PTR。 MSDN 说 32 位进程可以与 64 位进程通信,但 32 位 HANDLE_PTR 是 32 位在线。 32 位进程如何访问 64 位 HANDLE_PTR?

以上是关于通过 DCOM 传递 NT 句柄的主要内容,如果未能解决你的问题,请参考以下文章

用于句柄的 Win API 包装类

Node.js 将响应对象句柄的句柄传递给子进程

php资源是通过引用传递的吗?

下次我使用相同的连接句柄调用 WinInet 调用 HttpSendRequest 时,它不会传递身份验证信息

Windbg调试(关于句柄表的获取,32位)

如何在 C 中打开数据库句柄并使用 SWIG 将其传递给 Perl?