2012-03-22 13 views
6

एक बहुत ही सरल सवाल है, अगर मैं app1.exe में HANDLE बनाता हूं और यह मूल्य 0x01 है जो वैश्विक स्तर पर अद्वितीय है?क्या winapi वैश्विक हैंडल हैं?

या यह संभव है कि जब कोई अन्य प्रक्रिया HANDLE बनाता है जिसमें मूल्य 0x01 भी है।

यदि वे अद्वितीय नहीं हैं तो मैं हैंडल के साथ एक अद्वितीय आईडी संगत करने के लिए अन्य निर्माण का उपयोग कैसे कर सकता हूं (जैसे कि यह असंभव या अत्यधिक संभावना नहीं है कि HANDLE उस आईडी के साथ कहीं और बनाया गया है)।

+0

http://www.windows-api.com/microsoft/Win32- कर्नेल/31543684/wrappinghooking-api-how-to-handle-closehandle.aspx संबंधित पढ़ने;) – n00b

+1

आपने एक में दो प्रश्न पूछे हैं। मैंने जवाब दिया कि क्या 'हैंडल' अद्वितीय है, लेकिन दूसरे का जवाब इस बात पर निर्भर करता है कि आपको किस लिए एक अद्वितीय आईडी चाहिए। – hamstergene

+0

हुक का उपयोग करके एक और प्रक्रिया (अन्य चीजों) के CreateFileW ReadFile को धोखा देने के लिए। – n00b

उत्तर

5

समझने की महत्वपूर्ण बात यह है कि हैंडल ऑब्जेक्ट्स नहीं हैं। हैंडल पॉइंटर्स (या इंडेक्स) प्रति-ऑब्जेक्ट ऑब्जेक्ट टेबल पर हैं। अपने प्रश्न का उत्तर देने के लिए, हैंडल वैश्विक रूप से अद्वितीय नहीं हैं, लेकिन वे केवल एक विशेष प्रक्रिया के भीतर समझने के लिए तैयार हैं।

किसी भी कर्नेल ऑब्जेक्ट के लिए अन्य प्रक्रिया से सुलभ होने में सक्षम होने के लिए, आपको DuplicateHandle होना चाहिए।

प्रक्रियाओं में वस्तुओं साझा करने के लिए एक और तरीका है CreateProcess साथ bInheritHandles सेट करने के लिए सच कॉल करने के लिए है।

+0

विरासत के लिए एक प्रक्रिया की आवश्यकता है .. कोई भी नहीं कर सकता; पी – n00b

2

प्रक्रियाओं के बीच हैंडल पास करने के लिए DuplicateHandle का उपयोग करें।

2

वे अद्वितीय नहीं हैं। HANDLE मान वर्तमान प्रक्रिया के लिए स्थानीय हैं। वही मान अमान्य हैंडल हो सकता है या किसी अन्य प्रक्रिया में किसी भिन्न ऑब्जेक्ट का संदर्भ ले सकता है। इस नियम के लिए अपवाद माता-पिता प्रक्रिया से विरासत में हैंडल हैं।

केंद्रीकृत रजिस्ट्री के बिना अद्वितीय आईडी रखने का एकमात्र तरीका GUID का उपयोग करना है। लेकिन वे हैंडल के साथ संगत नहीं हैं, वे 128-बिट हैं जबकि हैंडल 32 या 64-बिट हैं।

संबंधित मुद्दे