操作系统本身并不知道有没有键盘,他的win32子系统csrss.exe会在不停的在一个函数win32k!RawInputThread里寻找\Device\KeyboardClass0或\Device\KeyboardClass1(数字依次累加)。
那么KeyboardClass0、KeyboardClass1等又是怎么来的呢?
kbdclass是个upper filter驱动,只要有keyboard类的驱动加载,kbdclass就会自动attach到相应的设备堆栈上。kbdclass然后同时向底层的设备发送IOCTL_INTERNAL_KEYBOARD_CONNECT消息,意思是让底层设备记住一个回调函数。这样,底层设备(比如8042设备,中断得到一个键盘相应,就操作kdbdclass提供的回调函数,把键盘操作的事件插入到队列里)。csrss.exe的win32k!RawInputThread会不停的把事件取出来,然后转化成windows事件。