Вопрос Как можно вызвать интерфейс чтобы получить GameEventSystem?

Начинающий
Статус
Оффлайн
Регистрация
11 Апр 2024
Сообщения
23
Реакции[?]
0
Поинты[?]
0
Я узнал что интерфейс GameEventSystemClientV001 находится в engine2, через IDA я нашел такую строчку в функции

C++:
lea     r8, aGameeventsyste_0
aGameeventsyste_0 как я понимаю и есть GameEventSystemClientV001.

Как в С++ теперь вызвать его? Через winapi GetIntefrace? В этом момент я встрял.


Помогите
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Я узнал что интерфейс GameEventSystemClientV001 находится в engine2, через IDA я нашел такую строчку в функции

C++:
lea     r8, aGameeventsyste_0
aGameeventsyste_0 как я понимаю и есть GameEventSystemClientV001.

Как в С++ теперь вызвать его? Через winapi GetIntefrace? В этом момент я встрял.


Помогите
Пожалуйста, авторизуйтесь для просмотра ссылки.
Пожалуйста, авторизуйтесь для просмотра ссылки.
C++:
using T_CreateInterface = void*(*)(const char* name, int* out_status);
void* CreateInterface(T_CreateInterface function, const char* name)
{
    int out_status{};
    const auto result = function(name, &out_status);
    if (out_status == 0)
        return result;
    return nullptr;
}

if (const auto engine_dll = GetModuleHandleA("engine2.dll"); engine_dll)
{
    if (const auto Engine_CIProc = GetProcAddress(engine_dll, "CreateInterface"); Engine_CIProc)
    {
        const auto engineclient
            = CreateInterface(reinterpret_cast<T_CreateInterface>(Engine_CIProc), "Source2EngineToClient001");
        if (engineclient)
            ...
 
Начинающий
Статус
Оффлайн
Регистрация
11 Апр 2024
Сообщения
23
Реакции[?]
0
Поинты[?]
0

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.



Спасибо), только у тебя лишнее в коде, тело Internal не нужно, движок сам вызовет internal.
Влюбом случае благодарочка) объект получил пошел верстать
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Скрытое содержимое

Спасибо), только у тебя лишнее в коде, тело Internal не нужно, движок сам вызовет internal.
Влюбом случае благодарочка) объект получил пошел верстать
чаво? где ты там в этих 18 строках увидел internal?
если ты про
void* CreateInterface(T_CreateInterface function, const char* name)
это не интернал, это просто обертка со статус чеком(так, на всякий случай)(плюс на нее можно темплейту нацепить и возвращать не void* а конкретный тип, просто в конкретно данном куске кода это не написано(ну хотя можно и саму функцию кастовать в функцию с нужным типом возврата))
интернал это
C++:
void* CreateInterfaceInternal( const char *pName, int *pReturnCode )
{
    InterfaceReg *pCur;
  
    for (pCur=s_pInterfaceRegs; pCur; pCur=pCur->m_pNext)
    {
        if (strcmp(pCur->m_pName, pName) == 0)
        {
            if (pReturnCode)
            {
                *pReturnCode = IFACE_OK;
            }
            return pCur->m_CreateFn();
        }
    }
  
    if (pReturnCode)
    {
        *pReturnCode = IFACE_FAILED;
    }
    return NULL; 
}
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Скрытое содержимое
этот CreateInterfaceInternal(я имею ввиду код а не саму функу) можно кстати в своем коде использовать(собственно дамп интерфейсов из https://yougame.biz/threads/139802/ этим кодом сделан). в экспорте CreateInterface(это на самом деле CreateInterfaceInternal) первой инструкцией лежит этот s_pInterfaceRegs, можно из инструкции его доставать и самому бегать по этому списку интерфейсов
1714767241592.png
 
Сверху Снизу