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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 18:18   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию И опять проблема с хуками. Приложение само закрывается

Всем привет.
В общем экспериментирую тут с hook-ами. Лог ведётся в файлу подкачки, а потом сбрасывается в файл.

Почему-то потом иногда вылетает приложение, на которое переходит фокус после снятия hook-а

Код не очень большой и сконцентрирован в DLL
Код:
library hookDll;


uses
  messages, windows, dialogs,
  sysUtils;

var
hHook: tHandle;

hFileMapping: tHandle = 0;
pBuffer: pointer = nil;
hSyncMutex: tHandle;

const
fileMappingName = '124CC6D5-3E64-4E91-9DBE-748E388CAC12';
bufferSize = 1024 * 1024 * 10;
syncMutexName = 'BE8DFB58-2599-4148-9DC0-02B05C4DA0B2';

function hookFunc(nCode, wParam, lParam: dword): dword; stdCall;
var
oldBufferSize: cardinal;
newBufferAddress: pointer;
newBufferSize: cardinal;

tempStr: string;
tempStrSize: cardinal;

mouseInfo: pMouseHookStruct;
begin
   result := callNextHookEx(0, nCode, wParam, lParam);
   if nCode = HC_ACTION then
   begin
      if (wParam = WM_LBUTTONDOWN) and (not (pBuffer = nil)) then
      begin
         waitForSingleObject(hSyncMutex, 1000);

         mouseInfo := pMouseHookStruct(lParam);

         oldBufferSize := dword(pBuffer^);
         newBufferAddress := pointer(dword(pBuffer) + oldBufferSize + 4);

         tempStr := 'X: '+intToStr(mouseInfo.pt.X)+'; Y: '+intToStr(mouseInfo.pt.Y)+';'+#13;
         tempStrSize := length(tempStr) * sizeOf(char);

         copyMemory(newBufferAddress, pChar(tempStr), tempStrSize);
         dword(pBuffer^) := oldBufferSize + tempStrSize;

         releaseMutex(hSyncMutex);

         postMessage(findWindow(nil, 'Hook server'), WM_USER + 1, mouseInfo.pt.X, mouseInfo.pt.Y);
      end;
   end;
end;

procedure saveBuffer(const aBuffer: pointer);
var
hFile: thandle;
bytesWrited: cardinal;

