Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук на DirectX, Windows 7. 
:(
    Опции темы
CynicRus
Дата 11.6.2014, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Приветствую уважаемых форумчан. Хочу хукнуть EndScene в DX9, и нарисовать там что-нибудь. Использую Delphi XE3 + заголовки DX, что идут в комплекте с Delphi.

Пробую следующим способом (код библиоткеки):
Код

var

  Direct3DCreate9Next: function (SDKVersion: LongWord): DWORD stdcall = nil ;
  CreateDevice9Next   : function (self: Pointer; Adapter: LongWord;
        DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord;
        pPresentationParameters: PD3DPresentParameters;
        out ppReturnedDeviceInterface: IDirect3DDevice9) : dword; stdcall = nil;
 EndScene9Next : function (self: pointer): HResult stdcall = nil;

//*******/

//Указатель на функцию
function GetInterfaceMethod(const intf; methodIndex: dword) : pointer;
begin
  result := pointer(pointer(dword(pointer(intf)^) + methodIndex * 4)^);
end;

//Печать текста
procedure DrawText(x1,y1: integer; Color: D3DCOLOR;str:string);
begin
    TextRect := Rect(x1,y1,x1,y1);
    g_Font.DrawTextA(
    nil, PAnsiChar(str),
    -1, @TextRect,
    DT_LEFT or DT_NOCLIP,
   Color
  );
end;

function EndScene9Callback(self: pointer): HResult; stdcall;
begin

            DrawText(100,50,D3DCOLOR_XRGB(0,0,0),'Строка ');
            DrawText(100,100,D3DCOLOR_XRGB(255,0,0),'Счётчик кадров '+IntToStr(frames));
            DrawLine(100,150,250,150,D3DCOLOR_XRGB(0,255,0),3);
            DrawRectangle(100,200,250,300, D3DCOLOR_XRGB(0,0,255),2);
            DrawPointList(7,D3DCOLOR_XRGB(255,255,255),1);
            DrawEllipse( D3DCOLOR_XRGB(255,255,255),1);

    frames:= frames+1;
  Result:=EndScene9Next(self);
end;
//перехват CreateDevice9
function CreateDevice9Callback(self: pointer; Adapter: LongWord; DeviceType: TD3DDevType;
  hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters;
  out ppReturnedDeviceInterface: IDirect3DDevice9) : dword; stdcall;
  begin



  result := CreateDevice9Next(self, adapter, DeviceType, hFocusWindow, BehaviorFlags,
    pPresentationParameters, ppReturnedDeviceInterface);
  D3DDev := ppReturnedDeviceInterface;
  if (result = 0)  and (@EndScene9Next = nil) then begin

  D3DXCreateLine(D3DDev, line);
   D3DXCreateFont(
      D3DDev, 20, 0, FW_BOLD, 1,
      false, DEFAULT_CHARSET,
      OUT_DEFAULT_PRECIS,
      ANTIALIASED_QUALITY,
      DEFAULT_PITCH or FF_DONTCARE,
      PChar('Arial'),
      g_Font
    );



MypointsList[0]:=   D3DXVector2.Create(100,400);
MypointsList[1]:=   D3DXVector2.Create(150,350);
MypointsList[2]:=   D3DXVector2.Create(200,350);
MypointsList[3]:=   D3DXVector2.Create(250,400);
MypointsList[4]:=   D3DXVector2.Create(200,450);
MypointsList[5]:=   D3DXVector2.Create(150,450);
MypointsList[6]:=   D3DXVector2.Create(100,400);
CreateEllipse(100,500,250,600);

     //перехват EndScene
     HookProc(GetInterfaceMethod(ppReturnedDeviceInterface, 42),
     @EndScene9Callback, @EndScene9Next);
    // EndScene9Next:=InterceptCreate(GetInterfaceMethod(ppReturnedDeviceInterface, 42),@EndScene9Callback);

  end;

end;
//перехват Direct3DCreate9
function Direct3DCreate9Callback(SDKVersion: LongWord): DWORD; stdcall;
begin
  Result:=Direct3DCreate9Next(SDKVersion);
  if (Result <> 0) then
  begin
    if (@CreateDevice9Next <> nil) then
      Unhook(@CreateDevice9Next);
    //HookProc(@CreateDevice9Callback, @CreateDevice9Next);
    HookInterface(result, 16,@CreateDevice9Callback, @CreateDevice9Next);
  end;
end;



procedure EntryPoint(Reason: dword);
var
 Status: Dword;
begin
  if Reason = DLL_PROCESS_ATTACH then
  begin
   if not HookProcInModule('d3d9.dll', 'Direct3DCreate9', @Direct3DCreate9Callback, @Direct3DCreate9Next) then
    MessageBox(0,'Hook Failed!','HookUtils',0) else MessageBox(0,'Direct3DCreate hooked!','hooker',0);
  end;
end;

begin
  DLLProc := @EntryPoint;
  EntryPoint(DLL_PROCESS_ATTACH);
end.



Собственно - после инжекта в процесс я вижу, что произошёл хук:
Direct3DCreate hooked!. Через ProcessExplorer я вижу что библиотека к процессу прицепилась. Но далее - ни одного вызова функций моей библиотечки не происходит. Если же, я делаю отложенную загрузку exe - то библиотека инжектится, и всё - тишина. Даже 
Код

 MessageBox(0,'Hook Failed!','HookUtils',0) else MessageBox(0,'Direct3DCreate hooked!','hooker',0);
 не отрабатывает. Для хука использую: эту библиотеку

Что я не так делаю? Может быть у кого есть рабочий пример хука DX для юникодных дельфей + win 7?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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