2011-11-21 7 views
7

फ़ंक्शन द्वारा किए जा सकने वाले तर्कों के प्रकार/प्रकारों को जानने के बिना, RunDll32 वास्तव में फ़ंक्शन को कैसे कॉल करता है?RunDll32 कैसे काम करता है?

क्या इसमें अंतर्निर्मित संकलक या कुछ ऐसा है?

उत्तर

11

RunDll32 बहुत पतला रैपर है जो दिए गए डीएलएल को लोड करने के लिए LoadLibrary पर कॉल करता है, वांछित फ़ंक्शन का फ़ंक्शन पता प्राप्त करने के लिए GetProcAddress पर कॉल करता है, और फिर फ़ंक्शन को कॉल करता है।

यह DLL में बस किसी भी निर्यात किया फ़ंक्शन को कॉल नहीं कर सकता है, हालांकि यह मान लिया गया है समारोह निम्न में से एक बहुत ही विशेष समारोह हस्ताक्षर है:

void CALLBACK 
    EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

जहां CALLBACK उस मैक्रो के लिए विस्तारित है __stdcall कॉलिंग सम्मेलन। अधिक विस्तृत विवरण के लिए this knowledge base article देखें।

यदि आपके डीएलएल के कार्य में सही हस्ताक्षर या कॉलिंग सम्मेलन नहीं है, तो बहुत सी बुरी स्थिति आ जाएगी। बहुत सारी जानकारी के लिए What can go wrong when you mismatch the calling convention? देखें। सौभाग्य से (या शायद दुर्भाग्य से), RunDll32 is written in such a way to ameliorate those types of errors, लेकिन इसका मतलब यह नहीं है कि यह एक अच्छा विचार है। उन कार्यों को कॉल करने के लिए RunDll32 का उपयोग न करें जिनके पास सही हस्ताक्षर नहीं है। यह सिर्फ एक टिकिंग टाइम बम है जो विंडोज के अगले संस्करण में जाने का इंतजार कर रहा है।

2

यह किसी भी फ़ंक्शन को कॉल नहीं कर सकता है, यह केवल specifically written to be called फ़ंक्शन को कॉल कर सकता है। इसलिए, कोई जादू नहीं है।

+0

User32.dll के अंदर SwapMouseButton एक फ़ंक्शन के लिए एक उदाहरण है, जहां "जादू" शामिल है। इस तरह के जादू को उस उत्तर के अंदर समझाया गया है: http://stackoverflow.com/a/30285986/832220 –

+0

मुझे अभी पता चला है कि PowrProf.dll के अंदर SetSuspendState इस तरह के जादू का एक और उदाहरण है। इस तरह के जादू का प्रदर्शन करने के लिए बस निम्न आदेश आज़माएं: rundll32.exe PowrProf.dll, SetSuspendState –

+0

User32.dll के भीतर LockWorkStation rundll32.exe द्वारा कॉल करने योग्य कार्यों के लिए एक और उदाहरण है। कमांड लाइन है: rundll32.exe User32.dll, LockWorkStation –