有谁调用了窗口过程?
- GetMessage()在处理SentMessagesListHead中消息时
- DispatchMessage(&msg)在处理其他队列中的消息时
- CreateWindow() 0环的一些代码也会调用窗口过程,但它没有发消息给队列而是直接调用窗口过程(KeUserModeCallback)
NtUserCreateWindowEx()这样设计是因为,如果你程序需要在窗口创建就做一些事情但窗口没创建出来它接收不了消息,它刚好就能帮你解决,WM_CREATE就是它在你创建窗口出来之前就会被调用
KeUserModeCallback的执行流程
-
从0环调用3环函数的几种方式:
APC、异常、内核回调 -
凡是有窗口的程序就有可能0环直接调用3环的程序。回调机制中0环调用3环的的代码是函数:KeUserModeCallback
-
回到3环的落脚点:
APC:ntdll!KiUserApcDispatcher
异常:ntdll!KiUserExceptionDispatcher -
内核回调在3环的落脚点:
KeUserModeCallback()
所有的消息机制都是通过这个函数回3环
NTSTATUS KeUserModeCallback (
IN ULONG ApiNumber,