Windows Rundll 和 Rundll32 接口

Windows文件传输及执行—Rundll32 Windows平台使用rundll32下载文件并执行。 阅读详情
概要
Microsoft Windows 95、Windows 98 和 Windows Millennium Edition (Me) 包含两个命令行实用程序,分别名为 Rundll.exe 和 Rundll32.exe,使用它们可以调用从 16 位或 32 位 DLL 导出的函数。但是,使用 Rundll 和 Rundll32 程序并不能调用从任何 DLL 导出的任何函数。例如,您不能使用这两个实用程序调用从系统 DLL 导出的 Win32 API(应用程序编程接口)调用。这两个程序只允许您调用从 DLL 导出的、明确编写为供这两个程序调用的函数。本文详细介绍了 Rundll 和 Rundll32 程序在上面列出的 Windows 操作系统中的用法。

MIcrosoft Windows NT 4.0、Windows 2000 和 Windows XP 在发行时只附带 Rundll32。这些平台都不提供对 Rundll(Win16 实用程序)的支持。

Rundll 和 Rundll32 实用程序最初设计为仅供 Microsoft 内部使用。但是它们提供的功能非常通用,因此现在可供在一般情况下使用。请注意,Windows NT 4.0 发行时只随附 Rundll32 实用程序,并且只支持 Rundll32。
更多信息
Rundll 与 Rundll32 之比较
Rundll 加载和运行 16 位 DLL,而 Rundll32 加载和运行 32 位 DLL。如果您向 Rundll 或 Rundll32 传递了错误的 DLL 类型,它可能无法运行,并且不显示任何错误消息。
Rundll 命令行
Rundll 的命令行如下所示:    RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>
                
示例如下:    RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:/WINDOWS/INF/SHELL.INF
                
在上面的命令行中,有三个问题需要仔细考虑: 1. Rundll 或 Rundll32 在标准位置搜索给定的 DLL 文件名(请参见有关 LoadLibrary() 函数的文档了解详细信息)。建议您提供 DLL 的完整路径以确保找到所需的 DLL。为获得最佳结果,请使用短文件名而不是长文件名,以确保不会出现非法字符。请特别注意,这意味着“C:/Program Files”文件夹中的 DLL 应转换为短名称。
2. <dllname> 不能包含任何空格、逗号和引号。这是 Rundll 命令行分析器的局限。
3. 在上面的命令行中,<dllname> 和 <entrypont> 函数名称之间的逗号 (,) 极为重要。如果缺少这个逗号分隔符,Rundll 或 Rundll32 将失败,而且不显示任何错误。此外,在 <dllname>、逗号和 <entrypoint> 函数之间不能有任何空白。

Rundll 的工作方式
Rundll 执行以下步骤: 1. 它分析命令行。
2. 它通过 LoadLibrary() 加载指定的 DLL。
3. 它通过 GetProcAddress() 获取 <entrypoint> 函数的地址。
4. 它调用 <entrypoint> 函数,传递作为 <optional arguments> 的命令行尾。
5. 当 <entrypoint> 函数返回时,Rundll.exe 将卸载 DLL 并退出。  

如何编写 DLL
在您的 DLL 中,使用以下原型编写 <entrypoint> 函数:

16 位 DLL:

  void FAR PASCAL __loadds
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
                
32 位 DLL:   void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
                
同样,对于 EntryPoint 函数也有三个问题需要考虑: 1. 很明显,“EntryPoint”名称应该替换为您的入口点函数的实际名称。请注意,Rundll32 的入口点与 32 位 DLL 中的 DllEntryPoint 函数完全无关,后者处理进程和线程连接/分离通知。
2. Rundll32 的入口点函数必须使用 _stdcall 调用约定定义(CALLBACK 默认情况下使用 _stdcall 属性)。如果缺少 _stdcall 属性,则函数默认使用 _cdecl 调用约定,然后 Rundll32 将在调用该函数后异常终止。
3. 由于您必须如上所述使用 _stdcall 调用约定声明该函数,因此如果 DLL 是用 C 语言编写的,Visual C++ 编译器会将该函数实际导出为 _EntryPoint@16;如果 DLL 是用 C++ 语言编写的,则 Visual C++ 编译器将进一步使用名称修饰。所以,请务必在 Rundll 或 Rundll32 的命令行中使用正确导出的名称。如果您想避免使用修饰名称,请使用 .def 文件,并按名称导出入口点函数。在使用 Visual C++ 编译器时,请参考产品文档和以下文章,以了解有关名称修饰的更多信息:  
引用


