2011-11-21 4 views

答えて

11

RunDll32は、LoadLibraryを呼び出して指定されたDLLをロードし、GetProcAddressを呼び出して目的の関数の関数アドレスを取得し、その関数を呼び出します。これは、DLL内のちょうど任意のエクスポートされた関数を呼び出すことはできません

、しかし、それは関数は、以下の非常に特定の機能シグネチャを有していることを前提としています

CALLBACKは、に展開マクロある
void CALLBACK 
    EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

__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」が関与する関数の1つの例です。この種の魔法についてはその回答の中で説明しています: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 –

関連する問題