Листинг 10.21.
Установка (создание) ловушки
function InstallHook(wnd: HWND; spy: HWND): Boolean stdcall;
begin
//Открываем проекцию файла (области файла подкачки)
if not GetFileMapping() then
begin
//Не удалось спроецировать файл в память
InstallHook := False;
Exit;
end;
//Сохраняем данные, необходимые для работы ловушки
hook_info^.wnd := wnd;
hook_info^.spy_wnd := spy;
//Создаем ловушку
if (GetWindowThreadProcessId(wnd) <> 0)
then
hook_info^.hook_handle :=
SetWindowsHookEx(WH_CALLWNDPROC, WndProcHook,
hInstance, GetWindowThreadProcessId(wnd))
else
//Создание ловушки для потоков нашего приложения
//было бы фатальным
hook_info^.hook_handle := 0;
InstallHook := hook_info^.hook_handle <> 0;
//Освободим проекцию файла
ReleaseFileMapping();
end;
Функция InstallHook использует глобальную переменную-указатель hook_inf о, которая объявлена в модуле HookData. Функция GetFileMapping, также используемая в листинге 10.21, связывает указатель hookinf о с областью памяти, на которую проецируется файл. Соответственно, процедура ReleaseFileMapping отменяет проецирование файла в память (после этого использовать указатель hookinf о нельзя).
API-функция GetWindowThreadProcessId используется для определения идентификатора потока, создавшего наблюдаемое окно. Проверка неравенства значения, возвращенного этой функцией, нулю используется для того, чтобы в случае закрытия интересующего нас окна до запуска ловушки мы не начали следить за окнами приложения-шпиона.
Работу с проецируемым файлом в ловушке рассмотрим чуть позже. Сейчас же обратимся к функции удаления ловушки, реализация которой приводится в листинге 10.22.