|
|
| Посл.отвђт | Сообщен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 |