Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

dxd9

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 26.04.2012, 16:48   #1
 Разведчик
Аватар для xoraxax
 
xoraxax никому не известный тип
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию dxd9

Пытаюсь разобраться с dx хуками

Код:
#include "stdafx.h"
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>

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

/*Color's*/
#define GREEN            D3DCOLOR_ARGB(255, 000, 255, 000)//Trans(250=SOLID,0=INVISIBLE),Red,Green,Blue
#define BLUE            D3DCOLOR_ARGB(255, 000, 000, 255) 
LPD3DXFONT               m_font = NULL;

boolean DrawMessage(LPD3DXFONT font, unsigned int x, unsigned int y, int alpha, unsigned char r, unsigned char g, unsigned char b, LPCSTR Message)

{   // Create a colour for the text

   D3DCOLOR fontColor = D3DCOLOR_ARGB(alpha, r, g, b);
   RECT rct; //Font
   rct.left=x;
   rct.right=150;
   rct.top=y;
   rct.bottom=rct.top+150;   
   font->DrawTextA(NULL, Message, -1, &rct, 0, fontColor);
   return true;
}

//======ВОТ ТУТ
void stuff(LPDIRECT3DDEVICE9 pDevice, D3DCOLOR Color) //Crosshair function by: Hans211
{
        //  D3DCOLOR rectColor = D3DCOLOR_XRGB(255,0,255);   //No point in using alpha because clear & alpha dont work!
	//  D3DRECT BarRect = { 10, 10, 40, 40 }; 
	//  pDevice->Clear(1,&BarRect,  D3DCLEAR_TARGET | D3DCLEAR_TARGET ,rectColor,0,0);
	
	DrawMessage(m_font,40,40,255,255,0,255,  "Привет, Мир!");
}
//======ВОТ ТУТ


void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // Old detour from GD Forums.
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}

typedef HRESULT(__stdcall* EndScene_)(LPDIRECT3DDEVICE9);
EndScene_ pEndScene;//our define
typedef HRESULT (WINAPI* Reset_) (LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters);
Reset_ pReset;


/*Hooked Endscene*/
HRESULT __stdcall EndScene(LPDIRECT3DDEVICE9 pDevice)
{//Calling our Hook.EndScene makes us able to draw.    
	D3DXCreateFont( pDevice, 17, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"), &m_font );
	stuff(pDevice,BLUE); //Drawing

     return pEndScene(pDevice);
}



/*Tools for Hooking by Gordon`*/
     bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)//by Gordon`
{
     for(;*szMask;++szMask,++pData,++bMask)
         if(*szMask=='x' && *pData!=*bMask)   return 0;
     return (*szMask) == NULL;
}
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)//by Gordon`
{
     for(DWORD i=0; i<dwLen; i++)
         if (bCompare((BYTE*)(dwAddress+i),bMask,szMask))  return (DWORD)(dwAddress+i);
     return 0;
}
DWORD GetAddressPtr(int index) //by Gordon`
{
  DWORD* VTableStart = 0;  
     DWORD dwDevicePointer = FindPattern((DWORD)GetModuleHandle(L"d3d9.dll"), 0x1280000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
     memcpy(&VTableStart, (void*)(dwDevicePointer+2), 4);
     return VTableStart[index];
} 
DWORD FindDevice(DWORD Len)//by Gordon`
{
     DWORD dwObjBase = 0;
         
     dwObjBase = (DWORD)LoadLibrary(L"D3D9.DLL");
     while (dwObjBase++ < dwObjBase + Len)
     {
         if ( (*(WORD*)(dwObjBase + 0x00)) == 0x06C7
           && (*(WORD*)(dwObjBase + 0x06)) == 0x8689
           && (*(WORD*)(dwObjBase + 0x0C)) == 0x8689
           ) { dwObjBase += 2; break; }
     }
     return( dwObjBase );
}

/*The Hook*/
void Hook()
{
     PDWORD VTable;
     *(DWORD*)&VTable = *(DWORD*)FindDevice(0x128000);
pEndScene = ( EndScene_ )DetourFunc((PBYTE) VTable[42],(PBYTE)EndScene, 5);//Hooking our endscene

Sleep( 100 ); 
}

/*DLL Main*/
int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
     CreateThread(0, 0, (LPTHREAD_START_ROUTINE) Hook, 0, 0, 0);//Starting our Hook
break;
}
return true;
}
Так вот, если эту дллку заинжектить в пв, через некоторое время пв начинает безбожно тормозить и в итоге вылетает. Если же вместо DrawMessage просто рисовать квадрат (закомментированный код), все происходит нормально. Подскажите, пожалуйста, в чем проблема.
  Ответить с цитированием
Старый 29.04.2012, 00:03   #2
 Разведчик
Аватар для zaparca
 
zaparca на правильном пути
Регистрация: 07.10.2010
Сообщений: 21
Популярность: 90
Сказал(а) спасибо: 14
Поблагодарили 15 раз(а) в 14 сообщениях
 
По умолчанию Re: dxd9

попробуй создавать шрифт только один раз при вызове текста ...
не знаю как С, но смысл такой
...
if font=0 then begin [создать шрифт] [font:=1] end;
[вывод текста]
...
при сбросе устройств опять выставляй в 0
________________
если я не ошибаюсь, а могу и ошибаться ...
too many actual parameters
  Ответить с цитированием
Старый 30.04.2012, 19:55   #3
 Разведчик
Аватар для xoraxax
 
xoraxax никому не известный тип
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: dxd9

Да, действительно, не освобождалась память. Спасибо, большое )

Последний раз редактировалось xoraxax; 01.05.2012 в 01:25. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 01.05.2012, 03:07   #4
 Пехотинец
Аватар для dwa83
 
dwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личностьdwa83 определенно авторитетная личность
Регистрация: 21.03.2012
Сообщений: 83
Популярность: 1178
Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
 
По умолчанию Re: dxd9

xoraxax, Почитай вот это Рисуем поверх графики в окне Perfect World. Интересны отзывы о данном способе, судя по всему никто ещё не попробовал.
________________
╔═╗
ˑ ˑ ╬ ╬
╚═╝
  Ответить с цитированием
Старый 01.05.2012, 09:54   #5
 Разведчик
Аватар для zaparca
 
zaparca на правильном пути
Регистрация: 07.10.2010
Сообщений: 21
Популярность: 90
Сказал(а) спасибо: 14
Поблагодарили 15 раз(а) в 14 сообщениях
 
По умолчанию Re: dxd9

Цитата:
Сообщение от dwa83Посмотреть сообщение
xoraxax, Почитай вот это Рисуем поверх графики в окне Perfect World. Интересны отзывы о данном способе, судя по всему никто ещё не попробовал.

через OpenGL-нет через DirectХ-да
________________
если я не ошибаюсь, а могу и ошибаться ...
too many actual parameters
  Ответить с цитированием
Старый 01.05.2012, 22:22   #6
 Разведчик
Аватар для xoraxax
 
xoraxax никому не известный тип
Регистрация: 07.04.2010
Сообщений: 9
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: dxd9

Пока меня вполне устраивает этот вариант. Кажется, он отлично работает. Хотя у вашего варианта, пожалуй, есть свои плюсы =)
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 01:55.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net