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

    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;
}

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

转载于:https://www.cnblogs.com/SilenceRet/archive/2011/12/13/6805036.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值