Exporting PASCAL-Like Symbols in 32-Bit DLLs





SUMMARY

There is no _pascal keyword in the 32-bit editions of Visual C++. Instead the Windef.h header file has PASCAL defined as __stdcall. This creates the correct style calling convention for the function (the called function cleans up the stack) but decorates the function name differently. So, when __declspec(dllexport) is used (in a .dll file, for example), the decorated name is exported instead of the desired PASCAL style name, which is undecorated and all uppercase.

MORE INFORMATION

PASCAL name decoration is simply the undecorated symbol name in uppercase letters. __stdcall name decoration prefixes the symbol name with an underscore (_) and appends the symbol with an at sign (@) character followed by the number of bytes in the argument list (the required stack space). So, the function when declared as:    int  __stdcall func (int a, double b)

                

is decorated as:    _func@12

                

The C calling convention (__cdecl) decorates the name as _func. Whereas the desired PASCAL style name is FUNC.



To get the decorated name set the Generate Mapfile option in the Linker General category setting.



Use of __declspec(dllexport) does the following: &#8226; If the function is exported with C calling convention (_cdecl), it strips the leading underscore (_) when the name is exported.  

&#8226; If the function being exported does not use the C calling convention (for example, __stdcall ), it exports the decorated name.  

So to simulate PASCAL name decoration and calling conventions, you must have the "Called Function stack clean-up" provided by using __stdcall and the undecorated uppercase name.



Because there is no way to override who does the stack clean up, you must use __stdcall. To undecorate names with __stdcall, you must specify them by using aliases in the EXPORTS section of the .def file. This is shown below for the following function declaration:    int  __stdcall MyFunc (int a, double b);

   void __stdcall InitCode (void);

                

In the .def file:    EXPORTS

      MYFUNC=_MyFunc@12

      INITCODE=_InitCode@0

                

For .dll files to be called by programs written in the 32-bit versions of Visual Basic (versions 4.0 and above), the alias technique shown in this article is needed in the .def file. If alias is done in the Visual Basic program, use of aliasing in the .def file is not necessary. It can be done on the Visual Basic program by adding an Alias clause to the Declare statement as shown here: Declare Function MyFunc Lib "dlllibname" Alias "_MyFunc@12"  (...)

   As Integer

                

The complete syntax for the Visual Basic Declare statement follows:    [Public | Private ] Declare Function name Lib

   "libname" [Alias "aliasname" ] [([arglist])][As type]

                

References

For more information, query the MSDN compact disc using these keywords:

VB alias DLL



Rundll 入口点的参数如下所示: hwnd -  窗口句柄,它应该用作您的 DLL 创建的任何窗口的
所有者窗口
hinst - 您的 DLL 的实例句柄
lpszCmdLine - 您的 DLL 应该分析的 ASCIIZ 命令行
nCmdShow - 描述您的 DLL 的窗口应如何显示
                
在下面的示例中:      RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:/WINDOWS/INF/SHELL.INF
                
Rundll 将调用 Setupx.dll 中的 InstallHinfSection() 入口点函数,并向其传递以下参数: hwnd =(父窗口句柄)
hinst = HINSTANCE of SETUPX.DLL
lpszCmdLine = "132 C:/WINDOWS/INF/SHELL.INF"
nCmdShow =(传递给 CreateProcess 的任何 nCmdShow)
                
请注意,<entrypoint> 函数(在上例中为 InstallHinfSection())必须分析它自己的命令行(上面的 lpszCmdLine 参数),并在必要时使用个别参数。Rundll.exe 最多只分析到传递给它的命令行的可选参数。其余的分析工作则由 <entrypoint> 函数完成。
有关 Windows 95 和 Windows NT 之间的区别的特别提示
在 Windows NT、Windows 2000 和 Windows XP 中,Rundll32.exe 的行为稍有不同,以便适应 UNICODE 命令行。

Windows NT 首先尝试对 <EntryPoint>W 调用 GetProcAddress 以获取其地址。如果找到该入口点,则假定原型为:    void CALLBACK
   EntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine,
               int nCmdShow);
                
这与 ANSI EntryPoint 相同,只是 lpszCmdLine 参数现在是一个 UNICODE 字符串。

