2.内核回调机制

有谁调用了窗口过程?

  1. GetMessage()在处理SentMessagesListHead中消息时
  2. DispatchMessage(&msg)在处理其他队列中的消息时
  3. CreateWindow() 0环的一些代码也会调用窗口过程,但它没有发消息给队列而是直接调用窗口过程(KeUserModeCallback)

NtUserCreateWindowEx()这样设计是因为,如果你程序需要在窗口创建就做一些事情但窗口没创建出来它接收不了消息,它刚好就能帮你解决,WM_CREATE就是它在你创建窗口出来之前就会被调用

KeUserModeCallback的执行流程

  1. 从0环调用3环函数的几种方式:
    APC、异常、内核回调

  2. 凡是有窗口的程序就有可能0环直接调用3环的程序。回调机制中0环调用3环的的代码是函数:KeUserModeCallback

  3. 回到3环的落脚点:
    APC:ntdll!KiUserApcDispatcher
    异常:ntdll!KiUserExceptionDispatcher

  4. 内核回调在3环的落脚点:
    KeUserModeCallback()

所有的消息机制都是通过这个函数回3环

NTSTATUS KeUserModeCallback (
      IN ULONG ApiNumber,
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值