rundll32.exe的实际用途是什么?

What is the actual use of rundll32.exe?

我正在搜索为什么 rundll32.exe 进程在我的系统上 运行ning,当我发现它充当 运行 dll 作为应用程序/exe 的容器的信息时。我无法理解我希望 dll 作为应用程序 运行 的原因/用例。图书馆不只是为了提供功能支持,而不是 运行作为一个单独的应用程序吗?

rundll32 并不意味着一般 "run dlls"(它实际上没有任何意义,dll 没有单个入口点并且 "classic" dll 没有足够的 meta-information正确调用任何导出的符号)。

相反,它允许使用符合某些明确定义的规范的 dll 作为具有多个入口点的可执行文件;我认为这个想法要么是允许将多个具有大量共享代码的小型实用程序合并到一个二进制文件中,and/or 以提供额外的 "testing" 入口点(手动调用)到主要供其他人使用的库应用程序。

rundll 所做的实际上是在内存中加载 dll 并调用指定的函数,期望它必须具有与 exe 入口点相同的签名。

可获得更多信息 in the relevant KB article

这个EXE可以加载任何DLL并获取指定函数的地址,并调用它。这避免了只需要编写一个 EXE 来调用特定 DLL 上的函数(前提是可以在加载 DLL 后直接调用该函数)。

加载一个DLL意味着从EXE中调用LoadLibrary,它试图在当前进程([=3​​0=])中初始化DLL。在内存中加载 DLL 意味着调用给定 DLL 的 DllMain,这是由加载程序 (OS) 完成的。如果全部成功,该进程将获得已加载 DLL 的句柄。

成功获取DLL句柄后,再通过GetProceAddress获取函数地址,通过函数地址调用函数

例如(在命令提示符下):

    rundll32.exe user32.dll,LockWorkStation

将加载 user32.dll,然后调用 LockWorkStation,这将最终锁定工作站。

我不确定 RunDLL32 如何找到原型、所需参数、return 类型和调用约定。