如果找不到 <EntryPoint>W 入口点,则 Windows NT 将对 <entrypoint>A 和 <entrypoint> 调用 GetProcAddress 以获取其地址。如果这两个地址都找不到,则将入口点视为 ANSI 入口点,并像在 Windows 95/98/Me 中那样进行处理。因此,如果您希望您的 DLL 在带 ANSI 支持的 Windows 95 中以及带 UNICODE 支持的 Windows NT/2000/XP 中运行,您应该导出以下两个函数:EntryPointW 和 EntryPoint。在 Windows NT/2000/Me 中,通过 UNICODE 命令行调用 EntryPointW 函数;在 Windows 95/98/Me 中,则通过 ANSI 命令行调用 EntryPoint 函数。
Windows rundll32接口规范 立即下载

相关推荐

手把手教你用Xilinx Ultrascale+ FPGA解串12-bit ADC的LVDS信号(附Verilog代码)

本文详细介绍了如何使用Xilinx Ultrascale+ FPGA解串12-bit ADC的LVDS信号,涵盖硬件设计、时钟域处理和数据对齐等关键技术。通过Verilog代码实例和调试技巧,帮助工程师解决高速数据采集中的核心挑战,提升系统稳定性和性能。

weixin_42522964的博客 373

Rundll/Rundll32

CPL文件 windows控制面板扩展项,如 intecpl.cpl IE设置 sysdm.cpl 电脑右键属性 appwiz.cpl 控制面板->程序->程序和功能 intecpl.cpl包含的函数有 ClearMyTracksByProcessW ShowDeleteBrowsingHistoryDialog OpenFontsDialog

Chambord Gao的专栏 985

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 373

一个dll_run的函数

#include #include #include #include #include #include "log_def.h"int dll_run(char *dll,char *func,const char *pFormat, ...){ void *FunctionLib; /* Handle to shared lib file */ int (*Function)(); /

桃李不言,下自成蹊 1026

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

Allegro17.2 出gerber文件详细流程 - 干货

Allegro17.2 出gerber文件详细流程 - 干货

u010614434的博客 1万+

解决后台有大量rundll.32进程导致大量占用CPU资源至主机崩溃

最近待机后第二天开机的时候电脑总是崩溃,打开任务管理器电脑就直接死机,必须强制重启。本来没当回事,结果今天玩了一会游戏,电脑变得其卡无比,打开任务管理器发现后台有一千多个进程,cpu占用量出奇的高,着实吓的不轻,以为电脑中病毒了。大致锁定是因为这个的原因。或者是因为前两天换上了别人的3070开机后跑了几轮furmark?跟nvidia有关系,于是就打开nvidia的geforce experience发现打不开,报geforce experience。经过排查,这些多余的进程全都是。重启电脑后发现正常了。

weixin_44364945的博客 3万+

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 301

【系统工具】Rundll32:Windows系统中的神奇工具,你知道吗?

Rundll32是Windows操作系统中非常有用的一个工具,它可以用来加载DLL文件中的函数,还可以用来修复Windows系统中的一些问题。Windows操作系统是全球最流行的操作系统之一,但是在使用过程中,用户可能会遇到各种各样的问题,例如程序无法正常启动、系统崩溃等等。其中,[dll文件名]是需要加载的DLL文件的文件名,[函数名]是需要调用的函数的名称, [Arguments]是参数,一个字符串。然后执行命令,会增加一个名字为inetsvr的服务。需要注意的是,不同系统中命令的运行结果是不一样的。

kinghzking的专栏 6413

C# 工业视觉性能极致优化:多线程推理池 + 对象复用 + 批量检测,速度提升 10 倍实战

set;} // 输入图像set;} // 异步返回结果set;} // 用于监控延迟性能优化不是魔法,而是对资源生命周期的精细管理和对硬件特性的充分利用。多线程池解决了 CPU/GPU 闲置问题。对象池解决了 GC 停顿问题。零拷贝解决了总线带宽瓶颈。严格的 Dispose解决了内存泄漏问题。这套架构已在多个高速锂电、3C 电子检测产线落地,轻松应对 200ms 甚至 50ms 的严苛节拍。记住,在工业领域,稳定性与速度同等重要。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 300

RK3588 hdmirx 调试(含v4l2工具,edid编辑)

RK3588 Buildroot系统中调试HDMI-RX的过程,包括抓图、修改EDID数据、编辑EDID等操作。首先,通过logcat和寄存器信息查询HDMI-RX的状态,使用v4l2-ctl工具进行测试和修改EDID。

501846585_QQAndroid_java 2684

Rundll32(Rundll)的使用详解

