Как объявить интерфейс ID3DXBuffer в ffi ?

Andrinall

Известный
Автор темы
678
531
Версия MoonLoader
.027.0-preview
Вопрос в шапке.

Нужно объявление ID3DXBuffer для его использования в D3DXAssembleShader и SetPixelShader
Переломал себе всю голову, выбивает либо declaration specifier expected near 'ID3DXBuffer' at line 3, либо size of C type is unknown or too large at line 6.

По сути мне из этого буфера нужен только метод GetBufferPointer().
Если кто знает, как вытащить pointer на данные интерфейса без объявления интерфейса и вызова самого метода - жду предложение реализации.

Код из d3dx9core.h
C++:
///////////////////////////////////////////////////////////////////////////
// ID3DXBuffer:
// ------------
// The buffer object is used by D3DX to return arbitrary size data.
//
// GetBufferPointer -
//    Returns a pointer to the beginning of the buffer.
//
// GetBufferSize -
//    Returns the size of the buffer, in bytes.
///////////////////////////////////////////////////////////////////////////

typedef interface ID3DXBuffer ID3DXBuffer;
typedef interface ID3DXBuffer *LPD3DXBUFFER;

// {8BA5FB08-5195-40e2-AC58-0D989C3A0102}
DEFINE_GUID(IID_ID3DXBuffer, 
0x8ba5fb08, 0x5195, 0x40e2, 0xac, 0x58, 0xd, 0x98, 0x9c, 0x3a, 0x1, 0x2);

#undef INTERFACE
#define INTERFACE ID3DXBuffer

DECLARE_INTERFACE_(ID3DXBuffer, IUnknown)
{
    // IUnknown
    STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;

    // ID3DXBuffer
    STDMETHOD_(LPVOID, GetBufferPointer)(THIS) PURE;
    STDMETHOD_(DWORD, GetBufferSize)(THIS) PURE;
};
 
  • Вау
Реакции: YarikVL и qdIbp
Решение
Есть такая штука - таблица виртуальных методов
Поинтер на неё лежит в первом машином слове любой структуры/класса, в котором есть виртуальные методы

Методы в ней располагаются так:
( Сверху вниз, начиная с нуля, для переопределений метода - сверху вниз )
C++:
struct Example {
    
    virtual int my_method(); // Index = 0
    virtual void some_method(); // Index = 2
    virtual void some_method(int arg); // Index = 1
    virtual int some_method_2(); // Index = 3
    virtual const char* some_method_3(); // Index = 4
    
};

Получив индекс метода, лучше его перепроверить с помощью Cheat Engine / IDA
Когда уверен в индексе, делаешь такое:
Lua:
local object = 0xFFFFFFFF -- Указатель на ID3DXBuffer
local virtual_methods_table =...

RedHolms

Известный
Проверенный
617
360
Есть такая штука - таблица виртуальных методов
Поинтер на неё лежит в первом машином слове любой структуры/класса, в котором есть виртуальные методы

Методы в ней располагаются так:
( Сверху вниз, начиная с нуля, для переопределений метода - сверху вниз )
C++:
struct Example {
    
    virtual int my_method(); // Index = 0
    virtual void some_method(); // Index = 2
    virtual void some_method(int arg); // Index = 1
    virtual int some_method_2(); // Index = 3
    virtual const char* some_method_3(); // Index = 4
    
};

Получив индекс метода, лучше его перепроверить с помощью Cheat Engine / IDA
Когда уверен в индексе, делаешь такое:
Lua:
local object = 0xFFFFFFFF -- Указатель на ID3DXBuffer
local virtual_methods_table = ffi.cast("uintptr_t**", object)[0]
local GetBufferPointer = virtual_methods_table[индекс в виртуальной таблице]

-- потом можешь закастить GetBufferPointer к типу метода
-- (Учитывай, ВСЕ методы интерфейсов direct x имеют тип __stdcall)

всё таки добавлю как закастить:
Lua:
local ID3DXBuffer__GetBufferPointer = ffi.cast("void*(__stdcall*)(ID3DXBuffer*)", GetBufferPointer)

-- Потом можно вызывать, передавая первым параметром указатель на ID3DXBuffer
local buffer = ID3DXBuffer__GetBufferPointer(object)
 
Последнее редактирование:
  • Нравится
  • Вау
Реакции: Andrinall и qdIbp

Andrinall

Известный
Автор темы
678
531
С виртуальными методами знаком, в скрипте есть vmt хуки на несколько методов внутри d3ddevice.
Но почему-то не пришло в голову, что ID3DBuffer может быть таблицей вирт.методов.
Благодарю за ответ и пояснения.
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,709
С виртуальными методами знаком, в скрипте есть vmt хуки на несколько методов внутри d3ddevice.
Но почему-то не пришло в голову, что ID3DBuffer может быть таблицей вирт.методов.
Благодарю за ответ и пояснения.
Так там же написано INTERFACE, что несколько намекает на это. И к тому же еще PURE. Да и можно было просто посмотреть что делает макрос STDMETHOD
 
  • Нравится
Реакции: Andrinall