<
Последние сообщения:

→ В теме Ваши любимые песни, от RusUpdate
→ В теме СПАМ-мусорка, от potopa
→ В теме Интервью со Splinter'ом, от Дилан
→ В теме Adobe After Effects, от Дилан
→ В теме Ваш любимый актёр/актриса?, от Дилан
→ В теме Технические проблемы, от Дилан
Меню форума:

Правила
Новые сообщения
Поиск
Список пользователей
RSS
Чат
Это важно:

  • Страница 1 из 1
  • 1
Модератор форума: iGROK  
GTA форум » Наши модмейкеры » iGROK (AXLiberty) » Работа с DirectX 11 (Пишем хук и рисуем фигуры)
Работа с DirectX 11
iGROK      вторник, 25-08-2015, 17:40 | Сообщение #1

Группа:
FIB
SPEEDHUNTER

На счету:
2573$
Регистрация:
08-10-2009
Город:
Ростов-на-Дону
Пол:
Мужчина

— #000000
— #0000FF
— #A31515 (words)
— #2B91AF (types)
— #6F008A (defines)
— #2F4F4F (enums)
— #008000 (comments)
— #808080 (method's vars)

Тема будет написана в течении недели
or so

Работа с DirectX 11: Пишем хук и рисуем фигуры

Для начала подключим графический интерфейс DirectX:

Цитата
#include <dxgi.h>
#pragma comment(lib, "dxgi.lib")

Далее, если мы имеем указатель на IDXGISwapChain, то можно сразу перейти к подмене функции. Но так как лучше подменять функцию динамически, не выполняя предварительно поиск указателя, мы перейдём к созданию временного IDXGISwapChain.

Зачем нам временный? Потому что во время работы приложения, все объекты IDXGISwapChain имеют единую таблицу виртуальных методов. Это значит, что нам не нужен указатель на оригинальный IDXGISwapChain, мы можем подменить функцию у нашего временного IDXGISwapChain, и наша функция будет также выполняться при работе оригинального IDXGISwapChain.

Создание временного IDXGISwapChain

Цитата
ID3D11Device * pDevice = NULL;
ID3D11DeviceContext * pContext = NULL;
IDXGISwapChain * pSwapChain = NULL;

HWND hWnd = GetForegroundWindow();

D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Format =
DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage =
DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed =
GetWindowLong(hWnd, GWL_STYLE) & WS_POPUP != 0 ? FALSE : TRUE;
swapChainDesc.BufferDesc.ScanlineOrdering =
DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling =
DXGI_MODE_SCALING_UNSPECIFIED;
swapChainDesc.SwapEffect =
DXGI_SWAP_EFFECT_DISCARD;

if (FAILED(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, &featureLevel, 1, D3D11_SDK_VERSION, &swapChainDesc, &pSwapChain, &pDevice, NULL, &pContext)))
{
MessageBoxA(hWnd,
"Ошибка создания временного SwapChain!", "Ошибка", MB_ICONERROR);
return NULL;
}

Основной функцией во время отрисовки является функция Present. Данная функция меняет местами буфера, иными словами данная функция переключает кадры. Именно её мы и будем подменять. Перед заменой буфера мы будем дорисовывать то, что нам нужно, и только потом менять буферы местами.

Подмена функции IDXGISwapChain::Present

***

Цитата
typedef HRESULT(__fastcall * IDXGISwapChain__Present)(IDXGISwapChain * pSwapChain, UINT SyncInterval, UINT Flags);
IDXGISwapChain__Present Present;

***

Сам процесс подмены выглядит очень просто:

Цитата
DWORD oldProtection;
void ** SwapChainVtable = *(void ***)pSwapChain;
VirtualProtect(&SwapChainVtable[8], 4,
PAGE_EXECUTE_READWRITE, &oldProtection);

// Сохраняем оригинальную функцию
Present = (IDXGISwapChain__Present)SwapChainVtable[8];

// Перезаписываем адрес функции в таблице виртуальных методов
SwapChainVtable[8] = &HookPresent;
VirtualProtect(&SwapChainVtable[8], 4, oldProtection,
NULL);


***

После выполнения всех необходимых действий, мы можем освободить теперь уже не нужные нам объекты. Это мы сделаем после подмены функции Present.

Цитата
pContext->Release();
pDevice->Release();
pSwapChain->Release();

 

GitHub: [C++] Helpers



Сообщение отредактировал iGROK - пятница, 28-08-2015, 20:06
Нет на форуме
 
GTA форум » Наши модмейкеры » iGROK (AXLiberty) » Работа с DirectX 11 (Пишем хук и рисуем фигуры)
  • Страница 1 из 1
  • 1
Поиск:

СОЦИАЛЬНЫЕ СЕТИ:
© 2007-2023
«При копировании материалов с сайта, будьте людьми — ставьте ссылку»