Q&A

  • DLL 모듈의 전역변수 초기화 문제
WH_GETMESSAGE를 이용해서 메모장으로 가는 WM_CHAR 메시지를 후킹하여 제거하는 모듈을 만들고 있습니다. 후킹함수를 심을 때(installKBSilentHook), 메모장의 핸들(정확히 말하면, 'Notepad'의 차일드인 'Edit'의 윈도우핸들)을 넘겨주고, 후킹콜백함수에서 WM_CHAR 메시지 발생시 MSG 레코드의 hwnd와 후킹함수를 심을 때 인자로 받아온 핸들을 비교하여 메모장에서 발생한 메시지인지 판별하고 있습니다.

그런데 이상하게 후킹함수를 심을 때 넘겨준 핸들을 hVideoware에 저장하는데, 정작 후킹콜백함수에서는 hVideoware가 0으로 초기화되어 버리더라구요..;; 궁여지책으로 후킹콜백에서 FindWindow로 메모장의 핸들을 얻는 방법도 있긴 합니만, 결국에 메모장이 아니라 다른 어플리케이션의 메시지의 후킹하고자 하는 거라서 ...

도움 부탁드립니다.



<!--CodeS-->
library KeyboardHook;

uses
  Windows, Messages;

var
  HKbHook : HHOOK;
  HVideoware : HWND;

function KBHook(code : Integer; wParam : WPARAM; lParam : LPARAM): LongInt; stdcall;
begin
  if code >= 0 then begin
    if (PMsg(lParam)^.message = WM_CHAR) then begin
      if HVideoware = 0 then
        MessageBox(0,'Hvideoware =0','message',MB_OK);
      
      if (HVideoware = PMsg(lParam)^.hwnd)  then begin
        PMsg(lParam)^.message := WM_NULL;
        Result := 0;
        Exit;
      end;
    end;
  end;

  Result := CallNextHookEx(HKbHook, code, wParam, lParam);
end;

function installKBSilentHook(hVideoware : HWND) : Boolean; exports;
begin

  HKbHook := SetWindowsHookEx(WH_GETMESSAGE, KBHook, HInstance, 0);
  HVideoware := hVideoware;

  if HKbHook > 0  then
    Result:= true
  else
    Result:= false;

end;

function uninstallKBSilentHook : Boolean; exports;
begin
  if HKbHook <> 0 then begin
    Result := UnhookWindowsHookEx(HKbHook);
  end else begin
    Result := false;
  end;
end;

procedure Process_Attach;
begin
end;

procedure Process_Detach;
begin
end;

procedure EntryPointProc(Reason : Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH : Process_Attach;
    DLL_PROCESS_DETACH : Process_Detach;
    DLL_THREAD_ATTACH: {};
    DLL_THREAD_DETACH: {};
  end;
end;

Exports
installKBSilentHook,
uninstallKBSilentHook,


begin
  DllProc := @EntryPointProc;
  EntryPointProc(DLL_PROCESS_ATTACH);
end.



<!--CodeE-->
1  COMMENTS
  • Profile
    타락천사 2007.04.27 15:33
    hVideoware 값을 파일이나 레지스트리에 저장해 놓으세요..