timeStr: string;
timeStrSize: cardinal;
begin
   hFile := createFile('C:\Documents and Settings\Admin\Рабочий стол\logFile.txt', GENERIC_READ or GENERIC_WRITE, 0, nil, 
      OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
   setFilePointer(hFile, 0, 0, FILE_END);

   timeStr := formatDateTime('[yyyy.mm.dd - hh:nn:ss (zzz)]'+#13#10, date+time);
   timeStrSize := length(timeStr) * sizeOf(char);
   writeFile(hFile, timeStr[1], timeStrSize, bytesWrited, 0);

   writeFile(hFile, pointer(dword(aBuffer) + 4)^, dword(aBuffer^), bytesWrited, 0);
   closeHandle(hFile);
end;

function setHook(const unhook: boolean): boolean; stdCall;
var
hMappedFile: tHandle;
bytesWrited: cardinal;
begin
   if unhook then
   begin
      unhookWindowsHookEx(hHook);

      saveBuffer(pBuffer);

      unMapViewOfFile(pBuffer);
      closeHandle(hFileMapping);
      closeHandle(hSyncMutex);

      pBuffer := nil;
      hFileMapping := 0;
      hSyncMutex := 0;
   end
   else
   begin
      hFileMapping := createFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, bufferSize, fileMappingName);
      pBuffer := mapViewOfFile(hFileMapping, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, bufferSize);
      hSyncMutex := createMutex(nil, false, syncMutexName);

      hHook := setWindowsHookEx(WH_MOUSE, @hookFunc, hInstance, 0);
   end;
end;

exports setHook name 'setHook';

procedure DLLEntryPoint(dwReason:DWord);
begin
   case dwReason of
   DLL_PROCESS_ATTACH:
      if hFileMapping = 0 then
      begin
         hFileMapping := openFileMapping(FILE_MAP_WRITE or FILE_MAP_READ, false, fileMappingName);
         if hFileMapping <> 0 then
            pBuffer := mapViewOfFile(hFileMapping, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, bufferSize);

         hSyncMutex := openMutex(MUTEX_ALL_ACCESS, false, syncMutexName);
      end;
   DLL_PROCESS_DETACH:
      begin
         if pBuffer <> nil then
            unMapViewOfFile(pBuffer);
         if hFileMapping <> 0 then
            closeHandle(hFileMapping);

         if hSyncMutex <> 0 then
            closeHandle(hSyncMutex);
      end;
   end;
end;

begin
   dllProc:= @DLLEntryPoint;
   dLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Из EXE-шника только запускается setHook
Вложения
Тип файла: rar HOOHKING.rar (603.1 Кб, 13 просмотров)

Последний раз редактировалось Altera; 13.03.2010 в 18:34.
Altera вне форума Ответить с цитированием
Старый 14.03.2010, 12:21   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

потому-что возвращаемая структура tfnhookproc имеет вид
Код:
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall
ну а...
Код:
type
  LRESULT = Longint;
программисты борланда опять знаковый тип использовали.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.03.2010, 12:41   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
потому-что возвращаемая структура tfnhookproc имеет вид
Код:
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall
ну а...
Код:
type
  LRESULT = Longint;
программисты борланда опять знаковый тип использовали.
Нет, блин, один чёрт, всё равно глючит
Altera вне форума Ответить с цитированием
Старый 14.03.2010, 12:58   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

А может из-за юнита dialogs? Если его убрать из uses работает как-бы без глюков. А что, он то хоть и прибавляет вес программе, чем мешает то?
Altera вне форума Ответить с цитированием
Старый 14.03.2010, 13:19   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...попробовал раз двадцать, пока не вылетает, может статистики не набрал ...ось xp sp2, среда компиляции delphi6 ...может у вас антивирь какой мешает?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.03.2010, 15:07   #6
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...попробовал раз двадцать, пока не вылетает, может статистики не набрал ...ось xp sp2, среда компиляции delphi6 ...может у вас антивирь какой мешает?
Вылетает, у меня, после снятия хука, видемо при сообщении двойного щелчка. Попробуй, после того как отключишь хук, сразу же и как можно быстрее щёлкай по рабочему столу или каким нить окнам. Ну, не всегда вылетает. Ну, раз может 2 из 5. (если dialogs включён в uses библиотеки). C первого раза не всегда вылетает. Ну можно не закрывая программы опять хук поставить, пощёлкать, снять и опять быстро быстро пощёлкать. И так несколько раз.

Последний раз редактировалось Altera; 14.03.2010 в 15:09.
Altera вне форума Ответить с цитированием
Старый 14.03.2010, 16:11   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

так и не добился... Но добился ошибки как на скрине, когда чисто случайно второй раз нажал на кнопку "unhook", что вполне понятно ...может у вас "дребезг" контактов кнопки мышки проявился
Изображения
Тип файла: jpg Копировать из новый-2.jpg (15.6 Кб, 104 просмотров)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.03.2010, 12:20   #8
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Знаю, было такое, но щас нету.

Код:
function unHook: boolean; stdCall;
begin
   if hWinHook = 0 then exit;
   
   unhookWindowsHookEx(hWinHook);
   hWinHook := 0;

   saveBuffer(pBuffer);

   unMapViewOfFile(pBuffer);
   closeHandle(hFileMapping);
   closeHandle(hSyncMutex);

   pBuffer := nil;
   hFileMapping := 0;
   hSyncMutex := 0;
end;
Altera вне форума Ответить с цитированием
Старый 15.03.2010, 12:21   #9
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Знаю, было такое, но щас нету.

Код:
function unHook: boolean; stdCall;
begin
   if hWinHook = 0 then exit;
   
   unhookWindowsHookEx(hWinHook);
   hWinHook := 0;

   saveBuffer(pBuffer);

   unMapViewOfFile(pBuffer);
   closeHandle(hFileMapping);
   closeHandle(hSyncMutex);

   pBuffer := nil;
   hFileMapping := 0;
   hSyncMutex := 0;
end;
Altera вне форума Ответить с цитированием
Старый 15.03.2010, 12:45   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

попробовал уже на работе, xp sp3... not ...что за ось у вас?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Каким может быть алгоритм Wa_sja Общие вопросы по программированию, компьютерный форум 5 28.02.2010 20:43
Как такое может быть??? lennon Общие вопросы C/C++ 4 21.10.2009 03:10
Может быть так, что в мамку может попасть вирус и не загружать жесткий диск Berzhan Операционные системы общие вопросы 6 27.07.2009 21:40
Что такое может быть? vasek123 Свободное общение 3 14.04.2009 19:13