您的位置:澳门402永利com > 操作系统 > hang的原因剖析,Windows新闻机制要点

hang的原因剖析,Windows新闻机制要点

发布时间:2019-09-25 07:21编辑:操作系统浏览(109)

    1. 问题

    1. 窗口进度 
    每一个窗口会有一个堪称窗口进度的回调函数(WndProc),它富含八个参数,分别为:窗口句柄(Window Handle),新闻ID(Message ID),和四个新闻参数(wParam, lParam),当窗口收到新闻时系统就能调用此窗口进度来拍卖新闻。(所以叫回调函数)

    当在console中调用API ShellExecuteEx展开"test.iqy"文件时,发现excel会hang住,console退出后excel才会响应,但直接双击"test.iqy"是向来不难题的,风趣的是以此处境独有在xp爆发,在win7上未曾那些标题。

    2 音信类型 
    1) 系统定义音信(System-Defined Messages)
     
    在SDK中先行定义好的新闻,非客商定义的,其范围在[0x0000, 0x03ff]以内, 能够分成以下三类:
    1>窗口语资源消息息(Windows Message) 
    与窗口的中间运行有关,如成立窗口,绘制窗口,销毁窗口等。能够是形似的窗口,也得以是Dialog,控件等。
    如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
    2>命令音讯(Command Message):注意那类音讯通称为WM_COMMAND
    与拍卖客户央浼有关, 如单击菜单项或工具栏或控件时, 就能够产生命令音讯。
    WM_COMMAND, LOWO牧马人D(wParam)表示菜单项,工具栏开关或控件的ID。借使是控件, HIWO福特ExplorerD(wParam)表示控件新闻类型
    3> 控件文告(Notify Message) 
    控件文告音信, 那是最灵敏的信息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHD帕杰罗的指针。NMHDLacrosse蕴涵控件通告的剧情, 能够轻松扩张。
    2) 程序定义音信(Application-Defined Messages) 
    客商自定义的音信, 对于其范围有如下规定:
    WM_USER: 0x0400-0x7FFF    (ex. WM_USER+10)
    澳门402永利com,WM_APP(winver>4.0): 0x8000-0xBFFF (ex.WM_APP+4)
    奥门永利402官方网站,RegisterWindowMessage: 0xC000-0xFFFF

     

    3 音信队列(Message Queues) 
    Windows中有三种档期的顺序的新闻队列
    1) 系统新闻队列(System Message Queue) 那是二个连串独一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成音信存在系统队列中,然后系统会把此消息放到目的窗口所在的线程的新闻队列(thread-specific message queue)中伺机管理
    2) 线程消息队列(Thread-specific Message Queue) 每贰个GUI线程都会爱慕这么三个线程音讯队列。(那么些行列唯有在线程调用GDI函数时才会创建,暗中同意不创立)。然后线程音信队列中的音讯会被送到相应的窗口进程(WndProc)处理.
    小心: 线程音讯队列中WM_PAINT,WM_TIME君越唯有在Queue中一向不其余音讯的时候才会被管理,WM_PAINT音讯还有大概会被统一以升高功能。其余具有音讯以先进先出(FIFO)的法门被拍卖。

    2. 重现步骤

    4 队列消息(Queued Messages)和非队列音信(Non-Queued Messages)
    1)队列音讯(Queued Messages)
     
    音讯会先保存在新闻队列中,音信循环会从此队列中取音讯并散发到各窗口管理
    如鼠标,键盘音讯。
    2) 非队列信息(NonQueued Messages) 音讯会绕过系统音讯队列和线程新闻队列直接发送到窗口进度被管理
    如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED 
    在意: postMessage发送的音信是队列新闻,它会把音信Post到音信队列中; SendMessage发送的新闻是非队列新闻, 被直接送到窗口进度管理

    复发情形:XP sp3 / Office 2005(别的office版本应该也足以,没有测量试验)

    5 PostMessage(PostThreadMessage), SendMessage 
    PostMessage:把音信放到钦定窗口所在的线程新闻队列中后马上重临。 PostThreadMessage:把消息放到钦点线程的新闻队列中后当即赶回。
    SendMessage:直接把音讯送到窗口进程管理,管理完了才回来。

    6 GetMessage, PeekMessage 
    PeekMessage会马上回去能够保留新闻
    GetMessage在有新闻时再次回到会删除音信

    1> 解压iqy_test.zip

    7 TranslateMessage, TranslateAccelerator 
    TranslateMessage: 把一个virtual-key音讯转化成字符新闻(character message),并内置当前线程的消息队列中,音信循环下叁遍抽取管理。
    TranslateAccelerator:将火速键对应到相应的美食指南命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成神速键表中相应的WM_COMMAND或WM_SYSCOMMAND新闻, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口进度管理, 管理完后才会回去。

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

    8(音讯死锁( Message Deadlocks) 
    假设有线程A和B, 现在有以下下步骤
    1) 线程A SendMessage给线程B, A等待新闻在线程B中拍卖后再次回到
    2) 线程B收到了线程A发来的音讯,并进行拍卖, 在管理进度中,B也向线程A SendMessgae,然后等待从A重返。
    因为此时, 线程A正等待从线程B重临, 不可能处理B发来的音信, 进而导致了/线程A,B相互等待, 形成死锁。五个线程也可以产生环形死锁。
    可以应用 SendNotifyMessage或SendMessageTimeout来幸免出现死锁。

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

    9 BroadcastSystemMessage 
    大家一般所接触到的新闻都以发送给窗口的,其实, 信息的接收者能够是丰富多彩的,它能够是应用程序(applications), 可设置驱动(installable drivers),网络设施(network drivers), 系统级设备驱动(system-level device drivers)等, 
    布罗兹castSystemMessage那么些API能够对上述系统组件发送消息。

    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住的地点

    奥门永利402官方网站 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的调用,果然搜到一条

    奥门永利402官方网站 2

    call stack彰显的确是ShellExecuteEx所调用

    奥门永利402官方网站 3

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

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

    其一窗口所属的进度PID = 0xc54,正好是excel的经过,表达ShellExecuteEx确实发送了DDE消息给excel,何况可执发送的音讯的thread正是主线程

    奥门永利402官方网站 4

    据书上说DDE的消息参数,可见wParam便是出殡和埋葬消息的窗口,其句柄为2425190 = 0x250166,反向查询知这是ShellExecuteEx创造的”WorkerW”窗口

    奥门永利402官方网站 5

    奥门永利402官方网站 6

     

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

    奥门永利402官方网站 7

    翻看一下buff的地方:

    奥门永利402官方网站 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

    奥门永利402官方网站 9

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

    奥门永利402官方网站 10

    可知是ShellExecuteEx内部创建的线程,所以win7上ShellExecuteEx成立了三个线程特地用来拍卖和excel的DDE音信通讯,那样就能够健康的摄取处理excel发过来的WM_DDE_INITIATE消息了

    本文由澳门402永利com发布于操作系统,转载请注明出处:hang的原因剖析,Windows新闻机制要点

    关键词: