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-10 17:48:00) [21]

Проверил свои знания по отладке и определился, что перва ошибка возникает при выходе из функции runstophook() в library hook. А вторая - при выходе из функции out_func() в хос- процессе; Но эти ошибки возникаю только тогда, когда я снимаю ловушку.


KygECHuK   (2006-05-10 17:25:00) [22]

По всякому, например:
а. Можно поставить BreakePoint - F5
b. Mожно выполнять операторы построчно F7 или F8


Сергей М.   (2006-05-10 17:18:00) [23]

Галиматья.

Рассказывай как ты пользуешь отладчик ...


KygECHuK   (2006-05-10 17:13:00) [24]

Я то же извеняюсь, просто по данным отладчика ошибки возникают непосредственно после выполнения функции, может быть их источник находится в другом месте программы или ОС. Известно одно - проект готов и работает кроме этого места.


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

KygECHuK ©   (10.05.06 16:34) [16]


> Ошибка возникает после удаления ловушки, а именно две ошибки
> доступа к памяти


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


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

Удалено модератором


KygECHuK   (2006-05-10 16:34:00) [27]

>> А откуда она может здесь выскакивать ? UnhookWindowsHook исключений не возбуждает, переменная SysHook всяко доступна для чтения/записи...

Ошибка возникает после удаления ловушки, а именно две ошибки доступа к памяти. Затем при вызове функции Application.ProcessMessages в любом другом приложении происходит его зависание. Что то с Message`ами не то.


KygECHuK   (2006-05-10 16:26:00) [28]

функция выполняет команду следующим образом:
выделяет из команды название целевой библиотеки, провереят если библиотека не была подключена - подключает, иначе работает с подключенной библиотекой, библиотека выгружается только при поступлении соответсвующей команды. Далее происходит вызов функции из подключенной библиотеки и бла бла бла...


Игорь Шевченко   (2006-05-10 15:55:00) [29]


> try
>        UnhookWindowsHookEx(SysHook);
>        SysHook := 0;
>        Result := true;
>      except
>                   // Ошибка выскакивает вот здесь
>      end;  
>    


А откуда она может здесь выскакивать ? UnhookWindowsHook исключений не возбуждает, переменная SysHook всяко доступна для чтения/записи...


Сергей М.   (2006-05-10 15:45:00) [30]

Хрень какая-то ..
Экзекутор какой-то ..

Ты вообще-то  в состоянии ТЗ привести ?


KygECHuK   (2006-05-10 14:42:00) [31]

>> Сей термин - чушь.
 учту, спасибо

вот хост-процесс :


.
.
TStd_Func = procedure(Command: pchar; Adr: PChar; Size:word; var Res: PChar; var OutSize:integer);stdcall;
.
.
.
procedure executer(Comm: Pchar; var Back: Pointer; var size: integer);
var
 sizeInL   : Integer;
 DllIndex  : Integer;
 lpLibrary : Pointer;
 lpCommand : Pointer;
 lpParams  : Pointer;
 DllHandle : THandle;
 ResString : String;
begin
 buff_deploy(Comm, size, lpLibrary, lpCommand, lpParams);
 DllIndex  := DllArrFinder(PChar(lpLibrary));
 if DllIndex = -1 then
 begin
   DllHandle := LoadLibrary(Pchar(pchar(lpLibrary) + '.dll'));
   if dllhandle = 0 then
   begin
     ResString := 'library  "' + pchar(lpLibrary) + '"  not found';
     size := length(ResString) + 1;
     ReallocMem(Back, size);
     CopyMemory(Back, Pchar(ResString), size);
     exit;
   end;
   DllArrAdd(PChar(lpLibrary), DllHandle);
 end else
   DllHandle := DllArr[DllIndex].DllHandle;

 if pchar(lpCommand) = 'FreeDll' then
 begin
   DllArrDelete(DllArrFinder(pchar(lpLibrary)));
   FreeLibrary(DllHandle);
   ResString := 'Library  "' + Pchar(lpCommand) + '"  not found';
   size := length(ResString) + 1;
   ReallocMem(Back, size);
   CopyMemory(Back, Pchar(ResString), size);
   exit;
 end;

 @out_func := GetProcAddress(DllHandle, 'DefaultFunction');
 if @out_func = nil then
 begin
   ResString := 'function  "' + Pchar(lpCommand) + '"  not found';
   size := length(ResString) + 1;
   ReallocMem(Back, size);
   CopyMemory(Back, Pchar(ResString), size);
   exit;
 end;
 sizeInL := size - cardinal(lpParams) + cardinal(comm);
 out_func(lpCommand, lpParams, sizeInL, Pchar(back), size);
end;


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


> Хост-библиотеки :
>


Сей термин - чушь.

"Хост" может быть лишь приложением (точнее - процессом) , но никак не библиотекой.

Ну и где код обращения хост-процесса к сей библ-ке ?


KygECHuK   (2006-05-10 14:21:00) [33]

Итак описание "Болезни":
Сама по себе ловушка снимается, что свидетельствует не выполнеие CallBack функции, но с очередью сообщений твариться что то странное.
ошибка доступа к памяти два раза подряд указывает, что происходит чтение по адрессу 000000, я предполагаю, что происходит обращение к освобождённой памяти, два раза.  

Вот кусок Хост-библиотеки :


library hookF;
.
.
.
var
 function  runstophook(Hook : Boolean) : Boolean; stdcall; external 'W1N.dll' index 1
 procedure GetDLLData(var AGlobalData: pdllldata);stdcall; external 'mapping.dll' name 'GetDLLData';
.
.
.
procedure DefaultFunction(command: pchar; adr: Pointer; size: word; var res: pointer; var outsize: integer);stdcall;export;
.
.
.
 if command = 'run hook' then
 begin
   if HookIsRunning  then
   begin
     runstr:='HOOK already runing';
   end else
   begin
     if not FileExists(DenitedList) then
     begin
       outsize := StringToResult('list is absend', res, @alloCkated);
       exit;
     end;
     init := TIniFile.Create(ReloadList);
     init.WriteString('hook', 'command', 'hook|run hook');
     init.Free;

     GetDLLData(lpdlldata);
     fillchar(lpdlldata^.data, sizeof(lpdlldata^.data), #0);
     AssignFile(f, DenitedList);
     Reset(f);
     i := 0;
     while not eof(f) do
     begin
       readln(f, lpdlldata^.data[i]);
       inc(i);
     end;
     CloseFile(f);
     if  i <= 0 then
     begin
       outsize := StringToResult('list is absend', res, @alloCkated);
       exit;
     end;
     if runstophook(true) then
     begin
       runstr := command + ' - ok';
       HookIsRunning := true;
     end else
     begin
       runstr:='can not create hook';
     end;
   end;
   outsize := StringToResult(pchar(runstr), res, @alloCkated);
   exit;
 end;

 if command = 'stop hook' then
 begin
   if HookIsRunning then
   begin
     init := TIniFile.Create(ReloadList);
     init.WriteString('hook', 'command', 'hook|run hook');
     init.Free;
     if runstophook(false) then
     begin
       runstr := command + ' - ok';
       HookIsRunning := false;
     end;
   end else runstr:='hook is not running';
   outsize := StringToResult(pchar(runstr), res, @alloCkated);
   exit;
 end;
 outsize := StringToResult('Command not found', res, @alloCkated);
end;

exports DefaultFunction;
begin


По сути происходит лишь вызов функции runstophook() на этом прямое обращение к библитеке с ловушки исчерпывается.


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


> Dstr ©   (10.05.06 14:08) [8]


Спасибо, взяли тебя "на заметку".


Dstr   (2006-05-10 14:08:00) [35]

Если вы говорите про ApiHook то кому надо стучитесь в Асю 209-298-286 и я вам все расскажу,я уже связывался давно с етой темой,и нашел Pas файлы с функциями в инете


Сергей М.   (2006-05-10 13:01:00) [36]

Значит проблема в хост-приложении, устанавливающем/снимающем этот глоб.хук


KygECHuK   (2006-05-10 12:53:00) [37]

Применил - не получилось WHY ?


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(lpdlldata^.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;
var
 lpdlldata : pdllldata;
begin
 getdlldata(lpdlldata);
 Result := false;
 if Hook then
 begin
   if SysHook = 0 then
    SysHook := SetWindowsHookEx(WH_CBT{WH_CALLWNDPROC}, @SysMsgProc, HInstance, 0);
    lpdlldata^.SyShook := SysHook;
   Result := (SysHook <> 0);
 end else
 begin
   if SysHook <> 0 then
   begin
     try
       UnhookWindowsHookEx(lpdlldata^.Syshook);
       lpdlldata^.SyShook := 0;
       Result := true;
     except

     end;
   end;
 end;
end;

exports
 SETHOOK index 1;

begin
end.


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

Если так, то правильно.


KygECHuK   (2006-05-10 11:21:00) [39]

В моей программе уже используется библиотека с FileMapping. функция  getdlldata получает указатель на адресс расшаренной памяти. Как я понимаю в структу, которая хранится по этому адрессу мне нужно добавить поле для хранения переменной syshook и использовать её значение, всякий раз при вызове CallNextHookEx() и UnhookWindowsHookEx(). Я правильно понимаю ?


Сергей М.   (2006-05-10 10:41:00) [40]

см. CreateFilemapping + MapViewOfFile


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

Наверх

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