hao对《深入解析Windows操作系统》的笔记(51)
-
第34页 概念和工具
windows API包括几千个可调用的函数 1.基本服务 2.组件服务 3.用户界面服务 4.图形和多媒体服务 5.消息和协作 6.网络 7.Web服务 关于.NET和WinFX
.NET框架的组件之间的关系(类似系统分层): .NET/WinFX应用程序(标准的用户模式exe) 用户模式(托管代码) 框架类库程序集(标准的用户模式DLL) ----------------------------------------------------------------------------------------- CLR DLL(COM服务器) 用户模式(非托管代码) windows API DLLs ----------------------------------------------------------------------------------------- 内核模式 windows内核
服务,函数和例程
进程,线程和作业
工具:http://www.sysinternals.com的进程管理器来查看相关信息
纤程与线程
内核模式与用户模式
工具:利用QuickSlice来查看线程活动情况。 TIPS:用户到内核的切换本身不会影响线程的调度-------模式转换并不是环境切换。 终端服务以及多个会话
对象和句柄
-
第66页 系统架构
操作系统模型
总体结构 四种基本的用户模式进程:
windows内核模式的组件包含以下部分:
windows核心系统文件 Ntoskrnl.exe--------------执行体和内核 Hal.dll-------------------硬件抽象层 win32k.sys-------------windows子系统的内核模式部分 Ntdll.dll-----------------内部支持函数,以及执行体函数的系统服务分发存根 kernel32.dll,User32.dll,gdi32.dll,advapi32.dll--------------windows核心子系统dll windows主要通过以下两种方法实现可移植性:
对称多处理
对称多处理------处理器中没有主处理器,操作系统和用户线程可以被调度到任何一个处理器上运行。所有的处理器共享惟一的内存空间。 非对称多处理-----操作系统选择其中一个处理器来执行操作系统内核代码,而其它的处理器只运行用户代码。所有的处理器共享惟一的内存空间。 超线程和NUMA
windows有几个关键的系统文件分单独的单处理器版本和多处理器版本。在安装windows的时候,安装程序将正确的文件选择出来,并且拷贝到本地的\windows\system32目录中。 可伸缩性 以下一些特性在windows成功的成为一个多处理器系统起到了关键作用:
windows还发布客户版本和服务器版本,每个版本细节上有差异。服务器版本在吞吐量方面做了优化。客户版本针对互交式桌面用途下的响应时间做了优化。 关键的系统组件 环境子系统和子系统DLL
工具:depends.exe可以查看可执行映像的子系统类型 当一个应用程序调用子系统DLL中的某个函数时,可能会发生下述三件事情之一:
windows子系统 由以下几个主要的组件构成:
POSIX子系统
OS/2子系统
Ntdll.dll 主要用于子系统dll。包含两种类型的函数: 1.系统服务分发存根,它们会调用windows执行体系统服务 2.内部支持函数,供子系统,子系统dll以及其他的原生映像文件使用
执行体 windows执行体是Ntoskrnl.exe中的上层(内核是其下层)。执行体包含以下函数:
执行体包含了以下的主要组件:
windows执行体还包含四组主要的支持函数,以上的执行体组件也会用到这些支持函数。设备驱动程序也要用到它们:
内核
-
第84页 系统架构
内核对象
硬件支持
硬件抽象层(HAL)
设备驱动程序
设备驱动程序运行与内核模式下,位于以下三种执行环境之一:
设备驱动程序有以下几种类型:
windows驱动程序模型 从WDM的角度有以下三种驱动:
工具:通过msinfo32查看已安装的驱动程序 TIPS:在关键的系统文件查看导出符号或全局符号的名字是非常有启发的,有些接口并未文档化,很可能会有变化。不应该(不鼓励)调用这些函数接口。 一些执行体组件常用的大多数函数名前缀: Cc--------高速缓存管理器 Cm-------配置管理器 Ex--------执行体支持例程 FsRtl---------文件系统驱动程序运行库 Hal-------------硬件抽象层 Io----------------I/O管理器 Ke-------------内核 Lpc-------------本地过程调用 Lsa-------------本地安全权威 Mm------------内存管理器 Nt-------------windows系统服务(大部分被导出的windows函数) Ob-----------对象管理器 Po------------电源管理器 Pp------------pnp管理器 Ps-------------进程支持 Rtl-------------运行库 Se-------------安全性 Wmi------------windows管理规范 Zw------------以Nt开头的系统服务入口点的镜像,它把原来的访问模式设置为内核模式,从而消除了参数的有效检查过程,因为Nt服务只有当原来的访问模式为用户模式才进行参数检查 系统进程 以下的系统进程会出现在每一个windows系统上(其中空闲进程和System进程并不是完整的进程,因为它们并不是在运行一个用户模式的可执行文件):
System进程和系统线程
TIPS:当诊断或者检查一个系统的时候,若能够将单独的系统线程的执行过程映射到驱动程序中,甚至映射到包含该代码的子例程中,一定非常有用。 工具:Pviewer.exe显示线程的启动地址 --------------------------------------------------------------------------------------------- 会话管理器
--------------------------------------------------------------------------------------- winlogon,LSASS和userinit
服务控制管理器
工具:控制面板中的管理工具,选择服务。查看当前安装的服务
-
第100页 系统机制
陷阱分发
中断和异常的区别
中断分发
硬件中断处理
x86中断控制器
x64中断控制器
IA64中断控制器
SAPIC和APIC的区别
软件中断请求级别
(用!irql 命令来查看IRQL)
将中断映射到IRQL
预定义的IRQL
中断对象
(检查中断内部,执行!idt命令找到相关设备驱动的ISR例程,执行dt nt!_kinterrupt + 地址的命令查看关联的中断对象)
-
第119页 系统机制
软件中断
分发或延迟过程调用(DPC)中断
异步过程调用(APC)中断
异常分发
未处理的异常
(实验:查看windows线程真正的用户启动地址。Tlist工具) 这些内部启动函数的一般代码如下:
void win32StartofProcess(LPTHREAD_START_ROUTINE lpStartAddr, LPVOID lpvthreadParm) { __try{ DWORD dwThreadExitCode = lpStartAddr( lpvthreadParm); ExitThread(dwThreadExitCode); }__except(UnhandleExceptionFilter(GetExceptionInformation())){ ExitProcess(GetExceptionCode()); } }
windows错误报告
-
第124页 系统机制
系统服务分发 32位系统服务分发
64位系统服务分发
内核模式的系统服务分发
服务描述符表
-
第149页 系统机制
对象管理器
(用winobj查看windows内核对象)
执行体对象
(暴露给windows API的执行体对象-------符号链接,进程,线程,作业,内存区,文件,访问令牌,事件,信号量,互斥体,定时器,IO完成,键,窗口站,桌面。) 对象结构
对象头和对象体
类型对象
(类型对象的属性:类型名称,池类型,默认的配额花费,访问类型,通过访问权限的映射关系,同步,方法) 对象方法
(对象管理器支持的方法:Open,Close,Delete,Quary Name,Pares,Security)
对象句柄和进程句柄表
对象安全性
对象保持力
资源记账
对象名称
对象目录
符号链接
-
第166页 系统机制
同步
高IRQL的同步
互锁操作
自旋锁
排队的自旋锁
(查看全局排队自旋锁 !qlocks) 低IRQL的同步
内核分发器对象
等待分发器对象
如何确定对象的信号状态
数据结构
typedef struct _DISPATCH_HEADER{ UCHAR Type; UCHAR Absolute; UCHAR Size; UCHAR INserted; LONG SignalState; LIST_ENTRY WaitListHead; }DISPATCH_HEADER; typedef struct _KWAIT_BLOCK{ LIST_ENTRY WaitListEntry; struct _KTHREAD *RESTRICTED_POINTER Thread; PVOID Object; struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock; USHORT WaitKey; USHORT WaitType; }KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
(实验:查看等待队列 !thread !process) 快速互斥体和受限互斥体
执行体资源
(实验:列出已获得的执行体资源 !locks) 压栈锁
-
第182页 系统机制
系统辅助线程
系统辅助线程有3种类型:
(使用 !exqueue命令来查看系统辅助线程列表) windows全局标志
( !gflags & !gflag来查看NtGlobalFlag内核变量的状态) 本地过程调用(LPC)
(!lpc命令来查看lpc端口对象)
设计LPC的目地是为了实现一下3种交换消息的方法:
尽管LPC只使用一种对象类型,但是它有以下几种端口:
LPC的典型用法如下:
内核事件跟踪
如果一个应用程序用到ETW,那么,它必然是以下三类中的某一类或同属于多类:
可用于内核记录器的痕迹类,以及产生每一事件类的组件包括: 1.磁盘I/O 2.文件I/O 3.硬件配置 4.映像加载/卸载 5.页面错误 6.进程创建/删除 7.线程创建/删除 8.注册表活动 TCP/UDP活动 WOW64
以下列方式实现:
WOW64进程地址空间布局结构
系统调用
异常分发
用户回调 WOW64截取了所有从内核到用户模式的回调。WOW64将这样的调用也按照系统调用来对待;然而,数据转换则是按照相反的顺序来完成:输入参数从64位转换为32位,而输出参数则是在该回调函数从32位返回到64位时被转换。 文件系统重定向
注册表的重定向和反射
-
第196页 管理机制
注册表
查看和修改注册表
注册表用法 配置数据主要在三个时间点被读取:
注册表数据类型
注册表逻辑结构 总共6个根键(不能添加新的根键,也不能删除已有的根键):
注册表的问题诊断
(用Regmon软件来查看监视注册表,分析问题)
hao的其他笔记 · · · · · · ( 全部427条 )
- P2P网络技术原理与C++开发案例
- 5
- 大话移动通信
- 1
- 图解网络硬件
- 1
- 写给大家看的C++书
- 1
- Orange'S
- 1
- 虚拟机
- 1
- 大规模C++程序设计
- 10
- Linux Shell脚本攻略
- 3
- HTTP权威指南
- 3
- C++ API设计
- 8
- C++语言的设计和演化
- 5
- 构建嵌入式LINUX系统
- 3
- 七周七语言
- 15
- 链接器和加载器
- 1
- Windows网络与通信程序设计
- 2
- Windows核心编程(第5版)
- 16
- C++GUI Qt4编程
- 3
- 图解TCP/IP (第5版)
- 12
- Python学习手册
- 5
- 编写可读代码的艺术
- 14
- 你一定爱读的极简欧洲史
- 2
- 短码之美
- 1
- 程序员的自我修养
- 17
- 美国纽约摄影学院摄影教材(上)
- 2
- Win32多线程程序设计
- 8
- 竹林蹊径
- 4
- 鸟哥的Linux私房菜
- 4
- Linux/Unix设计思想
- 6
- 程序设计语言的形式语义
- 1
- Windows驱动开发技术详解
- 9
- 你必须知道的495个C语言问题
- 5
- Windows内核原理与实现
- 44
- PCI Express 体系结构导读
- 3
- 程序员的数学
- 5
- 深入浅出 MFC 第二版
- 2
- 并发的艺术
- 4
- 群和它的图象表示
- 1
- C语言接口与实现
- 1
- 致命元素
- 2
- Linux C编程一站式学习
- 13
- 淘宝技术这十年
- 1
- 高效程序的奥秘
- 1
- 花田半亩
- 1
- 于丹:重温最美古诗词
- 1
- 诛仙8(大结局)
- 1
- 深入理解计算机系统(原书第2版)
- 9
- C和指针
- 9
- 寒江独钓
- 5
- Windows程序设计
- 9
- 数据结构与算法分析
- 11
- 80X86汇编语言程序设计教程
- 3
- 琢石成器
- 30
- 数学分析教程
- 1
- 操作系统概念(第六版)
- 12
- 算法竞赛入门经典
- 10
- C++反汇编与逆向分析技术揭秘
- 12