为了简单起见,此处记录的都是 SetWindowsHookEx 函数的执行流程,对于 SetWindowsHook 函数来说,它是前者的一个功能子集,即只能创建作用于调用线程自身范围的钩子。
1、申请一个钩子对象
2、设置钩子对象内的被钩挂目标线程,设置为空则为系统钩子
3、取得当前已经存在的钩子链头,若果是系统钩子则该信息存放于桌面对象内,否则存放于线程对象内
4、将钩子对象置于链首
5、将钩子对象地址通过变换转换为句柄返回
全局钩子还要做一些额外的工作,要检查传入的模块句柄和钩子回调函数地址,计算出函数在模块中的偏移以备在其他进程中使用,还需要记录模块映像的全路径以便在其他进程中自动加载。