Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: sPhinX   发起时间: 2009-11-16 17:00 下午   回复: 3

Print Search
帖子排序:    
   2009-11-16, 17:00 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
是谁影响了GetProcAddress?
Reply Quote
最近碰到一个很奇怪的问题,细细描述如下:

由于历史原因,现在维护的一个程序是使用的BCB6,最近增加了一个判断Windows版本的功能,这个功能是用PJ Naughter的DtWinVer v1.79来实现的。

奇怪的问题出现在加入这个类之后,获取Windows版本号的时候,发现获取的版本号居然是7.3,汗,我的可是XP SP3,应该是5.1才对啊,本来以为是系统用太久了,很多东西被搞乱了,但是我又写了个小测试程序,在同一个系统获取版本号,居然又是对的。(注:出问题的程序在其他人的计算机和其他系统下都是正常的)

这两个程序看起来除了规模大小不一样,暂时也没看出什么问题来。没办法,还是一步一步跟吧,跟踪的结果发现出在这一行:
lpfnGetVersionEx lpGetVersionEx = (lpfnGetVersionEx) GetProcAddress(hKernel32, "GetVersionExA");

在前面获取dll地址的时候两边程序的地址都是一样的7C800000

HMODULE hKernel32 = GetModuleHandle(_T("KERNEL32.DLL"));

但是在获取函数地址的时候,小程序返回的是7C812B7E,但是出问题的程序返回的是00392FA3,这地址差别也太大了吧,然后用Sysinternals新出的工具VMMap查看两边进程的内存空间,发现00392FA3这个地址应该是属于vfcompat.dll,再看看这个dll的描述:“Application Verifier Provider - OS compatibility issues detection.”

看起来像是系统检查程序的兼容性,但是查看小程序的内存空间,里面就没有这个dll,难道系统只检查大程序的兼容性么?这下我没辙了,来请教一下诸位高人,给指点下迷津,如何解决这个问题,谢谢。

IP 地址: 已记录   报告
   2009-11-16, 17:26 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Re: 是谁影响了GetProcAddress?
Reply Quote
http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/8498b51d-7e0d-4764-b695-f69cbf8da46f

通过MSDN搜到了这篇贴子(实际上我在Google上也搜过,不过Google的小标题让我忽视了这篇贴子,唉),读完之后(事实上是还没读完我就去打开了Application Verifier),就像贴子里面描述的那样“then I remembered that a long time ago I started the program "Application verifier" from the "Microsoft Application Compatibility Toolkit"”,然后我去掉了对程序的兼容性检查,这下,世界清静了。

汗自己一个......:(

原来Application Verifier就有这个功能:

OS Versioning

We found that quite a few applications fail to install or run on Windows 7, simply because the version check does not account for future versions of Windows. Typically, there is a pre-requisite check in the installer, that calls GetVersionEx/GetVersion to find out if the current operating system is supported or not.

In many cases, the installer checks if dwMajorVersion is 5, which covers Windows 2000, Windows XP, and Windows Server 2003.

However, for Windows 7 (the version number is 6.1) the check will fail and the application won't install or execute.
IP 地址: 已记录   报告
   2009-12-10, 15:11 下午
neilhsu 离线,最后访问时间: 2009/12/23 17:02:23 手语

发帖数前10位
男
注册: 2008-06-06
发 贴: 73
Re: 是谁影响了GetProcAddress?
Reply Quote
兄弟很有娱乐精神啊,嗬嗬,鼓励
找到问题就好
鸿鹄安知燕雀之志
IP 地址: 已记录   报告
   2009-12-16, 16:00 下午
s5689412 离线,最后访问时间: 2015/10/10 9:37:32 sPhinX

发帖数前25位
注册: 2008-06-28
发 贴: 50
Broken Heart [U] Re: 是谁影响了GetProcAddress?
Reply Quote
开发就是这样的,各种各样的奇怪问题都可能碰到,这不算娱乐吧,要不可以问问论坛上的大家,谁没碰到过几个莫名其妙的问题。哈
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: 是谁影响了GetProcAddress?

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.