SendMessage 异常捕获问题

来源:互联网 发布:c语言打开文件方式 编辑:程序博客网 时间:2024/05/23 15:55

最近为了解决一个第三方组件崩溃导致程序崩溃的问题,使用了捕获消息循环异常的方法,在验证时在sendmessage里面制造了崩溃现场,发现消息循环中使用的try_catch没有捕获到异常,但是程序也没有发生崩溃。换成postmessage异常可以正常捕获到。唯一合理的解释是,sendmessage调用内部捕获了异常,由于无法查看sendmessage的实现,只能查看汇编代码。最终的汇编调用如下:

_SendMessageW@16:
75F19679  mov         edi,edi 
75F1967B  push        ebp  
75F1967C  mov         ebp,esp 
75F1967E  push        esi  
75F1967F  mov         esi,dword ptr [ebp+0Ch] 
75F19682  test        esi,0FFFE0000h 
75F19688  jne         _SendMessageW@16+11h (75F43C53h) 
75F1968E  mov         ecx,dword ptr [ebp+8] 
75F19691  cmp         ecx,0FFFFFFFFh 
75F19694  je          _SendMessageW@16+49h (75F22CF8h) 
75F1969A  cmp         ecx,0FFFFh 
75F196A0  je          _SendMessageW@16+49h (75F22CF8h) 
75F196A6  call        @ValidateHwnd@4 (75F16183h) 
75F196AB  mov         ecx,eax 
75F196AD  or          ecx,edx 
75F196AF  je          _SendMessageW@16+18h (75F22CF1h) 
75F196B5  push        0    
75F196B7  push        dword ptr [ebp+14h] 
75F196BA  push        dword ptr [ebp+10h] 
75F196BD  push        esi  
75F196BE  push        edx  
75F196BF  push        eax  
75F196C0  call        _SendMessageWorker@24 (75F1954Ch) 
75F196C5  pop         esi  
75F196C6  pop         ebp  
75F196C7  ret         10h  
75F196CA  cmp         edx,219h 
75F196D0  ja          75F1D694 
75F196D6  cmp         edx,218h 
75F196DC  jae         75F3EE65 
75F196E2  mov         ecx,137h 
75F196E7  cmp         edx,ecx 
75F196E9  jbe         75F23480 
75F196EF  mov         ecx,edx 
75F196F1  sub         ecx,138h 
75F196F7  jne         75F45279 
75F196FD  mov         ecx,esi 
75F196FF  or          ecx,dword ptr [ebp+0Ch] 
75F19702  je          75F3F518 
75F19708  test        byte ptr [esi+2Dh],2 
75F1970C  je          75F3F518 
75F19712  push        0Fh  
75F19714  pop         esi  
75F19715  push        8    
75F19717  pop         edi  
75F19718  push        dword ptr [eax+esi*4+0ADCh] 
75F1971F  push        dword ptr [ebp+14h] 
75F19722  call        dword ptr [__imp__SetBkColor@8 (75F102F0h)] 
75F19728  mov         eax,dword ptr [__except_list+98h (75F80138h)] 
75F1972D  push        dword ptr [eax+edi*4+0ADCh] 
75F19734  push        dword ptr [ebp+14h] 
75F19737  call        dword ptr [__imp__SetTextColor@8 (75F102ECh)] 
75F1973D  mov         eax,dword ptr [__except_list+98h (75F80138h)] 
75F19742  mov         eax,dword ptr [eax+esi*8+0B58h] 
75F19749  jmp         _RealDefWindowProcWorker@24+218h (75F16A56h) 
75F1974E  dec         eax  
75F1974F  jne         __GetWindow@12+47h (75F53A36h) 
75F19755  mov         esi,dword ptr [edi+60h] 
75F19758  mov         ebx,dword ptr [edi+64h] 
75F1975B  jmp         __GetWindow@12+88h (75F1932Bh) 


可以看到调用中存在这样一段代码

75F19728  mov         eax,dword ptr [__except_list+98h (75F80138h)] 

可见sendmessage与异常处理还是有些许关系。

0 0
原创粉丝点击