Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2012, 18:56   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Выгрузка библиотеки через DLL_PROCESS_DETACH

Здравствуйте, уважаемые!

Хукаю вызовы D3D функций библиотекой внедряемой, но при завершении работы приложения вылетает ошибка.
Хотелось бы её избежать.

Код:
library newera;
uses
  Windows,
  classes,
  Direct3D9,
  DXTypes,
  D3DX9,
  SysUtils, Dialogs,
  advApiHook in 'advApiHook.pas',
  NativeAPI in 'NativeAPI.pas',
  aL2Hooks in 'aL2Hooks.pas'{,
  clsMenuEngine in 'clsMenuEngine.pas'};

var
  g_Font  : ID3DXFont;
  TextRect: TRect;
  StridesN: integer;

  EndScene9Next : function (self: pointer): HResult stdcall = nil;
  CreateDevice9Next: function (self: pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; 
BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; 
out ppReturnedDeviceInterface: IDirect3DDevice9): HResult; stdcall = nil;
  Direct3DCreate9Next: function (SDKVersion: LongWord): DWORD stdcall = nil;
  ResetNext      : function (self: pointer; const pPresentationParameters: TD3DPresentParameters): HResult; stdcall;
  SetStreamSourceNext     : function (self: pointer; StreamNumber: LongWord; pStreamData: IDirect3DVertexBuffer9; 
OffsetInBytes, Stride: LongWord): HResult; stdcall;

  D3DDev: IDirect3DDevice9;

function DummyFunc(Param:DWORD):DWORD;
begin
  Result := Param;
end;

function SetStreamSourceCallback(self: pointer; StreamNumber: LongWord; pStreamData: IDirect3DVertexBuffer9; 
OffsetInBytes, Stride: LongWord): HResult; stdcall;
begin
  StridesN := Stride;
  result  := SetStreamSourceNext(self,StreamNumber,pStreamData,OffsetInBytes, StridesN);
end;

function ResetCallback(self: pointer; const pPresentationParameters: TD3DPresentParameters): HResult; stdcall;
begin
  g_Font.OnLostDevice;
  result:= ResetNext(self,pPresentationParameters);
  if( SUCCEEDED(result) ) then g_Font.OnResetDevice;
end;

function EndScene9Callback(self: pointer): HResult; stdcall;
begin
  g_Font.DrawTextA(nil,PChar('Some Text'),-1,@TextRect,DT_LEFT or DT_NOCLIP,D3DCOLOR_ARGB(255,255,0,0));
  Result:=EndScene9Next(self);
end;

// Вызывается один раз, при создании девайса.
function CreateDevice9Callback(self: pointer; Adapter: LongWord; DeviceType: TD3DDevType; hFocusWindow: HWND; 
BehaviorFlags: DWord; pPresentationParameters: PD3DPresentParameters; 
out ppReturnedDeviceInterface: IDirect3DDevice9): HResult; stdcall;
begin
  Result :=CreateDevice9Next(self,Adapter,DeviceType, hFocusWindow,BehaviorFlags,
pPresentationParameters,ppReturnedDeviceInterface);
  D3DDev := ppReturnedDeviceInterface;
  // Создаем шрифт
  if (result = 0) then begin
    TextRect:=Rect(100,100,100,100);  //Координаты верхнего левого угла
    D3DXCreateFont(ppReturnedDeviceInterface, 15 ,0,FW_LIGHT,1,
False,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,6,DEFAULT_PITCH or FF_DONTCARE,
PChar('Tahoma'),g_Font);
    HookCode(GetInterfaceMethod(ppReturnedDeviceInterface, 42), @EndScene9Callback, @EndScene9Next);
  end;

  HookCode(GetInterfaceMethod(ppReturnedDeviceInterface, 16), @ResetCallback, @ResetNext);
  HookCode(GetInterfaceMethod(ppReturnedDeviceInterface, 100),@SetStreamSourceCallback, @SetStreamSourceNext);
end;

function Direct3DCreate9Callback(SDKVersion: LongWord): DWORD; stdcall;
begin
  Result:=Direct3DCreate9Next(SDKVersion);
  if (Result <> 0) then begin
    if (@CreateDevice9Next <> nil) then UnhookCode(@CreateDevice9Next);
    HookCode(GetInterfaceMethod(result, 16), @CreateDevice9Callback, @CreateDevice9Next);
  end;
end;

