2010-11-12 12 views
6

मैं ग के माध्यम से < खिड़कियों पढ़ रहा हूँ/C++>, यह बताता है के रूप में नीचे GetModuleHandle() API:GetModuleHandle() कैसे काम करता है?

जब आप इस फ़ंक्शन को कॉल करें, तो आप एक शून्य समाप्त स्ट्रिंग है जो भरी हुई एक निष्पादन या DLL फ़ाइल का नाम निर्दिष्ट पारित कॉलिंग प्रक्रिया की पता स्थान में। यदि सिस्टम निर्दिष्ट निष्पादन योग्य या DLL नाम पाता है, तो GetModuleHandle आधार पता देता है जहां निष्पादन योग्य या DLL; फ़ाइल छवि लोड होती है।

मुझे आश्चर्य है सिस्टम फ़ाइल नाम कहां देखता है? जब मैंने अपनी प्रक्रिया एड्रेस स्पेस में कुछ फाइल लोड की, तो क्या कुछ लोड की गई फाइलों के नाम और उनके लोड पतों के मैपिंग को स्टोर करने के लिए कुछ केंद्रीकृत टेबल है? यदि हम एक स्ट्रिंग मैच के आधार पर खोज करते हैं, तो क्या यह कम दक्षता है?

आपके insigts के लिए बहुत धन्यवाद।

उत्तर

9

भारित मॉड्यूल जानकारी PEB_LDR_DATA नामक एक संरचना में प्रक्रिया पीईबी में एक लिंक्ड सूची के रूप में रखी जाती है। आप PEB सूचक मिलता है, तो आप इस सूची के माध्यम से पार और DLL नाम, आधार का पता, प्रवेश बिंदु, आकार आदि जैसे जानकारी प्राप्त कर सकते ये पृष्ठ देखें:
http://msdn.microsoft.com/en-us/library/aa813708.aspx
http://www.codeproject.com/KB/threads/CmdLine.aspx

4

यह लोडर (गतिशील लिंकर के लिए विंडोज नाम) की आंतरिक डेटा संरचना में दिखता है।

GetModuleHandle केवल डीएलएल के लिए काम करता है जिसे आपने वर्तमान प्रक्रिया में लोड किया है। जब भी लोडर प्रक्रिया में एक डीएलएल लोड करता है, तो यह निश्चित रूप से एक डेटा संरचना को बनाए रखता है जिसमें मॉड्यूल का नाम शामिल होता है। फाइल सिस्टम पर जाने की जरूरत नहीं है।

LdrInitializeThunk DLL में खींचने की प्रक्रिया शुरू करने के लिए उपयोगकर्ता स्थान में चलाता है।

+0

लिंकर? क्या आपका मतलब कर्नेल था? –

+0

नहीं, मेरा मतलब लिंकर है। लिंकर के लिए आरटीएल कोड आधुनिक विंडोज़ में उपयोगकर्ता स्थान में है। कर्नेल में होने के लिए बिल्कुल कोई ज़रूरत नहीं है। – bmargulies

+4

मैं आपके अन्य उत्कृष्ट उत्तर पर थोड़ा सा नाइट लेने जा रहा हूं। यह लोडर है, लिंकर नहीं। लोडर नक्शा बाइनरीज़ मेमोरी में क्या करता है और उन्हें ठीक करता है, लिंकर ऑब्जेक्ट मॉड्यूल से बाइनरी बनाता है। –

3

मैं पुष्टि करना चाहता था (देखें swatkat का उत्तर), कि मेरी जानकारी में GetModuleHandle() का कार्यान्वयन वास्तव में Wine और ReactOS (और this) के अंदर दिखता है। आप GetModuleHandle() के कार्यान्वयन को देखेंगे। वाइन और रीक्टोस के डेवलपर्स विंडोज के कोड को अलग करते हैं और अलग-अलग परिणामों के आधार पर अपना कोड लागू करते हैं। तो कोड ज्यादातर मामलों में विंडोज कोड के समान ही करता है।

यदि आप चाहते हैं कि आप के VirtualAllocEx() के आधार पर अपना कार्यान्वयन कार्यान्वित कर सकें। विवरण के लिए मेरे old answer देखें। (यदि आपको अभी तक पता नहीं है कि फ़ंक्शन GetModuleHandle() द्वारा दिए गए हैंडल को स्मृति में संबंधित मॉड्यूल का पता है, तो किसी को वर्तमान प्रक्रिया की स्मृति में किसी भी तरह से डीएलएल की आवश्यकता है)।

+0

आपकी पुष्टि के लिए धन्यवाद। – smwikipedia

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