Вывод текста в чужой Direct3D приложение (Игре)

Тема в разделе "WASM.DirectX", создана пользователем Argot, 18 янв 2008.

  1. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    Собсвено понадобилось мне в одной игре выводить текстовую информацию. Начал копать нашел статью. Сделал все как там описано все работает и весь принцип мне ясен. Но есть одно НО. В примере для HookApi используется MadHookApi и что все работало нужно чтоб был Запуще 1 exe файл, а это очень не удобно.
    Статья - http://tracker2k.kiev.ua/5.html.

    Поэтому переписал код по AdvHookApi.pas. Но сразу появились ошибки при создание метода CreateDevice.

    Собствено переделка заключалось в замене строки

    Код (Text):
    1. HookAPI('d3d9.dll', 'Direct3DCreate9', @Direct3DCreate9Callback, @Direct3DCreate9Next);
    2.  
    3.    на
    4.  
    5.   HookProc('d3d9.dll', 'Direct3DCreate9', @Direct3DCreate9Callback, @Direct3DCreate9Next);
    и этот хук ставится нормально и все работает нормально.
    но как только я ставлю хуки на методы так сразу появляются криты.

    Подскажите что я делаю не так, и как нужно делать ?

    Исходник с использование Демо MadHookApi
    Код (Text):
    1. library my_lib;
    2.  
    3. uses
    4.   SysUtils,
    5.   Classes,
    6.   madCodeHook,
    7.   Windows,
    8.   Direct3D9,
    9.   D3DX9;
    10.  
    11. {$R *.res}
    12.  
    13. var
    14.   D3DObj: IDirect3D9;
    15.   D3DDev: IDirect3DDevice9;
    16.   g_Font: ID3DXFont;
    17.  
    18. function GetInterfaceMethod(const intf; methodIndex: dword) : pointer;
    19. begin
    20.   result := pointer(pointer(dword(pointer(intf)^) + methodIndex * 4)^);
    21. end;
    22.  
    23. var EndScene9Next : function (self: pointer): HResult stdcall = nil;
    24. var CreateDevice9Next : function (self: Pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HRESULT stdcall = nil;
    25. var Direct3DCreate9Next: function (SDKVersion: LongWord): DWORD stdcall = nil;
    26.  
    27. function EndScene9Callback(self: pointer): HResult; stdcall;
    28. var
    29.   TextRect: TRect;
    30. begin
    31.   TextRect := Rect(100,100,100,100);
    32.  
    33.   g_Font.DrawTextA(
    34.     nil,
    35.     PChar('Превед!!! :)'),
    36.     -1,
    37.     @TextRect,
    38.     DT_LEFT or DT_NOCLIP,
    39.     D3DCOLOR_RGBA($00, $ff, $ff, $ff)
    40.   );
    41.  
    42.   Result:=EndScene9Next(self);
    43. end;
    44.  
    45. function CreateDevice9Callback(self: pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HRESULT; stdcall;
    46. var
    47.   F: TStrings;
    48.   A: Integer;
    49. begin
    50.   result := CreateDevice9Next(self, adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
    51.   D3DDev := ppReturnedDeviceInterface;
    52.   if (result = 0) then
    53.   begin
    54.     A := D3DXCreateFont(
    55.       D3DDev,
    56.       100,
    57.       0,
    58.       FW_BOLD,
    59.       1,
    60.       false,
    61.       DEFAULT_CHARSET,
    62.       OUT_DEFAULT_PRECIS,
    63.       ANTIALIASED_QUALITY,
    64.       DEFAULT_PITCH or FF_DONTCARE,
    65.       PChar('Arial'),
    66.       g_Font
    67.     );
    68.     HookCode(GetInterfaceMethod(ppReturnedDeviceInterface{^}, 42), @EndScene9Callback, @EndScene9Next);
    69.   end;
    70. end;
    71.  
    72. function Direct3DCreate9Callback(SDKVersion: LongWord): DWORD; stdcall;
    73. var
    74.   F: TStrings;
    75. begin
    76.   Result:=Direct3DCreate9Next(SDKVersion);
    77.   D3DObj := IDirect3D9(Result);
    78.   if (Result <> 0) then
    79.   begin
    80.     if (@CreateDevice9Next = nil) then
    81.       UnhookCode(@CreateDevice9Next);
    82.     HookCode(GetInterfaceMethod(result, 16), @CreateDevice9Callback, @CreateDevice9Next);
    83.   end;
    84. end;
    85.  
    86. begin
    87.   HookAPI('d3d9.dll', 'Direct3DCreate9', @Direct3DCreate9Callback, @Direct3DCreate9Next);
    88. end.
    Переделаный
    Код (Text):
    1. library my_lib;
    2.  
    3. uses
    4.   SysUtils,
    5.   Classes,
    6.   AdvHookApi,
    7.   Windows,
    8.   Direct3D9,
    9.   D3DX9;
    10.  
    11. {$R *.res}
    12.  
    13. var
    14.   D3DObj: IDirect3D9;
    15.   D3DDev: IDirect3DDevice9;
    16.   g_Font: ID3DXFont;
    17.  
    18. function GetInterfaceMethod(const intf; methodIndex: dword) : pointer;
    19. begin
    20.   result := pointer(pointer(dword(pointer(intf)^) + methodIndex * 4)^);
    21. end;
    22.  
    23. var EndScene9Next : function (self: pointer): HResult stdcall = nil;
    24. var CreateDevice9Next : function (self: Pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HRESULT stdcall = nil;
    25. var Direct3DCreate9Next: function (SDKVersion: LongWord): DWORD stdcall = nil;
    26.  
    27. function EndScene9Callback(self: pointer): HResult; stdcall;
    28. var
    29.   TextRect: TRect;
    30. begin
    31.   TextRect := Rect(100,100,100,100);
    32.  
    33.   g_Font.DrawTextA(
    34.     nil,
    35.     PChar('Превед!!! :)'),
    36.     -1,
    37.     @TextRect,
    38.     DT_LEFT or DT_NOCLIP,
    39.     D3DCOLOR_RGBA($00, $ff, $ff, $ff)
    40.   );
    41.  
    42.   Result:=EndScene9Next(self);
    43. end;
    44.  
    45. function CreateDevice9Callback(self: pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; out ppReturnedDeviceInterface: IDirect3DDevice9) : HRESULT; stdcall;
    46. var
    47.   F: TStrings;
    48.   A: Integer;
    49. begin
    50.   result := CreateDevice9Next(self, adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters, ppReturnedDeviceInterface);
    51.   D3DDev := ppReturnedDeviceInterface;
    52.   if (result = 0) then
    53.   begin
    54.     A := D3DXCreateFont(
    55.       D3DDev,
    56.       100,
    57.       0,
    58.       FW_BOLD,
    59.       1,
    60.       false,
    61.       DEFAULT_CHARSET,
    62.       OUT_DEFAULT_PRECIS,
    63.       ANTIALIASED_QUALITY,
    64.       DEFAULT_PITCH or FF_DONTCARE,
    65.       PChar('Arial'),
    66.       g_Font
    67.     );
    68.     HookCode(GetInterfaceMethod(ppReturnedDeviceInterface{^}, 42), @EndScene9Callback, @EndScene9Next);
    69.   end;
    70. end;
    71.  
    72. function Direct3DCreate9Callback(SDKVersion: LongWord): DWORD; stdcall;
    73. var
    74.   F: TStrings;
    75. begin
    76.   Result:=Direct3DCreate9Next(SDKVersion);
    77.   D3DObj := IDirect3D9(Result);
    78.   if (Result <> 0) then
    79.   begin
    80.     if (@CreateDevice9Next = nil) then
    81.       UnhookCode(@CreateDevice9Next);
    82.     HookCode(GetInterfaceMethod(result, 16), @CreateDevice9Callback, @CreateDevice9Next);
    83.   end;
    84. end;
    85.  
    86. begin
    87.   HookProc('d3d9.dll', 'Direct3DCreate9', @Direct3DCreate9Callback, @Direct3DCreate9Next);
    88. end.
    Знатоки очень нужна ваша помощь. Бьюсь уже 3 дня результат 0. Понял что нужно копать всторону HookApi, перерыл инет так ничего не нашел.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Argot
    Какие криты то? По исходнику помочь не смогу, паскалём не пользовался тыщу лет.
     
  3. Argot

    Argot New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2007
    Сообщения:
    14
    Что такое может бы хитрого в функции HookCode из колекции Mad`a ? что используя ее все работает нормально, используя AdvHookApi вылетает крит


    ГУРУ помогите новичку. Очень нужно. Как я понял AdvHookApi как то подругому вешает хуки на методы из за чего вылетает Крит. а МадХук работает норм но у меня только демо версия да и хотелось бы все уместить в 1 длл.

    Может есть у кого аналоги хуков МадХук . Можно на С++ или даже на Асме, но желательно на языве высокого уровня.