Por que minha Hook de monitoração de mensagens não funciona!
Eu fiz a seguinte Hook:
Quando eu chamo o InstallHook o retorno de SetWindowsHookEx diz que a hook foi instalada com sucesso no entanto quando se chama o UnHookWindowsHookEx ele não acha mais a hook sem contar que nada é gravado no arquivo de log. Alguem sabe qual o problema neste código?
library HookMonitor; uses Windows, SysUtils, Messages; const HOOK_INSTALLED_FAILED=0; HOOK_INSTALLED_OK=1; HOOK_ALREADY_INSTALLED=2; HOOK_UNINSTALLED_FAILED=0; HOOK_UNINSTALLED_OK=1; HOOK_NOT_INSTALLED=2; MAX_TYPES = 11; var HookHandle: HHOOK; FileHandle: TextFile; HookInstalled: boolean; HookTypesCode: array [0..MAX_TYPES] of integer = (WH_CALLWNDPROC, WH_CALLWNDPROCRET, WH_CBT, WH_DEBUG, WH_GETMESSAGE, WH_JOURNALPLAYBACK, WH_JOURNALRECORD, WH_KEYBOARD, WH_MOUSE, WH_MSGFILTER, WH_SHELL, WH_SYSMSGFILTER); HookTypesStr: array [0..MAX_TYPES] of PChar = (´WH_CALLWNDPROC´, ´WH_CALLWNDPROCRET´, ´WH_CBT´, ´WH_DEBUG´, ´WH_GETMESSAGE´, ´WH_JOURNALPLAYBACK´, ´WH_JOURNALRECORD´, ´WH_KEYBOARD´, ´WH_MOUSE´, ´WH_MSGFILTER´, ´WH_SHELL´, ´WH_SYSMSGFILTER´); function FindHookType(HookType: integer): integer; var i: integer; begin Result := -1; for i := 0 to MAX_TYPES do begin if(HookTypesCode[i] = HookType)then begin Result := i; break; end; end; end; function DebugProc(nCode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; var HookTypeIndex: integer; begin HookTypeIndex := FindHookType(wParam); if(HookTypeIndex >= 0)then WriteLn(FileHandle, TimeToStr(Time) + ´ ´ + HookTypesStr[HookTypeIndex]); Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); end; function InstallHook: integer; begin if(HookInstalled)then Result := HOOK_ALREADY_INSTALLED else begin HookHandle := SetWindowsHookEx(WH_DEBUG, @DebugProc, HInstance, 0); if(HookHandle <> 0)then begin HookInstalled := True; AssignFile(FileHandle, ´log.txt´); Rewrite(FileHandle); Result := HOOK_INSTALLED_OK; end else Result := HOOK_INSTALLED_FAILED; end; end; function UninstallHook: integer; begin if(HookInstalled)then begin Result := Ord(UnHookWindowsHookEx(HookHandle)); if(Result = HOOK_UNINSTALLED_OK)then begin HookInstalled := False; CloseFile(FileHandle); end; end else Result := HOOK_NOT_INSTALLED; end; function IsHookInstalled: boolean; begin Result := HookInstalled; end; exports InstallHook, UninstallHook, IsHookInstalled; begin HookInstalled := False; end.
Quando eu chamo o InstallHook o retorno de SetWindowsHookEx diz que a hook foi instalada com sucesso no entanto quando se chama o UnHookWindowsHookEx ele não acha mais a hook sem contar que nada é gravado no arquivo de log. Alguem sabe qual o problema neste código?
Maxwell_monteiro
Curtidas 0
Respostas
Nildo
30/04/2004
AssignFile(FileHandle, ´log.txt´);
Talvez ele esteja criando em um outro local...
AssignFile(FileHandle, ´[b:90083de436]c:\[/b:90083de436]log.txt´);
Tenta colocar assim.
Outra coisa Você vai precisar usar um TRtlCriticalSection para usar o Log. Pois e se duas coisas acontecerem ao mesmo tempo? Vai dar pau no arquivo. O CriticalSection não deixa isso acontecer, enquanto uma thread estiver executando o que esta dentro de um CriticalSection, a outra fica no aguardo até que esta termine. É só uma dica, não é algo que vai fazer funcionar seu programa.
GOSTEI 0
Nildo
30/04/2004
Outra coisa, não se esqueça que você deve ABRIR,ALTERAR e SALVAR o arquivo a cada operação e n ão abrir ele em um lugar e ir adicionando as coisas. Pois seu arquivo está aberto em uma Thread por um Handle. Em outra threa, esta Handle não estará mais acessivel, resultando em algo que não adicionara NADA ao arquivo. Para testar melhor sua DLL, coloque vários MessageBox ao invez de logar em arquivo, mas só para testar para ver se está funcionando. Não utilize ShowMessage pois é suicidio utilizar VCL em ThreadSafe (DLL de Hook normalmente é)
GOSTEI 0
Maxwell_monteiro
30/04/2004
Eu fiz um teste como vc sugeriu Nildo ou seja tirei as rotinas de tratamento de arquivo e coloquei a exibição de um MessageBox no meu Hook mas não funcionou! ele está dando o mesmo problema, a funcao SetWindowsHookEx retorna sinal de sucesso mas na verdade parece que nenhuma referencia a minha hook foi gravada na HookChain, tanto que o UnHookWindowsHookEx continua a não achar a Hook previamente instalada.
GOSTEI 0
Nildo
30/04/2004
Coloca o bloco de código do seu executavel, que faz a instalação deste hook pra mim dar uma analisada. Outra coisa... Você está hookando a mensagem HW_DEBUG, eu não sei exatamente ´quando´ ela é chamada. Tente trocar por um do tipo... WH_KEYBOARD só pra ver se não é esse o problema. Mas acho que o problema está na instalação, já que você está instalando na instancia HInstance (que pertence a DLL) sendo que deveria pertencer a alguma Thread de algum outro executavel
GOSTEI 0