Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы со снятием ловушки


Страницы:   1 2 3

KygECHuK ©   (2006-05-10 09:22:00) 

При снятии ловушки прроиходит ошибка доступа памяти:



library W1N;

uses
 Windows,
 SySUtils,
 Messages,
 typeunit;
var
 SysHook  : HHook   = 0;
 flag     : boolean = true;
 Password : word    = 0;
 Wnd      : Hwnd    = 0;
procedure GetDLLData(var AGlobalData: pdllldata);stdcall; external 'mapping.dll' name 'GetDLLData';

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
var
 lpdlldata : pdllldata;
 i         : dword;
 str       : String;
begin
 getdlldata(lpdlldata);
 Result := CallNextHookEx(SysHook, Code, wParam, lParam);
 case code of
   HCBT_CREATEWND:
   begin
     Str := TCBTCreateWnd(Pointer(lParam)^).lpcs.lpszName;
     if TCBTCreateWnd(Pointer(lParam)^).lpcs.hwndParent <> 0 then exit;
     if str = '' then exit;
     i:=0;
     while lpdlldata^.data[i] <> '' do
     begin
       if lpdlldata.data[i] = str then
       begin
         try
           result:=1;
           break
         except
         end;
       end;
       Inc(i);
     end;
   end;
 end;
end;

function SetHook(Hook : Boolean) : Boolean; export; stdcall;
begin
 Result := false;
 if Hook then
 begin
   if SysHook = 0 then
    SysHook := SetWindowsHookEx(WH_CBT{WH_CALLWNDPROC}, @SysMsgProc, HInstance, 0);
   Result := (SysHook <> 0);
 end else
 begin
   if SysHook <> 0 then
   begin
     try
       UnhookWindowsHookEx(SysHook);
       SysHook := 0;
       Result := true;
     except
                  // Ошибка выскакивает вот здесь
     end;  
   end;
 end;
end;

exports
 SETHOOK index 1;

begin
end.


KygECHuK   (2006-05-12 11:28:00) [1]

>> 1. Где и когда тобой загружается/выгружается mapping.dll ?

В [6] и [10] это экспортируемая функция GetDllData.

>> Зачем вообще выносить работу с MMF в отдельную библ-ку, когда это
>> можно делать непосредственно в каждой из конкретныхразрабатываемых
>> тобой хук-библиотек ?

Тоже вариант, но по каким-то причинам выбор пал именно на такой способ реализации, я уже не помню. Попробую собрать функционал в одну библиотеку, но мне кажется причина ошибок не в этом.

>> 2. Откуда в USES взялся ShareMem ?

Сам в шоке, спасибо - убрал.


Сергей М.   (2006-05-12 10:27:00) [2]

1. Где и когда тобой загружается/выгружается mapping.dll ? Зачем вообще выносить работу с MMF в отдельную библ-ку, когда это можно делать непосредственно в каждой из конкретных разрабатываемых тобой хук-библиотек ?

2. Откуда в USES взялся ShareMem ?


KygECHuK   (2006-05-12 09:52:00) [3]

Вполне возможно, вот код библиотеки с расшареной памятью:


library mapping;

uses
 ShareMem,
 Windows,
 typeunit;

const

 cMMFileName: PChar = 'SharedMapData';

var
 GlobalData: pdllldata;
 MapHandle: THandle;

procedure GetDLLData(var AGlobalData: pdllldata); stdcall;
begin
 AGlobalData := GlobalData;
end;

procedure OpenSharedData;
var
 Size: Integer;
begin
 Size := SizeOf(TDLLData);
 MapHandle := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0,size,
   cMMFileName);

 GlobalData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, size);

 if GlobalData = nil then
 begin
   CloseHandle(MapHandle);
 end;
end;

procedure CloseSharedData;
begin
 if GlobalData <> nil then
   UnmapViewOfFile(GlobalData);
 if MapHandle <> 0 then
   CloseHandle(MapHandle);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenSharedData;
   DLL_PROCESS_DETACH: CloseSharedData;
 end;
end;

exports
 GetDLLData;

begin

 DllProc := @DLLEntryPoint;

 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


Сергей М.   (2006-05-12 09:39:00) [4]

Есть еще одно подозрение - на момент вызова UnhookWindowsHookEx(lpdlldata^.Syshook) параметр lpdlldata содержит инвалидные данные (указатель на уже несуществующую MMF-область памяти)


KygECHuK   (2006-05-12 09:15:00) [5]

В ходе тестирования команда выгрузки не посылается вообще, а вообще, взаимодейсткие с другими библоитеками происходит без ошибок.


Сергей М.   (2006-05-12 08:43:00) [6]

Все таки есть подозрение, что выгрузка хост-процессом хук-библиотеки происходит раньше чем вызов StopHook


KygECHuK   (2006-05-11 17:08:00) [7]

lpCommand это различные комманды для разных библиотек. Набор параметров функции DefaultFunction(), стандартен для всех библиотек и разработчик может использовать любые команды в своей библиотеке. В данном случае это run hook и stop hook для установки и снятия ловушки и прочие.


Сергей М.   (2006-05-11 16:51:00) [8]


> exit


Угу, вижу.

Какие еще варианты содержимого lpCommand (кроме 'FreeDll') подразумеваются ?


KygECHuK   (2006-05-11 16:45:00) [9]

В команде FreeDll есть процедура exit. А вообще, библиотек много.


Сергей М.   (2006-05-11 16:39:00) [10]

В твоем Экзекутере вызов out_func() происходит безусловно всякий раз когда этот Экзекутер вызывается тобой. Даже если перед этим по команде 'FreeDll' библиотека lpLibrary была выгружена.

Как сие понимать ?


KygECHuK   (2006-05-11 16:19:00) [11]

Ошибки доступа памяти - да.


Сергей М.   (2006-05-11 15:56:00) [12]

Исключение возникает в контексте именно хост-процесса ?


KygECHuK   (2006-05-11 15:11:00) [13]

>> Остается загадкой, что же такое творится в out_func() ..

Она же DefaultFunction() в [10]


Сергей М.   (2006-05-11 14:58:00) [14]

http://www.google.ru/search?q=%D0%94%D0%B5%D0%BB%D1%84%D0%B8+%D0%B3%D0%BB%D0%BE%D0%B1%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D1%85%D1%83%D0%BA&hl=ru&lr=&start=10&sa=N


Сергей М.   (2006-05-11 14:54:00) [15]


> при выходе из функции out_func() в хос- процессе


Остается загадкой, что же такое творится в out_func() ..


KygECHuK   (2006-05-11 14:43:00) [16]

я уже перенес весь функционал в одну библиотеку- не помогло

>> Показывай код хост-приложения, устанавливающего/снимающего хук

я уже показал код библитеки в [10], функция runstophook() она же SetHook() в [6]  устанавливает/снимает хук


Игорь Шевченко   (2006-05-11 13:17:00) [17]

Lamer@fools.ua ©   (11.05.06 12:50) [24]

Архангельский рулез фарева ?


Сергей М.   (2006-05-11 13:05:00) [18]

"Кхм" на сабж влиять не должно


Lamer@fools.ua   (2006-05-11 12:50:00) [19]

> function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;

Кхм...


Сергей М.   (2006-05-11 08:32:00) [20]

Показывай код хост-приложения, устанавливающего/снимающего хук


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо