[神奇的问题啊,GetProcAddress一个不存在的API时,返回非空值,且指向另一个API]谜团解开,错不在GetProcAddress

GetProcAddress()方法返回NULL值的问题 使用动态加载的方式使用动态库。 阅读详情
    if (::GetProcAddress(::GetModuleHandleA("kernel32"),"GetSystemWow64DirectoryA")==
        ::GetProcAddress(::GetModuleHandleA("kernel32"),"SetHandleContext"))
    {
        AfxMessageBox("OU OU 中奖咯");
    }

//以上代码是认为XP下没有导出GetSystemWow64DirectoryA (下面说明为什么会错误的认为没导出) 所以使用GetProcAddress

//在XP下,这个确实能中奖,在郁闷了好一阵子后,咱们的风大侠解开了谜团,如下图

弄了半天,32位XP中的kernel32是导出了该函数的,但是,这个函数并没有实现代码,因为在32位XP下,是不存在SysWow64目录的,只是没想到将该导出指向了另一个函数,也就是SetHandleContext,这个函数与GetSystemWow64DirectoryA的参数个数相同,当我们在32位XP下调用GetSystemWow64DirectoryA时,实质上调用的是SetHandleContext,因为参数错误,则返回了0,所以使用起来是没有错误的,在32位XP下调用GetSystemWow64DirectoryA确实是失败的CtTencen

我是在OD中查看kernel32中的导出函数确定没导出-_-! 而因为偏移相同,OD只显示了SetHandleContext,而没有显示GetSystemWow64DirectoryA,所以错误的认为没有导出,

再一查看GetSystemWow64DirectoryA的声明,

#if _WIN32_WINNT >= 0x0501 || defined(WINBASE_DECLARE_GET_SYSTEM_WOW64_DIRECTORY)

WINBASEAPI
UINT
WINAPI
GetSystemWow64DirectoryA(
    __out_ecount_part_opt(uSize, return + 1) LPSTR lpBuffer,
    __in UINT uSize
    );

而XP刚好是>=0x501

查MSDN官网也证实了TBREG XP下有导出该函数B9TEST

谜团解开了,怪自己不看MSDN,而用OD去查导出 -_-! 多亏了咱风大侠指点迷津

MS的程序员也太懒了...睡觉WANGWANGTEST

--------------------------------------------------

在以XP为最低平台的情况下,则可以用以下代码

//取得System32(SysWow64)文件夹路径
LPCSTR WINAPI SYSGetSystem32Directory()
{
	static CHAR s_szSystem32[MAX_PATH+1]={0};
	if (s_szSystem32[0]==0)
	{
		if(GetSystemWow64DirectoryA(s_szSystem32,sizeof(s_szSystem32))==NULL)
		{
			::GetSystemDirectoryA(s_szSystem32,sizeof(s_szSystem32));
		}
	}
	return s_szSystem32;
}

哎,多简单啊,整的那般复杂...

易语言取System32目录 易语言取System32目录源码,取System32目录,GetSystemDirectoryA 立即下载

相关推荐

tcllib2.0 package - csv

tcl lib 的csv库

shin 859

解决办法一:GetProcAddress函数返回值总为NULL

  一直为NULL吾亦莫名其妙。网上说加入extern "C"的办法并没有解决。具体的解决办法是: 增加def EXPORTS getDefaultPrinter @1 调用 #define FUNCTION_INDEX 1 #define FUNCTION_NAME(i) (LPCSTR)MAKEINTRESOURCE(i) TestFunction function = (TestFunction)GetProcAddress(hDLL, FUNCTION_NAME(FUNCTION_IN

柳鲲鹏 1732

【matlab】使用alexnet进行特征提取

1.下载alexnet工具箱 在命令栏输入alexnet,若不报错说明已经安装,若出现错误按照提示去下载工具箱; 下载地址:https://ww2.mathworks.cn/matlabcentral/fileexchange/59133-deep-learning-toolbox-model-for-alexnet-network (1)需要先注册(十分简单),登陆,下载; (2)下载完成之后,...

jingjingliang1995的博客 5844

