2011-11-21 32 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 –