Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема при снятии скриншота игры 
V
    Опции темы
g68h50
Дата 4.8.2012, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.8.2012

Репутация: нет
Всего: нет



сейчас делаю скриншот практически так же как  и  denkil92 (http://forum.vingrad.ru/index.php?showtopic=349990&view=findpost&p=2478058)
но немного изменил код: 
Код

#include <d3d9.h>
#include <d3dx9.h>

#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")

#pragma once

typedef HRESULT (WINAPI *CreateDevice_t)(IDirect3D9* Direct3D_Object, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, 
                     DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, 
                     IDirect3DDevice9** ppReturnedDeviceInterface);
typedef HRESULT (WINAPI *EndScene_t)(IDirect3DDevice9* surface);


 CreateDevice_t D3DCreateDevice_orig;
 EndScene_t D3DEndScene_orig;

 HRESULT WINAPI D3DCreateDevice_hook(IDirect3D9* Direct3D_Object, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, 
                     DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, 
                     IDirect3DDevice9** ppReturnedDeviceInterface);
 HRESULT WINAPI D3DEndScene_hook(IDirect3DDevice9* device);

 PDWORD IDirect3D9_vtable = NULL;

#define CREATEDEVICE_VTI 16
#define ENDSCENE_VTI 42

 HRESULT WINAPI HookCreateDevice();
 DWORD WINAPI VTablePatchThread(LPVOID threadParam);

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
   // HMODULE d3dmodule;
   // PBYTE funcAddress;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        //MessageBoxA(NULL, "DLL Injected", "DLL Injected", MB_ICONEXCLAMATION);
        if (HookCreateDevice() == D3D_OK)
        {
        //    pBits = malloc(10000000);
            return TRUE;
        } else {
            return FALSE;
        }

        break;
    case DLL_THREAD_ATTACH:
       // MessageBoxA(NULL, "DLL_THREAD_ATTACH", "DLL", MB_ICONEXCLAMATION);
        break;
    case DLL_THREAD_DETACH:
       // MessageBoxA(NULL, "DLL_THREAD_DETACH", "DLL", MB_ICONEXCLAMATION);
        break;
    case DLL_PROCESS_DETACH:
       // MessageBoxA(NULL, "DLL_PROCESS_DETACH", "DLL", MB_ICONEXCLAMATION);
        break;
    }
    return TRUE;
}

HRESULT WINAPI HookCreateDevice()
{
    IDirect3D9* device = Direct3DCreate9(D3D_SDK_VERSION);
    if (!device)
    {
        return D3DERR_INVALIDCALL;
    }
    IDirect3D9_vtable = (DWORD*)*(DWORD*)device;
  //  device->Release();

    DWORD protectFlag;
    if (VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), PAGE_READWRITE, &protectFlag))
    {
        *(DWORD*)&D3DCreateDevice_orig = IDirect3D9_vtable[CREATEDEVICE_VTI];
        *(DWORD*)&IDirect3D9_vtable[CREATEDEVICE_VTI] = (DWORD)D3DCreateDevice_hook;

       if (!VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), protectFlag, &protectFlag))
        {
            return D3DERR_INVALIDCALL;
        }
    } else {
        return D3DERR_INVALIDCALL;
    }
    /////
    flag_device = true;

    CreateThread(NULL, 0, VTablePatchThread, NULL, NULL, NULL);

    return D3D_OK;
}

HRESULT WINAPI D3DCreateDevice_hook(IDirect3D9* Direct3D_Object, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, 
                    DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, 
                    IDirect3DDevice9** ppReturnedDeviceInterface)
{
    HRESULT result = D3DCreateDevice_orig(Direct3D_Object, Adapter, DeviceType, hFocusWindow, BehaviorFlags | D3DCREATE_MULTITHREADED, pPresentationParameters, ppReturnedDeviceInterface);
    if(result == D3DERR_INVALIDCALL)
    {
        MessageBoxA(NULL, "D3DERR_INVALIDCALL", "DLL Injected", MB_ICONEXCLAMATION);
    }
    DWORD protectFlag;
    if (VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), PAGE_READWRITE, &protectFlag))
    {

        if (!VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), protectFlag, &protectFlag))
       {
            return D3DERR_INVALIDCALL;
       }
   } else {
        return D3DERR_INVALIDCALL;
    }

    if (result == D3D_OK)
    {

        IDirect3D9_vtable = (DWORD*)*(DWORD*)*ppReturnedDeviceInterface;
        *(PDWORD)&D3DEndScene_orig = (DWORD)IDirect3D9_vtable[ENDSCENE_VTI];
*(DWORD*)&IDirect3D9_vtable[ENDSCENE_VTI] = (DWORD)D3DEndScene_hook;
        *(DWORD*)&D3DCreateDevice_orig = IDirect3D9_vtable[CREATEDEVICE_VTI];
        *(DWORD*)&IDirect3D9_vtable[CREATEDEVICE_VTI] = (DWORD)D3DCreateDevice_hook;


flag_end = true;
    }
    return result;
}

DWORD WINAPI VTablePatchThread(LPVOID threadParam)
{
    while (true)
    {
            DWORD protectFlag;
        if (flag_device) {
            //MessageBoxA(NULL, "flag_device", "DLL Injected", MB_ICONEXCLAMATION);
            
            if (VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), PAGE_READWRITE, &protectFlag))
            {
                *(DWORD*)&IDirect3D9_vtable[CREATEDEVICE_VTI] = (DWORD)D3DCreateDevice_hook;
                if (!VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), protectFlag, &protectFlag))
                {
                    return D3DERR_INVALIDCALL;
                }
            } else {
                return D3DERR_INVALIDCALL;
            }
        }

        if(flag_end) {
            if (VirtualProtect(&IDirect3D9_vtable[ENDSCENE_VTI], sizeof(DWORD), PAGE_READWRITE, &protectFlag))
            {
                *(DWORD*)&IDirect3D9_vtable[ENDSCENE_VTI] = (DWORD)D3DEndScene_hook;
                if (!VirtualProtect(&IDirect3D9_vtable[ENDSCENE_VTI], sizeof(DWORD), protectFlag, &protectFlag))
                {
                    return D3DERR_INVALIDCALL;
                }                
            } else {
                return D3DERR_INVALIDCALL;
            }
        }

        Sleep(100);


    }        
}
 HRESULT WINAPI D3DEndScene_hook(IDirect3DDevice9* device)
{
     MessageBoxA(NULL, "Endscene", "4", MB_ICONEXCLAMATION);
     HRESULT result = NULL;

     return result;
}


скришот делается, но (!)
при сворачивании - разворачивании окна програма вылетает с ошибкой D3DERR_INVALIDCALL после вызова D3DCreateDevice_orig

подскажите что можно сделать, где почитать?
PM MAIL   Вверх
g68h50
Дата 4.8.2012, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.8.2012

Репутация: нет
Всего: нет



не уж то никто не знает?
PM MAIL   Вверх
g68h50
Дата 14.9.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.8.2012

Репутация: нет
Всего: нет



всем неответившим спасибо. вопрос закрыт
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1172 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.