![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы со снятием ловушки
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]Показывай код хост-приложения, устанавливающего/снимающего хук