Приветствую!!! Пишу монитор(шпион) для показа вызовов DirectX Почти написал, осталось получить адреса таблиц, которые указывают на методы интрфейса Принцип простой - патчим таблицы методов. Т.е перенаправляем на свою заглушку, пишем в лог, а потом уже вызываем сам метод. Как можно получить адреса таблиц, которые указывают на методы. Для некоторых я получил, но не для всех... Например для IDirectSound8, IDirectSoundBuffer получаются так вызовом DirectSoundCreate, а вторая через вызов CreateDirectSoundBuffer Как можно получить остальные интерфейсы. В SDK все время упоминается получение через IUnknown::QueryInterface. Может кто знает как P.S. Пока монитор показывает методы IDirectSound8, IDirectSoundBuffer. Вся проблема в получении остальных адресов таблиц. 2129239039__dsmon.zip
Дык в MSDN описание QueryInterface посмотри - последний параметр - указатель на VTbl. Вот ещё про COM, но в DX сложные вещи не используются. А вместо падча VTbl может проще перехватить ф-ции её возвращающие и отдавать свою?
Мля... я тоже ненавижу COM Но как- то ведь вызываются методы directx'a ??? Как??? Кто-нибудь может показать. Можно на чем угодно...
Так там относительно просто (даже проще, чем api перехватывать). Пример: STDAPI DirectXFileCreate(LPDIRECTXFILE *lplpDirectXFile); Возвращает указатель на IDirectXFile, которая является ни чем иным как VTbl интерфейса IDirectXFile. На низком уровне: просто массив указателей на методы: Код (Text): struct { ; методы IUnknown .QueryInterface .AddRef .Release ; методы IDirectXFile .CreateEnumObject .CreateSaveObject .RegisterTemplates } Что нужно сделать? 0) Вызвать DirectXFileCreate, получить VTbl IDirectXFile, сохранить её. 1) Перехватить DirectXFileCreate и возвращать указатель на свою VTbl, методы которой указывают на свои функции, которые будут сохранять информацию о вызовах и передавать управление на оригинальную VTbl. 2) Если вызывается IDirectXFile.QueryInterface, то зовём оригинальный QueryInterface и сохраняеме его результат себе, проге же передаём свой VTbl запрашиваемого интерфейса. И так далее.
IceStudent мыслит верно. Методы DirectX и любой метод COM вызываются за нефиг делать Большинство подобных программ основаны на создании аналога-заглушки библиотеки (например d3d9.dll). Библиотеку кидают либо в каталог с нужным экзешником, либо в системную директорию. Или на худой конец внедряют в исследуемый процесс эту dll вместо стандартной. При вызове приложением функции Direct3DCreate загружается наша dll и обработав данную функцию можно подсунуть программе указатель на собственную vtable. В дальнейшем практически любой вызов будет происходить через эту vtable содержащую наши собственные обработчики. Таким подходом можно контролировать очень много и делать с приложением что угодно, благо все параметры метода лежат в стеке. По поводу других компонент DirectX могу сказать только одно, особо отслеживать вызовы DirectSound или DirectInput не так интересно как Direct3D.
Шпион сделан так, что ему все равно за какими методами шпионить. DirectSound взят только для примера. (Раньше написал граббер музыки из демок, и поэтому кое-что знал о нем. Но повторю - за кем следить разницы никакой) Я немогу понять - как можно получить vtbl например для IDirectSoundFXChorus8 или для любого другого (QueryInterface ???). Покажите пожалуйста на примере.
DX SDK у меня нет, но общий принцип такой. прога зовёт DirectSoundCreate8 для получения указателя на интерфейс IDirectSound8. Потом вызывает IDirectSound8.QueryInterface чтобы получить указатель на любой другой интерфейс, в частности и IDirectSoundFXChorus8: Код (Text): IDirectSoundFXChorus8* piDxChorus = 0; IDirectSound8* piDxSound = 0; //SDK под рукой нет, точно не знаю, что тут LPGUID pDevice; HRESULT hr = DirectSoundCreate8(pDevice,&piDxSound,NULL); if((hr >= 0) && piDxSound) // запрашиваем указатель на интерфейс IDirectSoundFXChorus8 piDxSound->QueryInterface(IID_IID_IDirectSoundFXChorus8,(void**)&piDxChorus);