[神奇的问题啊,GetProcAddress一个不存在的API时,返回非空值,且指向另一个API]谜团解开,错不在GetProcAddress...

if (::GetProcAddress(::GetModuleHandleA("kernel32"),"GetSystemWow64DirectoryA")== ::GetProcAddress(::GetModuleHandleA("kernel32"),"SetHandleContext")) { AfxMessageBox("OU O...

weixin_30736301的博客 232

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

OSMDroid(1)——OSM简介,基础例子搭建

1.OSMDroid简介 Osmdroid是一款完全开源的地图基本操作SDK,相比于现在普遍使用的百度地图,高德地图,谷歌地图等最大的好处就是开源。 最近在做一个军方项目,要求完全不能联网,从开发到应用整个阶段都是在局域网进行,相比之下采用了OSMDroid这个SDK作为解决方案。 先来看OSMDroid,便是(OpenStreetMapForAndroid),后面都简称OSM...

robotskly的博客 6178

【DLL】【一文搞懂】(四)GetProcAddress函数

一文搞懂动态库导入,GetProcAddress使用(动态库的显式链接)

此地无银 1万+

从摄像头选型到PCB布线:搞懂MIPI CSI带宽计算,避免你的嵌入式项目翻车

本文详细解析了MIPI CSI带宽计算在嵌入式项目中的关键作用,从摄像头选型到PCB布线提供全流程指导。通过实际案例和计算公式,帮助工程师准确计算带宽需求,避免图像丢帧和系统崩溃问题,同时优化PCB设计确保信号完整性。

weixin_30533109的博客 375

坑人的Windows_API GetProcAddress()

今天下午 废了一个下午的时间 这里记录一下 防止以后在被坑 今天下午 在用 LoadLibrary()和GetProcAddress()这两个函数来进行动态库加载时 LoadLibrary()函数是可以成功加载dll 但是在断点调试时 GetProcAddress()函数的返回值 总是NULL这让我困惑 然后我就各种找原因 主要是看dll文件和lib文件的位置是否有...

qq_41132488的博客 682

从零开始:在Windows WSL中搭建Openfoam7+blastfoam2.0.0开发环境(避坑大全)

本文详细指导在Windows WSL中搭建OpenFOAM 7与BlastFOAM 2.0.0开发环境,重点解析了安装过程中的常见“坑点”,如编译模式不匹配导致的符号错误,并提供了从系统准备、软件部署到环境验证的完整解决方案,帮助开发者高效构建CFD与爆炸模拟开发平台。

stem5的博客 526

ELK - CentOS7 安装 elasticsearch 7.17.5

elk elasticsearch 安装

qq_19783793的博客 1461

C++ 动态加载 DLL 时,GetProcAddress() 返回 NULL,GetLastError() 获取错误代码为 127

1、问题现象:   采用“运行期间动态链接”自己的 dll 文件,LoadLibrary() 成功获取 dll 模块句柄,但是 GetProcAddress() 返回 NULL。 2、问题分析:   调用 GetLastError() 获取错误代码为 127,意思是“找不到指定程序”;   用 Depends 工具(下载地址:http://www.dependencywal...

weixin_30915275的博客 2316

28-手把手教你手写CPU-Verilog - 乘法器设计:Booth算法与Wallace树乘法器

文章摘要: 本文详细介绍了两种高效乘法器设计方法:Booth算法和Wallace树乘法器。Booth算法通过检测乘数连续1/0减少部分积,适合有符号数运算;Wallace树采用树形结构压缩部分积,显著降低延迟。文章包含算法原理、具体示例、Verilog实现代码(4位乘法器)及性能对比表,指出Booth适用于通用处理器,Wallace树更适合高性能DSP/GPU。最后强调实际设计中需根据速度、面积和功耗需求选择合适方案。

2301_79143213的博客 206

加载DLL时,::GetProcAddress返回NULL,::GetLastError()返回127问题详解

GetProcAddress()是通过函数名寻址,造成这样的最可能是由于GetProcAddress中的函数名与DLL编译导出生成的函数名不一致 推荐Dependecy Walker工具,通过改工具打开生成的dll文件,就可以知道导出名长啥样,是不是跟预想中的一样 接下来进入解决方案正题 dll导出有两种方式(成功导出时会生成lib文件): 1、通过.def文件导出 首先顺便提一下.d...

Lss633Sammar的博客 1373

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

为何GetProcAddress()返回为空?

编写了一个DLL文件,其中有函数__declspec(dllexport) void Function();然后在程序中如下调用该函数:typedef void (*MYFUNCTION)(void); HINSTANCE hInstance; MYFUNCTION func; hInstance = ::LoadLibrary("dllname.dll"); func = (MYFUNCTION)GetProcAddress(hInstance, "FunctionName"); //获取函数的

fysun的专栏 3517

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

GetProcAddress 出错,返回NULL(127)

GetProcAddress 出错,返回NULL(getlasterror返回:127—找不到指定的程序).dll中加入 extern “C” 即可。

混沌的博客 8819

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

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

GetProcAddress返回NULL

在编译DLL之后,原有的函数名会被进行名字处理而改变名称。  在dll中,导出函数之前加上   extern   "C "   ,   比如:  extern   "C "   __declspec(dllexport)   void   fnDll1(int   tmp);

猩猩之火 3559

关于 VS 2019 GetProcAddress 127 错误

https://github.com/hfl15/windows_kernel_development 首先感谢 https://www.cnblogs.com/fanling999/p/4592740.html 写的HOOK文章,很详细 原因是这样的 在练习写 HOOK 源码: 发现别人的项目,在VS2019下生成可以调用 而我照抄别人的源码一字不漏,也不能调用。 依然Getlasterror 127,代码敲一小时,就为这调用弄了两小时。 感叹 C++ 水真深,所以写下来记录下。 百度了很多文章,千篇一律

m0_46135508的博客 985

GetProcAddress()失败 GetLastError 127

GetProcAddress()失败 GetLastError 127

hfdgjhv的博客 3120

为什么GetProcAddress返回值总为0?[解决方案]

相信很多人在显式调用dll中函数的时候,会遇到相同的问题: 就是我们loadlibrary成功后,明明调用的函数也是正确的,但是GetProcAddress的地址总是为0!不能获得正确的函数地址。 出错示例 我们先来看我这次出错的示例: DLL部分 __declspec(dllexport) BOOL xxxxxxx(); xxxxxx() { xxxxxxx; } exe调用dll部分 HMODULE hInst; hInst = LoadLibrary(L"Dll1.dll"); if (NU

weixin_43742894的博客 4809

动态获取API函数地址---对抗win7 aslr安全机制

本人近期在研究缓冲区溢出,在学习中发现,win7下系统关键函数的地址随机化了(每次重启后地址有变),为了解决地址定位问题,在偌大的互联网上找了好久,贴来分享下,以作备用。 -----------------------------------------------------------------------------------------------------------------

gudujianjsk的专栏 1901

获取GetProcAddress函数地址

我们都知道,GetProcAddress函数就是从系统文件kernel32.dll中导出的,而kernel32.dll是系统的基础链接库,每一个程序都会加载kernel32.dll的,我们只要得到kernel32.dll的基址就可以找到GetProcAddress函数的地址了。而获取kernel32.dll的加载基址的方法有3种,第一种就是通过特征匹配的暴力搜索,第二种就是利用系统的SEH机制找到...

做一个快乐学习者 5606

自实现getprocaddress(名称查找或者序号查找)

那么这里来总结下,总共四步骤1.导出表2.导出函数名称表3.导出函数名称序号表4.导出函数地址表/*WINBASEAPI //导出不需要使用,那么我们注释掉*/FARPROCWINAPI//NT头//导出表项,获得RVA RVA并不是真正的导出表项需要转VA,转VA需要加上image_base(也就是加载地址)//导出表//这个才是真正的VA,真正的导出表项,因为RVA在内存中是没有的*///导出函数名称表//导出函数名称序号表//导出函数地址表。

bring_coco的博客 1366
上一篇: VB Dir 造成 run-time error 52 bad bad file name or number
下一篇: VC,MFC,C++内存映射类,使用模板
silencenet
博客等级 码龄19年 36粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值