如何实现rundll2-callable函数?

时间:2010-11-04 11:08:49

标签: winapi crash dllexport rundll32

我正在尝试编写一个也可以导出可以用rundll32调用的函数的exe。这是可能的,如果是这样,为什么它不能像这样工作?

我密切关注Microsoft's advice on this

#define RUNDLL32(func) extern "C" __declspec(dllexport) void CALLBACK func(HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow)

RUNDLL32(MyFunc)
{
  MessageBox(0, 0, 0, 0);
}

但是当用

调用时
rundll32 myprog.exe,_MyFunc@16

rundll32崩溃/ DEP开始。

1 个答案:

答案 0 :(得分:2)

Rundll32.exe使用LoadLibrary()加载可执行映像。这对于EXE来说不太可能有效,它不会期望加载到不是它的默认地址。保证会发生这种情况,rundll32.exe已经占用了那个默认地址。不确定是否可以修改链接器,以便它不会省略重定位记录。

但是不要理会这种方法,只需创建一个DLL而不是EXE。并将实际参数传递给MessageBox()。并且,是的,使用.def文件重命名导出的函数。