[神奇的问题啊,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; }
哎,多简单啊,整的那般复杂...