无法定位程序输入点_except_handler4_common于动态链接库msvcrt.dll
这是由于sp3加载的驱动造成的;只需要将C:\WINDOWS\system32\dwmapi.dll重新命名一下即可以解决。
可以调试程序
当系统加载到“c:\Program Files\China Mobile\Fetion\dwmapi.dll”时挂起,就是图中的"Warning: Break-in time out, suspending.",在Windows中的表现也就是弹出了上述的错误对话框,并且我们还没有点击“确定”按钮,于是程序暂时挂起。因此,我们可以判断,FeionFX.exe启动时加载的位于“c:\Program Files\China Mobile\Fetion\”目录下的dwmapi.dll在执行某个函数过程的时候遇到了错误。那么究竟是什么样的函数呢?根据错误对话框的信息,我们可以初步猜测是MSVCRT.dll中的_except_handler4_common。于是,我们需要查找一下当前进程中有关该过程的现状,所以执行"x msvcrt!_except_handler*"命令,返回的结果也在上图中的底部。在Windbg中,x是查找符号的命令,可以用来查找全局变量的地址或过程的地址。比如x kernel32!*显示Kernel32.dll中的所有可见变量,数据结构和过程。*号是通配符,代替任意的字符串,为了查找全部的,我们需要使用该通配符。(其实如果你执行“x msvcrt!_except_handler4_common”你会发现没有任何结果,也就是找不到,其实这也就是出现该错误的原因,我们后文分析。因此退一步不输入"4_common",查找所有_except_handler过程)
结果告诉我们,进程中msvcrt.dll存有的过程有_except_handler2以及_except_handler3,而恰恰没有_except_handler4。鉴于以上返回结果,我们可以初步断定,错误的起因是因为程序不能执行MSVCRT.DLL中的_except_handler4_common过程,而且原因是当前缺少这个。此时,我们需要借助Microsoft Dependency Walker进行辅助分析并且确认。
我们启动Microsoft Dependency Walker,打开该dwmapi.dll,可以发现,该DLL文件的运行将会首先调用MSVCRT.DLL,而且下图中也标示出来了,在当前调用的MSVCRT.DLL中,缺少一个函数"_except_handler4_common",这起好与我们看到的错误现象相以及Windbg分析的结果吻合。如下图所示:
此时,我们可以进一步断定,要么是DLL版本不对,要么就是dwmapi.dll有问题。而这个程序调用的是XP系统的%systemroot%\system32下面的MSVCRT.DLL,从相关软件官方得知,该程序就是针对XP/Vista开发的,且朋友中文版XP SP3中运行得很正常,于是我确认了一下本机该文件的版本,结果是“7.0.2600.5512 (xpsp.080413-2111)”,看来没有什么问题,是版本7.0.2600。于是我们得查一查另外一个文件了——dwmapi.dll,为什么它要载入MSVCRT.Dll并且调用其中并不存在的一个过程呢?
接下来,我们查看位于相关软件文件夹下的dwmapi.dll。察看版本信息,得到“6.0.6000.16386 (vista_rtm.061101-2205)”,问题就在这里!看到了吗?这个位于相关软件安装目录下的文件怎么会来自Vista正式发布版??怎么会用到XP的程序执行之中???要知道,这个文件之所以能够使用全部功能是因为在Vista环境之下,很多新的DLL文件中带有新的函数,正好可以被它调用。那么我们猜想,是不是Vista版本下的MSVCRT.DLL就存在一个新版本——即第4版的_exception_handler4呢?我们从Microsoft Windows Vista RTM中提取出位于%systemroot%\system32下面的MSVCRT.DLL,其版本为“7.0.6001.18000 (longhorn_rtm.080118-1840)”,然后再次使用Dependency Walker打开,发现其中果然存在该新的函数!即“_except_handler4_common”。如下图所示:
到这里,问题就已经清楚了。正是由于本机的相关软件客户端在启动时调用了用于Vista的DLL组件dwmapi.dll,而该DLL又要尝试调用一个Vista下msvcrt.dll才有的过程,才出现了该错误提示。因为我们发现,该错误提示并不影响之后程序的正常使用,而且我们所使用的环境是Windows XP而非Vista,所以推断该调用dwmapi.dll的过程是非必要的,于是将其重命名或是删除到回收站,再次启动相关软件客户端,错误提示消失了,迎来的是程序正常的使用……
之后我查阅了大量的KB资料以及Visual Studio的MSDN资料,发现_except_handler是VC++编译器自带的一个内部异常处理。而版本4的_except_handler4_common handler又仅存在于Vista以及之后的系统之中。而且值得注意的是,很多这样子的错误都是由于系统中存在有来自更高级版本系统的文件造成的,而文件的来源于一般有几种,一般是修改系统时自己放进去的或者别的安装程序带入的,也有情况是盗版改版的操作系统中存有的,再有就是本例中的情形——安装程序可同时用于Windows XP以及Windows Vista。可能是由于XP英文版与中文版的环境的不同,相关软件客户端的启动选择了加载调用为Vista准备的dwmapi.dll从而产生了此错误。
注:本例中并没有介绍使用Dependency Walker的“Profile(剖析)”功能,因为该相关软件客户端的启动不是靠单文件的,因此比较复杂,而且本例中因为该错误不能成功剖析整个启动过程。借助其他工具,可以得到,其实相关软件客户端的启动过程是先通过Fetion.exe加载FetionFX.exe然后再加载“VMDotNet\v2.0.50727”下的FetionVM.exe进行的,于是我们可以只对FetionVM.exe进行剖析,而且当前环境也只能这样了。
无法定位程序输入点_except_handler4_common于动态链接库msvcrt.dll的更多相关文章
- 关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题
费劲N多力气编译通过之后,最后启动程序过程中却突然得到“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题, 分析究其原因是定位不到zlib1.dll,都知道,程序在找dll的时 ...
- XP下 无法定位程序输入点WSAPoll于动态链接库ws2_32.dll 的解决办法
最近在给手机启用黑阈服务的时候出现了无法定位程序输入点WSAPoll于动态链接库ws2_32.dll这个错误,上网查了一下是因为SDK Platform Tools版本过高不能兼容windows xp ...
- 安装MySQL时候最后一步报无法定位程序输入点fesetround于动态链接库MSVCR120.dll
今天在装MySQL时到最后一步出现了一个问题[报无法定位程序输入点fesetround于动态链接库MSVCR120.dll]这是由什么原因引起的呢,其实是缺少一个vcredist_x64.exe插件 ...
- [工具/PC]计算机中丢失libiconv-2.dll,丢失libintl-8.dll,无法定位程序输入点libiconv于动态链接库libiconv-2.dll上问题解决方法
CodeBlocks 1. 背景,为了学习C语言,在win系统上下载了codeBlock,先简单介绍下:Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境. Code::B ...
- opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上
1.问题:opengl 无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll上 2.环境:vc6.0 win7,64位,opengl. 3.解决:将glut32.dl ...
- 无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上
winxp系统,在使用boost中的thread中的sleep的时候出现“无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上”的错误, 1.在引用boost库之前( ...
- VS2010 + winxp 无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上 错误
winxp系统,使用VS2010, 在使用boost中的thread中的sleep的时候出现 “无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上”的错误, 在网上 ...
- 解决无法定位程序输入点SymEnumSymbols于动态链接库dbghelp.dll
作者:朱金灿 来源:http://blog.csdn.net/clever101 下载一个源码,使用VS2008编译链接无问题,运行时出现一个错误:无法定位程序输入点SymEnumSymbols于动态 ...
- 安装postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题
安装postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题 解决办法: 1.安装系统更新补丁KB2533623,下 ...
随机推荐
- THUSC2019滚粗记
关于\(\mathrm{APIO}\)游记,它咕了... Day -1 \(\mathrm{\_tham}\)今天并没有准备给我们考试,所以机房充斥着过年的气息(雾 下午就要出发了,由于一些众所周知的 ...
- nyoj 113 字符串替换 (string中替换函数replace()和查找函数find())
字符串替换 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 编写一个程序实现将字符串中的所有"you"替换成"we" 输入 ...
- Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译
一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...
- Codeforces Round #403(div 2)
A =w= B 题意:一个数轴上有n个整点,每个点都有一个速度,选一个点让他们集合,使得时间最少. 分析: 直接三分 C 题意:给定一棵树,任意两个距离小等于二的点不能染相同的颜色,求最小颜色数和染色 ...
- shell apt install 按tab键自动补全
insert if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi to ~/.bashrc
- 常见的各品牌路由器默认IP地址汇总清单
常见的各品牌路由器默认IP地址汇总清单 下面是各常见品牌路由器的默认IP清单: 如果您使用的设备品牌不在上述列表中,也可以试着访问下RouterIPAddress.com或SetupRouter.co ...
- centos 如何安装软件
yum命令 (一)yum基本概念 1)yum是什么 yum = Yellow dog Updater, Modified 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它 ...
- windows bat命令 开启关闭Oracle服务
0.吐槽 单位发的ThinkPad T61.太弱小了. 问题是我去百度下T61,发现它好贵好贵.真心无力吐槽.还不如给我发台外星人,廉价点的. . Oracle一开就内存就不够了.所以绝对不能让它开机 ...
- 我的Go语言学习之旅七:创建一个GUI窗口
在上次中,刚刚学过了 弹窗效果.这里再接着学习一下怎样创建一个窗口. 还是老路子,先上代码: package main import ( "github.com/lxn/go-winapi ...
- CoffeeScript的缩进
CoffeeScript用缩进代替了花括符"{}",作用范围的划分只靠缩进.这带来代码精简.简洁的同时,有时候也让人困惑. 比如说: if 3 > 1 alert(" ...