窗口与线程
前言前一篇,弄清楚了消息队列与线程的关系,简单来说就是,一个GUI线程对应一个消息队列。什么是GUI,什么是消息队列,参考这里,本篇不再赘述。本篇将解决以下3个问题:
消息从哪里来?
消息到哪里去?
谁来做这些事情?
消息从哪里来进入正题,首先讨论消息从哪里来。
鼠标消息、键盘消息
这张图源于 ...
消息队列
前言在初级班时曾学习过Win32相关API的用法,可以自己编写一些窗口界面,向窗口发送消息实现交互。但仍然有些问题是无法回答的:
什么是窗口句柄?在哪里?有什么用?
什么是消息?什么是消息队列?消息队列在哪?
什么是窗口过程?窗口过程是谁调用的?没有消息循环窗口过程会执行吗?
为什么要有w32k ...
缺页异常
前言本篇学习缺页异常,缺页异常属于习惯叫法,本身是指与页相关的异常处理机制。
什么是缺页异常在学习PDE、PTE属性时介绍过P位,只有当PDE与PTE的P位均为1时,物理页才有效。当CPU访问一个地址,如果其PTE的P位为0,此时会产生缺页异常。缺页异常发生时,通过中断描述符表的e号中断进行处理。
...
物理内存的管理
前言前面3篇文章,以线性地址的角度认识了地址空间的管理与分配;本篇则以物理内存的角度来看地址的管理情况,在介绍段、页时,学习了不少关于页的知识,也有必要作为参考:
10-10-12分页
PDE-PTE属性
页目录表、页表基址
基址小实验(10-10-12)
逆向分析MmIsAddressValid ...
Mapped Memory
前言前一个学习私有内存(Private Memory),本篇学习与之相对的映射内存(Mapped Memory),回顾之前见到过的进程Vad树,会发现Mapped Memory总是占据绝大部分。
仅有少数,例如存储函数与局部变量的栈,malloc申请的堆,属于私有内存,其它情况下,大部分都是映射 ...
Private Memory
前言对于内存空间有两种描述方式,一种是物理内存的角度,所有地址只分为两类,挂了物理页的地址与没有挂物理页的地址,其属性由PDE/PTE决定。另一种是线性地址的角度,分为私有内存与映射内存。前者,在介绍段、页时已有了解,近来这几篇主要是从线性地址的角度,来学习内存空间。本篇就来学习其中的一种类型,私有 ...
线性地址的管理
前言本篇开始,进一步学习与物理页相关的内存管理知识。关于页的知识,在介绍段、页时已学习过一部分基础,可以参考以下链接:
10-10-12分页
PDE-PTE属性
页目录表、页表基址
基址小实验(10-10-12)
逆向分析MmIsAddressValid(10-10-12)
2-9-9-12分页
...
未处理异常
前言根据前面学习的VEH,SEH,编译器对SEH的扩展等内容,我们对一个异常的处理过程了解更加深入,以用户异常为例,它进入0环后会交予KiDispatchException函数处理,该内核函数会对异常进行分发,若内核调试器与用户调试器都不存在或不处理,则会临时返回3环,交予3环的异常处理函数KiUs ...
局部展开与全局展开
前言前一篇学习了try_except块的实现过程,了解了编译器是如何将多个try_except块的内容集中在一个SEH块上的,以及异常发生时_except_handler3函数是如何找到对应的异常处理函数的。本篇将学习在编译器扩展SEH基础上的另一个格式:try_finally块。
_try_fin ...
_try_except本质
前言前一篇学习了,Windows平台的编译器了扩展了SEH,通过try_except块简化了挂入SEH的过程。本篇就来研究一下编译器是如何通过try_except将异常挂入SEH链表的。本篇依旧在Windows XP系统下的Visual C++6.0编译器上进行实验。
_try_except实现细节 ...