[神奇的问题啊,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;
}

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

posted @ 2011-12-13 17:39  eATM  阅读(272)  评论(0编辑  收藏  举报