![]() |
Делать мне было нечего, а работать не хотелось, поэтому вы видите этот гайд
Введение: Для начала скажу, что вам понадобится Visual Studio(Так проще всего), и пакеты к ней, а именно - Разработка классических приложений на C++ и Разработка приложений на универсальной платформы Windows. Все действия производились на Visual Studio 2019, в других версиях интерфейс может отличаться Создание проекта: И так, начнем с создания проекта. Жмем кнопку создать проект, и ищем "Библиотека динамической компоновки (DLL)" (Дело в том, что ASI это и есть DLL файл, только с измененным расширением). Создаем проект. Я назвал его ASIPlugin. После создания проекта мы видим перед собой окно редактора с подготовленным шаблоном. Шаблон содержит в себе подключение pch.h и функции DllMain. Настройка проекта: Начнем с настройки проекта. В панели меню сверху жмем Проект, и выпадающем меню выбираем пункт Свойства: $ProjectName Сверху, в выпадающем меню в открывшемся диалоге выбираем Конфигурация -> Все конфигурации. После этого я обычно отключаю предварительно скомпилированные заголовки(pch.h), но вы можете их оставить(поэкспериментиру те сами) Включить/Выключить можно в подменю C/C++ -> Предварительно откомпилированные заголовки -> Предварительно откомпилированный заголовок После этого переходим в Дополнительно -> Расширение целевого файла, меняем .dll на .asi(чтобы подгружалось ASI Лоадером) (ОПЦИОНАЛЬНО) После этого переходим в Общие -> Выходной каталог, здесь указываем путь до своей GTA Настройка проекта окончена, переходим к написанию кода Написание кода: Функция DllMain - основная функция Dll библиотеки, которая в нашем случае играет роль Asi плагина. Эта функция вызывается при четырех условиях - создании/уничтожении потока, и при присоединении и отсоединении нашей библиотеки. Первые два условия в данный момент нас не особо интересуют, поэтому перейдем к другим двум. Функция принимает в себя 3 аргумента, один из которых зарезервирован системой(lpReserved). Остальные два аргумента показывают нам базовый адрес библиотеки(Адрес по которому начинается наша библиотека в оперативной памяти) и причину вызова функции. Причина вызова как я уже описал выше - имеет 4 значения: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. На данные момент нас интересуют первое и последнее из них. Первое вызывается при присоединении к процессу, последнее - при отсоединении. Дальше работаем с DLL_PROCESS_ATTACH(В нашем случае оно будет выполнять функцию int main, как в консольном приложении C/C++). DLL_PROCESS_DETACH на данный момент нам не нужен, т.к. нам нечего освобождать после выгрузки. Начну с того, что DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше. Цитата:
Код:
case DLL_PROCESS_ATTACH:Код:
break;Код:
DisableThreadLibraryCalls(hModule);Для функции Код:
CreateThreadСоздаем функции: C++: Код:
DWORD WINAPIИли (для std::thread) C++: Код:
voidФункцию добавления сообщения на экран возьмем с plugin-sdk Далее переходим к инициализации. Игра хранит свою стадию по адресу 0xC8D4C0 И пока значение по адресу не станет 9(полная инициализация игры) - спим и ждем C++: Код:
whileДалее спокойно вызываем функцию AddMessageJumpQ, ведь мы знаем, что игра уже инициализирована C++: Код:
voidC++: Код:
AddMessageJumpQТеперь создадим поток инициализации в DllMain, передав ему нашу функцию (не забывайте что для std::thread нужно подключить заголовок thread): Код:
std::thread(InitializeAndLoad).detach();Код:
CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);Цитата:
https://forum.antichat.xyz/attachments/27751597/ |
На сф будет гайд?
|
Потоки не в моде
C++: Код:
mhook |
Цитата:
|
Цитата:
|
Цитата:
|
Дело было вечером...
Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
C++: Код:
static |
а как скомпилировать , если есть исходник прошу помогите
|
| Время: 12:01 |