2012-03-22 50 views
6

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

还是有可能当某个其他进程创建的HANDLE也具有值0x01

如果它们不是唯一的,我可以使用其他结构来获得与句柄兼容的唯一ID(例如,在其他地方创建该ID的HANDLE将不可能或极不可能)。

+0

http://www.windows-api.com/microsoft/Win32-Kernel/31543684/wrappinghooking-api-how-to-handle-closehandle.aspx相关阅读;) – n00b 2012-03-22 20:22:19

+1

你在一个问中提出了两个问题。我回答了一个关于“HANDLE”是否独一无二的问题,但答案取决于你需要一个独特的ID。 – hamstergene 2012-03-22 21:00:20

+0

用于使用钩子欺骗另一个进程的CreateFileW ReadFile(还有其他事物)。 – n00b 2012-03-22 21:06:38

回答

5

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

对于任何能够从其他进程访问的内核对象,您必须DuplicateHandle

另一种方式跨越进程共享的对象是调用CreateProcessbInheritHandles设置为真正

+0

inherithandles需要一个进程来创建另一个..不能做; P – n00b 2012-03-22 20:58:04

2

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

没有中央注册表的唯一身份证唯一方法是使用GUID。但它们与HANDLE不兼容,它们是128位,而句柄是32位或64位。