· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.RESEARCH —› дизассемблер DirectX (COM) методов ?

Посл.отвђт Сообщенiе


Дата: Июл 18, 2003 14:35:34

в процессе исследования игровой программы выяснилось значительное затруднение в распознавании "методов интерфейсов" ... IDA вроде все раздизассемблировала, но про DirectX она похоже не знает и в результате получается:
.text:004069CD loc_4069CD:                             ; CODE XREF: sub_4069A0+1Dj
.text:004069CD                 mov     eax, [edi+5CCh] ; pointer to DirectInput (device/interface)
.text:004069D3                 lea     ecx, [esp+298h+var_290] ; lplpMouseDevice, really [ESP+08H]
.text:004069D7                 push    0
.text:004069D9                 push    ecx
.text:004069DA                 mov     edx, [eax]
.text:004069DC                 push    offset dword_47AE48 ; GUID_SysMouse
.text:004069E1                 push    eax
.text:004069E2                 call    dword ptr [edx+0Ch] ; CreateDevice - Mouse
.text:004069E5                 test    eax, eax
.text:004069E7                 jz      short loc_4069F7 ; lplpMouseDevice, really [ESP+08H]
.text:004069E9                 pop     edi
.text:004069EA                 mov     eax, 0FFFFFFFDh
.text:004069EF                 pop     esi
.text:004069F0                 add     esp, 288h
.text:004069F6                 retn
.text:004069F7 ; ---------------------------------------------------------------------- -----
.text:004069F7 
.text:004069F7 loc_4069F7:                             ; CODE XREF: sub_4069A0+47j
.text:004069F7                 mov     eax, [esp+2A8h+var_2A0] ; lplpMouseDevice, really [ESP+08H]
.text:004069FB                 lea     esi, [edi+1C8h] ; pointer to new device ? (IDirectInputDevice2) ?
.text:00406A01                 push    ebp
.text:00406A02                 push    esi
.text:00406A03                 mov     edx, [eax]
.text:00406A05                 push    offset unk_47AD68
.text:00406A0A                 push    eax
.text:00406A0B                 call    dword ptr [edx] ; Device+0 ? (..,esi,[47ad68H]=5944e682H) GUID(IID_IDirectInputDevice2A,0x5944E682... )


т.е. все комментарии приходится долго сооружать методом:
1. предположить, что .text:004069E2 call dword ptr [edx+0Ch] это вызов некоторого "метода" из DirectInput девайса.

2. пойти в dinput.h из INCLUDE от DX6SDK и найти там
DECLARE_INTERFACE_(IDirectInputA, IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
    STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    STDMETHOD_(ULONG,Release)(THIS) PURE;

    /*** IDirectInputA methods ***/
    STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;


3. посчитать, что STDMETHOD(CreateDevice) это третий метод, начиная с нуля из IDirectInputA, помножить 3 на 4 байта и в шестнадцатеричном виде получить 0CH

4. сравнить 0СН и call dword ptr [edx+0Ch], усилить предположение, что это и есть вызов метода CreateDevice из ифейса IDirectInputA

5. рассмотреть число и вид передаваемых параметров и еще больше утвердить предположение...

вот типа так запариваться приходится :/ ... а там от инита DirectInput до собственно работы проходит немало таких вызовов... вопрос - может есть или плагин для IDA или хотя бы рантаймный "декодер" ифейсов и методов DirectX - типа я ставлю бряк на создание DirectInput и софт показывает все места где вызываются его методы и все последующие "устройства/ифейсы" и т.д. ...

второй вопрос :
что означает вызов .text:00406A0B call dword ptr [edx] - это типа "нулевой метод" ифейса IDirectInputDevice ? и т.к. в стек еще засовывается указатель на GUID(IID_IDirectInputDevice2A,..), то получается, это создается "новое" устройство IDirectInputDevice2A из "старого" ?

согласно dinput.h
DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown)
{
    /*** IUnknown methods ***/
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;


нулевой метод это QueryInterface, и вроде по типу и числу параметров похоже...


Дата: Июл 19, 2003 01:44:56 · Поправил: volodya

Замечательное описание, спасибо. к сожалению, лично я ничего о такой утилите не слышал. Сам как ты ручками и работал, но только не с DirectX, а с другими вещами. А вообще, пост великолепный.
А как на счет самому написать? SDK на сайте лежат.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.063