一個非常簡單的問題,如果我在app1.exe中創建一個HANDLE
並且它獲得值0x01
那麼這個值是全局唯一的嗎?winapi處理全球?
還是有可能當某個其他進程創建的HANDLE
也具有值0x01
。
如果它們不是唯一的,我可以使用其他結構來獲得與句柄兼容的唯一ID(例如,在其他地方創建該ID的HANDLE
將不可能或極不可能)。
一個非常簡單的問題,如果我在app1.exe中創建一個HANDLE
並且它獲得值0x01
那麼這個值是全局唯一的嗎?winapi處理全球?
還是有可能當某個其他進程創建的HANDLE
也具有值0x01
。
如果它們不是唯一的,我可以使用其他結構來獲得與句柄兼容的唯一ID(例如,在其他地方創建該ID的HANDLE
將不可能或極不可能)。
要理解的重要一點是手柄不是對象。句柄是指向每個進程對象表的指針(或索引)。要回答你的問題,HANDLES不是全球唯一的,但它們的範圍僅限於特定過程中的意義。
對於任何能夠從其他進程訪問的內核對象,您必須DuplicateHandle。
另一種方式跨越進程共享的對象是調用CreateProcess與bInheritHandles設置爲真正。
inherithandles需要一個進程來創建另一個..不能做; P – n00b 2012-03-22 20:58:04
使用DuplicateHandle在進程之間傳遞句柄。
它們不是唯一的。 HANDLE
值是當前進程的本地值。相同的值可能是無效句柄或在另一個進程中引用另一個對象。此規則的一個例外是從父進程繼承的句柄。
沒有中央註冊表的唯一身份證唯一方法是使用GUID
。但它們與HANDLE不兼容,它們是128位,而句柄是32位或64位。
http://www.windows-api.com/microsoft/Win32-Kernel/31543684/wrappinghooking-api-how-to-handle-closehandle.aspx相關閱讀;) – n00b 2012-03-22 20:22:19
你在一個問中提出了兩個問題。我回答了一個關於「HANDLE」是否獨一無二的問題,但答案取決於你需要一個獨特的ID。 – hamstergene 2012-03-22 21:00:20
用於使用鉤子欺騙另一個進程的CreateFileW ReadFile(還有其他事物)。 – n00b 2012-03-22 21:06:38