Бывалый

Профиль
Группа: Участник
Сообщений: 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?
|