DebugProc 配合 WH_DEBUG 鉤子類型,是一種特殊的診斷用鉤子。它在其他任何鉤子回調被呼叫之前先行執行,允許除錯器監控、記錄、甚至修改鉤子鏈的行為。
function DebugProc(
nCode: Integer; // 鉤子代碼
wParam: WPARAM; // 即將被呼叫的鉤子類型 (idHook)
lParam: LPARAM // 指向該鉤子回調參數的結構體
): LRESULT; stdcall;
HC_ACTION (0) 表示即將呼叫下一個鉤子;負值直接傳遞。WH_KEYBOARD=2, WH_MOUSE=7 等)。WH_KEYBOARD,則 lParam 指向包含 nCode, wParam, lParam 的結構。WH_DEBUG 需 SE_DEBUG_PRIVILEGE,普通應用通常無法安裝系統級 Debug 鉤子。unit DebugHookDemo;
interface
uses Windows;
var hDebugHook: HHOOK = 0;
function DebugProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var HookName: string;
begin
if nCode = HC_ACTION then
begin
// 將鉤子類型常數轉為可讀名稱
case wParam of
WH_MSGFILTER: HookName := 'WH_MSGFILTER';
WH_JOURNALRECORD: HookName := 'WH_JOURNALRECORD';
WH_JOURNALPLAYBACK: HookName := 'WH_JOURNALPLAYBACK';
WH_KEYBOARD: HookName := 'WH_KEYBOARD';
WH_GETMESSAGE: HookName := 'WH_GETMESSAGE';
WH_CALLWNDPROC: HookName := 'WH_CALLWNDPROC';
WH_CBT: HookName := 'WH_CBT';
WH_SYSMSGFILTER: HookName := 'WH_SYSMSGFILTER';
WH_MOUSE: HookName := 'WH_MOUSE';
WH_HARDWARE: HookName := 'WH_HARDWARE';
WH_DEBUG: HookName := 'WH_DEBUG (recursive!)';
WH_SHELL: HookName := 'WH_SHELL';
WH_FOREGROUNDIDLE: HookName := 'WH_FOREGROUNDIDLE';
WH_CALLWNDPROCRET: HookName := 'WH_CALLWNDPROCRET';
else HookName := Format('Unknown(%d)', [wParam]);
end;
OutputDebugString(PChar(Format('[DebugHook] Next hook: %s', [HookName])));
end;
Result := CallNextHookEx(hDebugHook, nCode, wParam, lParam);
end;
procedure InstallDebugHook(ThreadId: DWORD);
begin
hDebugHook := SetWindowsHookEx(WH_DEBUG, @DebugProc, HInstance, ThreadId);
end;
procedure UninstallDebugHook;
begin
if hDebugHook <> 0 then UnhookWindowsHookEx(hDebugHook);
end;
implementation
end.
WH_DEBUG 是「鉤子的鉤子」,極其強大但極其危險。僅供專業除錯工具、系統監控代理、安全軟體在受控環境使用。應用開發者應完全避開,改用上層框架提供的診斷機制。