您的位置:威尼斯官方网站 > 威尼斯官方网站 > 威尼斯官方网站但直接双击"test.iqy"是绝非难题的

威尼斯官方网站但直接双击"test.iqy"是绝非难题的

发布时间:2019-11-04 19:28编辑:威尼斯官方网站浏览(58)

    1. 问题

    当在console中调用API ShellExecuteEx展开"test.iqy"文件时,开采excel会hang住,console退出后excel才会响应,但一贯双击"test.iqy"是还不荒谬的,有趣的是那么些情形唯有在xp发生,在win7上一直不这么些标题。

     

    2. 复出步骤

    复发遭受:XP sp3 / Office 贰零零伍(别的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消息了

    本文由威尼斯官方网站发布于威尼斯官方网站,转载请注明出处:威尼斯官方网站但直接双击"test.iqy"是绝非难题的

    关键词: