2011-11-21 23 views
7

RunDll32究竟如何調用一個函數,而不知道函數可以採用的參數個數/類型?RunDll32如何工作?

它有一個內置的編譯器或類似的東西嗎?

回答

11

RunDll32幾乎是一個很薄的包裝器,它調用LoadLibrary加載給定的DLL,調用GetProcAddress來獲取所需函數的函數地址,然後調用該函數。

它不能調用任何只導出函數的DLL,但是,它假定函數具有以下非常具體的函數簽名:

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

其中CALLBACK是擴展到宏__stdcall調用約定。有關更詳細的描述,請參閱this knowledge base article

如果您的DLL的函數沒有正確的簽名或調用約定,會發生很多不良情況。請參閱What can go wrong when you mismatch the calling convention?瞭解更多血淋淋的細節。幸運的是(或者不幸),RunDll32 is written in such a way to ameliorate those types of errors,但這並不意味着這是個好主意。 請勿使用RunDll32調用沒有正確簽名的函數。這只是一個計時炸彈,等待在下一個版本的Windows中啓動。

2

它不能調用任何函數,它只能調用函數specifically written to be called。因此,沒有魔法。

+0

User32.dll中的SwapMouseButton是一個函數的例子,其中涉及「magic」。這種神奇的解釋裏面的答案:http://stackoverflow.com/a/30285986/832220 –

+0

我剛剛發現PowrProf.dll裏面的SetSuspendState作爲這種魔術的另一個例子。只需嘗試以下命令來演示這種魔術:rundll32.exe PowrProf.dll,SetSuspendState –

+0

UserWork.dll中的LockWorkStation是Rundll32.exe可調用函數的另一個示例。命令行是:rundll32.exe User32.dll,LockWorkStation –