开发者

Reversing of _PrepareMenuWindow() subroutine

Can some one help me with reversing of _PrepareMenuWindow() subroutine? I am trying to find the signature of the method.

__text:000639A7 _PrepareMenuWindow proc near            ; CODE XREF: DrawTheMenu(MenuSelectData *,__CFArray **,uchar,uchar *)+274p
__text:000639A7                                         ; PopUpMenuSelectCore(MenuData *,Point,double,Point,ushort,uint,Rect  const*,ushort,ulong,Rect  const*,Rect  const*,__CFString  const*,OpaqueMenuRef **,ushort *)+528p
__text:000639A7
__text:000639A7 var_44          = dword ptr -44h
__text:000639A7 var_40          = dword ptr -40h
__text:000639A7 var_3C          = dword ptr -3Ch
__text:000639A7 var_34          = dword ptr -34h
__text:000639A7 var_30          = dword ptr -30h
__text:000639A7 var_2C          = dword ptr -2Ch
__text:000639A7 var_28          = dword ptr -28h
__text:000639A7 var_24          = word ptr -24h
__text:000639A7 var_20          = dword ptr -20h
__text:000639A7 v开发者_如何学Goar_1A          = word ptr -1Ah
__text:000639A7 arg_0           = dword ptr  8
__text:000639A7 arg_4           = dword ptr  0Ch
__text:000639A7 arg_8           = dword ptr  10h
__text:000639A7
__text:000639A7                 push    ebp
__text:000639A8                 mov     ebp, esp
__text:000639AA                 push    edi
__text:000639AB                 push    esi
__text:000639AC                 push    ebx
__text:000639AD                 sub     esp, 5Ch
__text:000639B0                 xor     edi, edi
__text:000639B2                 mov     eax, [ebp+arg_0]
__text:000639B5                 test    eax, eax
__text:000639B7                 jz      short loc_639C6
__text:000639B9                 mov     eax, [ebp+arg_0]
__text:000639BC                 mov     [esp], eax
__text:000639BF                 call    __ZNK8HIObject13GetEncodedRefEv ; HIObject::GetEncodedRef(void)
__text:000639C4                 mov     edi, eax
__text:000639C6
__text:000639C6 loc_639C6:                              ; CODE XREF: _PrepareMenuWindow+10j
__text:000639C6                 mov     ecx, [ebp+arg_4]
__text:000639C9                 mov     eax, [ecx]
__text:000639CB                 mov     edx, [ecx+4]
__text:000639CE                 mov     [ebp+var_2C], eax
__text:000639D1                 mov     [ebp+var_28], edx
__text:000639D4                 lea     eax, [ebp+var_1A]
__text:000639D7                 mov     [ebp+var_40], eax
__text:000639DA                 mov     [esp+4], eax
__text:000639DE                 mov     [esp], edi
__text:000639E1                 call    _GetMenuType
__text:000639E6                 mov     dword ptr [esp+4], 0
__text:000639EE                 mov     [esp], edi
__text:000639F1                 call    _IsMenuItemEnabled
__text:000639F6                 movzx   edx, [ebp+var_1A]
__text:000639FA                 or      dh, 1
__text:000639FD                 test    al, al
__text:000639FF                 movzx   ebx, [ebp+var_1A]
__text:00063A03                 cmovz   ebx, edx
__text:00063A06                 mov     [ebp+var_1A], bx
__text:00063A0A                 mov     eax, [ebp+arg_8]
__text:00063A0D                 mov     [esp+0Ch], eax
__text:00063A11                 lea     ecx, [ebp+var_2C]
__text:00063A14                 mov     [ebp+var_44], ecx
__text:00063A17                 mov     [esp+8], ecx
__text:00063A1B                 mov     eax, [ebp+arg_4]
__text:00063A1E                 mov     [esp+4], eax
__text:00063A22                 mov     [esp], edi
__text:00063A25                 call    __AddOpenMenu
__text:00063A2A                 mov     ecx, [ebp+var_44]
__text:00063A2D                 mov     [esp], ecx
__text:00063A30                 call    _EmptyRect
__text:00063A35                 test    al, al
__text:00063A37                 jnz     loc_63B94
__text:00063A3D                 mov     [esp], edi
__text:00063A40                 call    __Z11GetMenuDataP13OpaqueMenuRef ; GetMenuData(OpaqueMenuRef *)
__text:00063A45                 mov     [ebp+var_3C], eax
__text:00063A48                 call    _NewRgn
__text:00063A4D                 mov     esi, eax
__text:00063A4F                 test    eax, eax
__text:00063A51                 jz      loc_63BDD
__text:00063A57                 movzx   ebx, bx
__text:00063A5A                 mov     eax, [ebp+var_3C]
__text:00063A5D                 mov     eax, [eax+40h]
__text:00063A60                 test    eax, eax
__text:00063A62                 jnz     loc_63B23
__text:00063A68                 mov     [ebp+var_1A], 0
__text:00063A6E                 mov     eax, [ebp+var_2C]
__text:00063A71                 mov     edx, [ebp+var_28]
__text:00063A74                 mov     [ebp+var_34], eax
__text:00063A77                 mov     [ebp+var_30], edx
__text:00063A7A                 mov     ecx, [ebp+var_40]
__text:00063A7D                 mov     [esp+10h], ecx
__text:00063A81                 mov     dword ptr [esp+0Ch], 0
__text:00063A89                 lea     eax, [ebp+var_34]
__text:00063A8C                 mov     [esp+8], eax
__text:00063A90                 mov     dword ptr [esp+4], 7
__text:00063A98                 mov     eax, [ebp+var_3C]
__text:00063A9B                 mov     [esp], eax
__text:00063A9E                 call    __Z12_CallMenuDefP8MenuDatasP4Rect5PointPs ; _CallMenuDef(MenuData *,short,Rect *,Point,short *)
__text:00063AA3                 cmp     [ebp+var_1A], 7473h
__text:00063AA9                 jz      short loc_63ADC
__text:00063AAB                 add     word ptr [ebp+var_2C], 3
__text:00063AB0                 mov     dword ptr [esp+8], 0FFFFFFFCh
__text:00063AB8                 mov     dword ptr [esp+4], 0FFFFFFFCh
__text:00063AC0                 mov     ecx, [ebp+var_44]
__text:00063AC3                 mov     [esp], ecx
__text:00063AC6                 call    _InsetRect
__text:00063ACB                 mov     eax, [ebp+var_44]
__text:00063ACE                 mov     [esp+4], eax
__text:00063AD2                 mov     [esp], esi
__text:00063AD5                 call    _RectRgn
__text:00063ADA                 jmp     short loc_63B23
__text:00063ADC ; ---------------------------------------------------------------------------
__text:00063ADC
__text:00063ADC loc_63ADC:                              ; CODE XREF: _PrepareMenuWindow+102j
__text:00063ADC                 lea     eax, [ebp+var_24]
__text:00063ADF                 mov     [esp+8], eax
__text:00063AE3                 lea     eax, [ebp+var_20]
__text:00063AE6                 mov     [esp+4], eax
__text:00063AEA                 mov     [esp], edi
__text:00063AED                 call    __GetMenuCallout
__text:00063AF2                 movsx   eax, [ebp+var_24]
__text:00063AF6                 mov     [esp+10h], eax
__text:00063AFA                 mov     eax, [ebp+var_20]
__text:00063AFD                 mov     [esp+0Ch], eax
__text:00063B01                 mov     [esp+8], esi
__text:00063B05                 mov     [esp+4], ebx
__text:00063B09                 mov     ecx, [ebp+var_44]
__text:00063B0C                 mov     [esp], ecx
__text:00063B0F                 call    __GetThemeMenuBackgroundRegionWithCallout
__text:00063B14                 mov     eax, [ebp+var_44]
__text:00063B17                 mov     [esp+4], eax
__text:00063B1B                 mov     [esp], esi
__text:00063B1E                 call    _GetRegionBounds
__text:00063B23
__text:00063B23 loc_63B23:                              ; CODE XREF: _PrepareMenuWindow+BBj
__text:00063B23                                         ; _PrepareMenuWindow+133j
__text:00063B23                 mov     [esp+0Ch], esi
__text:00063B27                 mov     ecx, [ebp+var_44]
__text:00063B2A                 mov     [esp+8], ecx
__text:00063B2E                 mov     [esp+4], ebx
__text:00063B32                 mov     [esp], edi
__text:00063B35                 call    __ZL13GetMenuWindowP13OpaqueMenuReftPK4RectP15OpaqueRgnHandle ; GetMenuWindow(OpaqueMenuRef *,ushort,Rect  const*,OpaqueRgnHandle *)
__text:00063B3A                 test    eax, eax
__text:00063B3C                 jz      short loc_63BA1
__text:00063B3E                 mov     [esp], eax
__text:00063B41                 call    _GetWindowPort
__text:00063B46                 mov     [esp], eax
__text:00063B49                 call    _SetPortWrapper
__text:00063B4E                 mov     [esp], esi
__text:00063B51                 call    _SetClipWrapper
__text:00063B56                 mov     [esp], esi
__text:00063B59                 call    _DisposeRgn
__text:00063B5E                 mov     eax, [ebp+var_3C]
__text:00063B61                 mov     eax, [eax+40h]
__text:00063B64                 test    eax, eax
__text:00063B66                 jnz     short loc_63BDD
__text:00063B68                 mov     dword ptr [esp+14h], 0
__text:00063B70                 mov     dword ptr [esp+10h], 0
__text:00063B78                 mov     [esp+0Ch], ebx
__text:00063B7C                 mov     ecx, [ebp+arg_4]
__text:00063B7F                 mov     [esp+8], ecx
__text:00063B83                 mov     eax, [ebp+var_44]
__text:00063B86                 mov     [esp+4], eax
__text:00063B8A                 mov     [esp], edi
__text:00063B8D                 call    __Z18DrawMenuBackgroundP13OpaqueMenuRefRK4RectS3_thPv ; DrawMenuBackground(OpaqueMenuRef *,Rect  const&,Rect  const&,ushort,uchar,void *)
__text:00063B92                 jmp     short loc_63BDD
__text:00063B94 ; ---------------------------------------------------------------------------
__text:00063B94
__text:00063B94 loc_63B94:                              ; CODE XREF: _PrepareMenuWindow+90j
__text:00063B94                 mov     ecx, [ebp+arg_0]
__text:00063B97                 mov     [esp], ecx
__text:00063B9A                 call    _DisposeMenuWindow
__text:00063B9F                 jmp     short loc_63BDD
__text:00063BA1 ; ---------------------------------------------------------------------------
__text:00063BA1
__text:00063BA1 loc_63BA1:                              ; CODE XREF: _PrepareMenuWindow+195j
__text:00063BA1                 mov     eax, [ebp+arg_0]
__text:00063BA4                 mov     [esp], eax
__text:00063BA7                 call    __Z11FindMBEntryP8MenuData ; FindMBEntry(MenuData *)
__text:00063BAC                 mov     ecx, eax
__text:00063BAE                 test    eax, eax
__text:00063BB0                 jz      short loc_63BD5
__text:00063BB2                 mov     word ptr [eax+1Eh], 0
__text:00063BB8                 mov     word ptr [eax+1Ch], 0
__text:00063BBE                 mov     word ptr [eax+1Ah], 0
__text:00063BC4                 mov     word ptr [eax+18h], 0
__text:00063BCA                 mov     eax, [eax+18h]
__text:00063BCD                 mov     edx, [ecx+1Ch]
__text:00063BD0                 mov     [ecx], eax
__text:00063BD2                 mov     [ecx+4], edx
__text:00063BD5
__text:00063BD5 loc_63BD5:                              ; CODE XREF: _PrepareMenuWindow+209j
__text:00063BD5                 mov     [esp], esi
__text:00063BD8                 call    _DisposeRgn
__text:00063BDD
__text:00063BDD loc_63BDD:                              ; CODE XREF: _PrepareMenuWindow+AAj
__text:00063BDD                                         ; _PrepareMenuWindow+1BFj ...
__text:00063BDD                 xor     eax, eax
__text:00063BDF                 add     esp, 5Ch
__text:00063BE2                 pop     ebx
__text:00063BE3                 pop     esi
__text:00063BE4                 pop     edi
__text:00063BE5                 leave
__text:00063BE6                 retn
__text:00063BE6 _PrepareMenuWindow endp


What have you got so far that isn't generated by IDA? (ie: your analysis of the function).

From the looks of it its a __cdecl function that always returns NULL/false/0. It also seems to take 3 arguments(which can be confirmed by looking at what cleanup is by the caller, if there is any).

Arg 0 is a MenuData*, arg 4 seems to be a Rect&(which is secretly just Rect*), arg 8 would be whatever type __AddOpenMenu takes as its fourth argument.

So i'd assume something along the lines of typedef BOOL(__cdecl*)(MenuData*,Rect&,void*)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