在win32k中存在一个单向链表,这个链表中保存着当前子系统下的所有快捷键,保存这个单向链表的头的全局变量为_gphkFirst,这个全局变量在_RegisterHotKey、IsHotKey等函数中有使用。
下面是我在xp下逆向分析出的这个链表的结构:
typedef struct _HOTKEY
{
PVOID Win32Thread;
ULONG gptiCurrent;
UINT fsModifiers;
UINT vk;
int hkId;
struct _HOTKEY *pNext
}HOTKEY,HOTKEY
其中Win32Thread对应_KTHREAD结构中的Win32Thread,可以用导出函数PsGetThreadWin32Thread得到;
gptiCurrent是win32k中表示当前线程状态的一个变量,不大清楚。
gptiCurrent是表示这个快捷键是CTRL、SHIFT还是其它
vk表示组合的另一个键,这个以及其它几个可以查MSDN的RegisterHotKey函数。