Por que minha Hook de monitoração de mensagens não funciona!

Delphi

30/04/2004

Eu fiz a seguinte Hook:

 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

Maxwell_monteiro

Curtidas 0

Respostas

Nildo

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

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

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

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
POSTAR