procedure DLLEntryPoint(dwReason:DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: begin
      HookProc('d3d9.dll', 'Direct3DCreate9', @Direct3DCreate9Callback, @Direct3DCreate9Next);
    end;
    DLL_PROCESS_DETACH: begin
      if (@CreateDevice9Next <> nil) then UnhookCode(@CreateDevice9Next);
      if (@EndScene9Next <> nil) then UnhookCode(@EndScene9Next);
      if (@SetStreamSourceNext <> nil) then UnhookCode(@SetStreamSourceNext);
      if (@ResetNext <> nil) then UnhookCode(@ResetNext);
      UnhookCode(@Direct3DCreate9Next);
    end;
  end;
end;

exports DummyFunc;

begin
  DllProc:= @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Ошибка во вложении.

Подскажите, пожалуйста, что я делаю не правильно?
Сам код работает "на ура", а вот завершить не могу.
Хуки вроже как снимаю все...
Изображения
Тип файла: jpg 1.jpg (28.3 Кб, 69 просмотров)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось rpy3uH; 24.08.2012 в 12:49.
Johnson вне форума Ответить с цитированием
Старый 20.08.2012, 19:37   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Хех, не знаете как делается отладка DLL?
Ставите breakpoint где надо, затем меню Run => Attach to process....

А дальше все будет хорошо.
Человек_Борща вне форума Ответить с цитированием
Старый 20.08.2012, 21:25   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Дык... И где тут поставить бряк, чтоб отследить что происходит ПОСЛЕ DLL_PROCESS_DETACH?

Пробовал вызывать ShowMessage в конце детача, он вызывается, и уже после этого происходит ошибка, где-то через секунду...

Это во-первых. А во-вторых, библиотеку нужно присоединять до инициализации D3D, то есть сразу после запуска.

А в-третьих, LineageII запрещает свой запуск под дебагером, как выяснилось.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 20.08.2012 в 21:45.
Johnson вне форума Ответить с цитированием
Старый 20.08.2012, 21:42   #4
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Щас подгрузил в тестовое приложение, использующее D3D.
Поставил бряк после детача.
Весь код детача происходит нормально, а вот дальше, после того как сделаешь шаг после последнего вызова УнХука - ошибка.

Дебагер дает возможность брякнуть эту ошибку, однако я не знаю ассемблера совсем.

В аттаче выложил свой код и тестовое приложение...
Помогите, пожалуйста, разобраться.

Папка DX - заголовки D3D, их нужно описать в компиляторе.
Deutsch Gothic.ttf - шрифт, пока не делал его подгрузку в систему, установите в ручную, или в коде поменяйте на Tahoma.
DirectX.exe - тестовая прога, которая просто инициализирует D3D.

PS: Извиняюсь. Приложение скидывал без либы D3D, и с правленными таблицами импорта (принудительно грузит newera.dll)... Во втором аттаче чистое.
Вложения
Тип файла: rar d3d9.dll TEST.rar (839.1 Кб, 17 просмотров)
Тип файла: rar Приложение.rar (1.02 Мб, 13 просмотров)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 20.08.2012 в 21:48.
Johnson вне форума Ответить с цитированием
Старый 20.08.2012, 21:42   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А зачем на рабочем экземпляре чушь пороть? Перите любую мелкую программу, которая исп. перехватываемую API, и там практикуйте.

Ну значит логи, логи, логи... Пусть dll пишет в файл.
Ну или MadExcept, EurekaLog, FastMM...
Человек_Борща вне форума Ответить с цитированием
Старый 20.08.2012, 21:50   #6
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Блин. Библиотека не должна ни чего делать после детача.
Код детача проходит нормально, без ошибок.
ЧТО будет писать лог после детача (в котором он должен освободиться)?

Я скинул мелкую прогу и код... Помогите решить проблему, пожалуйста...

PS: Можно было бы, конечно, взять D3D приложение с исходником, и там уже отследить дальнейшие действия... Но в D3D я вообще "не в зуб ногой"... =(
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 20.08.2012 в 21:56.
Johnson вне форума Ответить с цитированием
Старый 20.08.2012, 22:03   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В D3D ни алё, в ассемблере не алё. Ну чо, называй сумму тогда.

(это шутка была. А смысл её был в том, что сначала надо бы знания подтянуть, а уж потом говнокодить).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.08.2012, 22:16   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Обозначить сумму я тебе давеча предлагал, ты "тактично" отказался, так что не сарказничай
По поводу "подтягивай знания"... Я это и пытаюсь сделать, но нет ни времени на теорию, ни умения зубрить её. Приходится только методом проб и ошибок, экспериментов и курения чужого кода...
А по поводу "говнокодить"... Вспомни начало своей програмистской карьеры... Прямо-таки с первого раза начал писать идеальный код?

Вместо того, чтоб постить 2485-е сообщение бесполезным, лучше бы ткнул носом в проблему или в источник информации по ней...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 20.08.2012 в 22:20.
Johnson вне форума Ответить с цитированием
Старый 20.08.2012, 22:31   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ну ты же понимаешь, что когда человек не алё, то это именно тебе придётся дебажить проект, исправлять ошибки и писать правильный код, а не ему. Я таким иногда занимаюсь, но тут лениво. Особенно когда у тебя отсутствует воспроизводимый тест-кейс.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 20.08.2012, 22:40   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Есть мнение что ошибки в функция Hook'а. И вам нужно отладчиком скакать вместо ошибки.
Я бы пореккомендовал опробовать EasyHook, на его основе ещё что-то развивается какраз в стороеу хуков DX,GL и прочего грфического. Ваши сабжи исжили себя давно.

Судя по ошибке, ВАШи дествия вызывают глюки в работе совсем р. библиотеки. Реккомендую читать доки по вылавливаемым API.

Последний раз редактировалось Человек_Борща; 20.08.2012 в 22:42.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выгрузка из БД в Excel fenetka Microsoft Office Excel 6 20.10.2011 09:06
Зависимость библиотеки от библиотеки ds.Dante C# (си шарп) 2 07.07.2011 12:55
Выгрузка в Word ZapraBwiK Общие вопросы Delphi 0 26.05.2011 11:29
Выгрузка из текстовика mephist Microsoft Office Excel 2 06.08.2009 17:25
Выгрузка данных в ComboBox через ZQuery barcelona БД в Delphi 1 08.05.2007 03:35