澳门蒲京 > 操作系统 > 但直接双击"test.iqy"是没有问题的

但直接双击"test.iqy"是没有问题的
2020-01-03 07:40

4> ShellExecuteEx试行实现,但并不destroy "WorkerW"窗口

翻看一下buff的地方:

表达excel给持有顶层窗口发送一个WM_DDE_INITIATE新闻,不过有窗口未有response

左近,大家能够创建叁个带窗口的次第,运维后将其挂起,此时,即便直接双击展开test.iqy也会hang住。

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

3.2.1 依据微软的文档可以预知,发送DDE新闻除了WM_DDE_INITIATE和WM_DDE_ACK之外用的都以PostMessage

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

图片 1

本条窗口所属的进度PID = 0xc54,刚巧是excel的经过,表达ShellExecuteEx确实发送了DDE音讯给excel,况且可执发送的新闻的thread就是主线程

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

3. 缘故深入分析

图片 2

再次出现意况:XP sp3 / Office 二〇〇五(别的office版本应该也得以,未有测量试验)

 

3.1 excel hang在哪里?

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

3.2 为了验证3.1.1的估摸,用API Monitor一下ShellExecuteEx

介怀到win7下PostMessageW是用的线程2调用的,搜一下线程创造API CreateThread

 

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

能够看来Excel hang在NtUserMessageCall(卡塔尔国中,经过查询知,SendMessage(卡塔尔国内部正是调用NtUserMessageCall(State of Qatar来发送消息的。

4. 怎么双击展开excel不会hang住

shell_execute.exe的主要code:

图片 3

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

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

图片 4

图片 5

 

5. 怎么win7上不会有那样的主题素材

翻开参数知excel调用NtUserMessageCall(卡塔尔(قطر‎近似如下:

3> Post WM_DDE_EXECUTE给excel,告知张开test.iqy的授命

5.1 在API Monitor中看下PostMessageW

介怀到下贰个API GetWindowThreadProcessId ( 0x00310172 , 0x0012fb70 卡塔尔,恰巧是获取那几个窗口的pid和tid,查看下参数窗口:

由此可以疑惑是出于console进度在和excel用DDE音讯通讯时,console未有响应excel发送的DDE音讯,招致excel hang住

图片 6

 

1> 解压iqy_test.zip

NtUserMessageCall(HWND_BROADCAST, WM_DDE_INITIATE)

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

赶巧正是打开test.iqy的下令,表达ShellExecuteEx就是先创立了excel的长河,然后发送test.iqy的文书命令给excel展开。

因为双击展开实际是用explorer.exe打开,而explorer.exe是有窗口的,能够平常的吸收接纳处理WM_DDE_INITIATE消息

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 总结

 

基于DDE的音讯参数,可以看到wParam就是发送音讯的窗口,其句柄为2425190 = 0x250166,反向查询知那是ShellExecuteEx创设的”WorkerW”窗口

能够是ShellExecuteEx内部创建的线程,所以win7上ShellExecuteEx创设了三个线程特地用来拍卖和excel的DDE消息通讯,那样就能够健康的抽取管理excel发过来的WM_DDE_INITIATE消息了

 

图片 7

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

 

1. 问题

call stack展现实在是ShellExecuteEx所调用

图片 8

图片 9

2. 再次出现步骤

图片 10

当在console中调用API ShellExecuteEx展开"test.iqy"文件时,发掘excel会hang住,console退出后excel才会响应,但直接双击"test.iqy"是从未难点的,有趣的是其后生可畏景况独有在xp产生,在win7上尚未这些主题材料。

上一篇:  4、打开安全提示符 下一篇:没有了