ShellExecuteEX打开iqy文件导致excel hang的原因分析

来源:http://www.mnuet.com 作者:广东十一选五走势图表 人气:168 发布时间:2019-10-11
摘要:1. 问题 当在console中调用APIShellExecuteEx张开"test.iqy"文件时,开掘excel会hang住,console退出后excel才会响应,但一向双击"test.iqy"是没不符合规律的,风趣的是那个状态唯有在xp产生,在win7上

1. 问题

当在console中调用API ShellExecuteEx张开"test.iqy"文件时,开掘excel会hang住,console退出后excel才会响应,但一向双击"test.iqy"是没不符合规律的,风趣的是那个状态唯有在xp产生,在win7上从未有过这些难点。

 

2. 复发步骤

复出碰着:XP sp3 / Office 2005(别的office版本应该也得以,未有测量试验)

1> 解压iqy_test.zip

2> 运行http_server.py(需先安装python)

3> 执行"shell_execute.exe test.iqy"

shell_execute.exe的主要code:

bool shell_execute_file(wstring file_path)
{
    SHELLEXECUTEINFOW shell_exec_info = { 0 };
    shell_exec_info.cbSize = sizeof(SHELLEXECUTEINFOW);
    shell_exec_info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
    shell_exec_info.hwnd = NULL;
    shell_exec_info.lpVerb = NULL;
    shell_exec_info.lpFile = file_path.c_str();
    shell_exec_info.lpParameters = NULL;
    shell_exec_info.lpDirectory = NULL;
    shell_exec_info.nShow = SW_SHOW;
    shell_exec_info.hInstApp = NULL;
    bool ret = ShellExecuteExW(&shell_exec_info);
    printf("process handle is %pn", shell_exec_info.hProcess);

    return ret;
}

 

3. 原因解析

3.1 excel hang在哪里?

3.1.1 用windbg附加到excel上,输入如下命令查看主线程hang住的地点

图片 1

能够看来Excel hang在NtUserMessageCall()中,经过查询知,SendMessage()内部正是调用NtUserMessageCall()来发送信息的。

查阅参数知excel调用NtUserMessageCall()类似如下:

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

表达excel给持有顶层窗口发送三个WM_DDE_INITIATE音讯,可是有窗口未有response

通过可以可疑是出于console进度在和excel用DDE新闻通讯时,console未有响应excel发送的DDE音讯,导致excel hang住

 

3.2 为了验证3.1.1的臆想,用API Monitor一下ShellExecuteEx

3.2.1 依据微软的文书档案可以知道,发送DDE音讯除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都以PostMessage

在API Monitor中寻找一下PostMessage的调用,果然搜到一条

图片 2

call stack突显的确是ShellExecuteEx所调用

图片 3

消息1000为WM_DDE_EXECUTE,Post窗口句柄为0x00310172。

瞩目到下贰个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70 ),刚好是获得那一个窗口的pid和tid,查看下参数窗口:

以此窗口所属的经过PID = 0xc54,正好是excel的历程,表达ShellExecuteEx确实发送了DDE音信给excel,并且可执发送的信息的thread正是主线程

图片 4

依靠DDE的音信参数,可以看到wParam就是出殡和埋葬新闻的窗口,其句柄为2425190 = 0x250166,反向查询知那是ShellExecuteEx创立的”WorkerW”窗口

图片 5

图片 6

 

3.2.2 为了验证3.2.1的定论,在PostMessageW上下断点追踪一下

图片 7

翻看一下buff的地方:

图片 8

恰好正是展开test.iqy的一声令下,表明ShellExecuteEx便是先创设了excel的长河,然后发送test.iqy的文件命令给excel展开。

 

3.3 总结

1> ShellExecuteEx展开test.iqy的时先创立excel进度

2> 然后成立四个"WorkerW"的窗口用于DDE通讯

3> Post WM_DDE_EXECUTE给excel,告知张开test.iqy的通令

4> ShellExecuteEx试行完成,但并不destroy "WorkerW"窗口

5> excel收到WM_DDE_EXECUTE信息后会广播WM_DDE_INITIATE音讯,"WorkerW"窗口所在的console进度由于并未有定义音讯处理函数,ShellExecuteEx定义的"WorkerW"窗口音信管理函数得不到CPU推行机缘,导致不会response该新闻,从而导致excel hang住

就如,大家得以创设二个带窗口的顺序,运营后将其挂起,这时,纵然直接双击张开test.iqy也会hang住。

 

4. 为啥双击展开excel不会hang住

因为双击展开实际是用explorer.exe张开,而explorer.exe是有窗口的,能够健康的选取管理WM_DDE_INITIATE消息

 

5. 为什么win7上不会有那般的难题

5.1 在API Monitor中看下PostMessageW

图片 9

瞩目到win7下PostMessageW是用的线程2调用的,搜一下线程创立API CreateThread

图片 10

能够是ShellExecuteEx内部创设的线程,所以win7上ShellExecuteEx创立了多少个线程特地用来管理和excel的DDE新闻通信,那样就能够健康的接收处理excel发过来的WM_DDE_INITIATE消息了

本文由广东十一选五一定牛发布于广东十一选五走势图表,转载请注明出处:ShellExecuteEX打开iqy文件导致excel hang的原因分析

关键词:

上一篇:python发展史

下一篇:win10优化开机进程

最火资讯