前面发布了“在VC中调用“打开方式...”(open with...)对话框”这篇随笔,今天把它更多的使用方法列出来,以便大家参考: Rundll者,顾名思义,执行Dll也,它的功能就是以命令行的方式呼叫Windows的动态链结库,Rundll32.exe与Rundll.exe的区别就在于前者是呼叫32位的链结库,而后者是运用于16位的链结库,它们的命令格式是∶RUND...

weixin_30379973的博客 583

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5943

INFO:Windows Rundll 和 Rundll32 接口

本文来自MSDN,原文地址:http://support.microsoft.com/kb/164787/zh-cnMicrosoft Windows 95、Windows 98 和 Windows Millennium Edition (Me) 包含两个名为 Rundll.exe 和 Rundll32.exe 的命令行实用程序,通过这两个程序可调用从 16 位或 32 位 DLL 导出的函数。但

似水无痕 434

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

windows bat打印机打印测试页

@echo off rundll32 printui.dll,PrintUIEntry /k /n\\%computername%\XP-80C pause XP-80C为打印机的名字

完颜振江 1279

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MSDN文章收藏

INFO: Windows Rundll and Rundll32 Interfacehttp://support.microsoft.com/default.aspx?scid=kb;en-us;164787SDK Windows Controlshttp://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/wincontro

RookIE端口 1147

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Active Directory Search Shortcut

rundll32.exe dsquery.dll,OpenQueryWindow

qq_13633927的博客 457

windows 驱动实例分析系列: libusb驱动分析-应用层源码篇(三)

本篇聚焦于 libusb-win32 的**系统集成**与**部署机制**。用户态库不仅提供 USB 传输 API,还包含一套完整的工具链,用于安装/卸载内核驱动、管理设备/类过滤驱动,以及操作 Windows 注册表。此外,还提供了运行时动态加载机制(`libusb_dyn.c`),便于应用程序延迟绑定。

王马的博客 1063

[转]Windows Shell 编程 第十一章 【来源:http://blog.youkuaiyun.com/wangqiulin123456/article/details/7987992】...

第十一章探索Shell 我们现在将注意力从API转向Windows Shell本身。从这一章往后,我们的目标主要集中在清晰和全面的揭示探测器的工作原理和Shell命名空间的构成对象上,最后给出客户化探测器和扩展其特征和行为的示例程序。 Windows Shell,也称之为探测器,是一群特殊模块的集合,这些模块一起形成了Shell的命名空间,并且给出了执行...

weixin_30763397的博客 139

RUNDLL32简述

一、操作系统  Windows 95/98/ME提供rundll.exe和rundll32.exe,前者用来处理16位的DLL,后者用来处理32位的DLL,而NT/2000/XP/2003则只提供rundll32.exe。除此之外,两个程序的行为没什么不同。二、命令行格式  RUNDLL32.EXE ,   例如:RUNDLL32.EXE MyDll.DLL,TheFunction Hello

于无声处 2071

Rundll32

Rundll32这个运行DLL的实用工具(Rundll32.exe)是包含在Windows中的,它能让你去调用从一个32位DLL中导出的函数。但是那些被调用的函数必须遵循以下语法规则:void CALLBACK EntryPoint(  HWND hwnd,        // 父窗口的句柄  HINSTANCE hinst,  // DLL的实例句柄  LPTSTR lpCmdLine, /

冷却 3656

【Windows】 rundll32.exe 在 Windows10 上的应用

rundll32.exe概述 rundll32.exe用于在内存中运行DLL文件,它们会在应用程序中被使用。这个程序对你系统的正常运行是非常重要的。注意:rundl132.exe和rundll32.exe相似。但是rundl132.exe是W32.Miroot.Worm病毒。该病毒允许攻击者访问你的计算机,窃取密码和个人数据。对该文件的建议是立即删除。 顾名思义,"执行32位的DLL文件"。它...

少莫千华 2827

Rundll 和Rundll32的区别

用Windows9x的朋友一定对Rundll32.exe和Rundll.exe这两个文件不会陌生吧,不过,由于这两个程序的功能原先只限于在微软内部使用,因而真正知道如何使用它们的朋友想必不多。那么好,如果你还不清楚的话,那么就让我来告诉你吧。  首先,请你做个小实验(请事先保存好你正在运行的程序的结果,否则...):点击“开始-程序-Ms-Dos方式”,进入Dos窗口,然后键入"rundll32.

lsajeff的专栏 573
上一篇: Windows注册表的弊端
下一篇: Microsoft Windows 2000 应用程序兼容性
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值