Windows内核原理与实现
文章平均质量分 81
maomao171314
这个作者很懒,什么都没留下…
展开
-
进程结构体EPROCESS
1、进程结构体EPROCESS每个windows进程在0环都有一个对应的结构体:EPROCESS 这个结构体包含了进程所有重要的信息。kd> dt _EPROCESS +0x000 Pcb : _KPROCESS +0x078 ProcessLock : _EX_PUSH_LOCK +0x080 CreateTime : _LARGE_INTEGER +0x088 ExitTime : _LARG...原创 2021-02-01 14:01:17 · 2306 阅读 · 0 评论 -
分析句柄表
一、什么是句柄当一个进程创建或者打开一个内核对象时,将获得一个句柄,通过这个句柄可以访问内核对象。如:CreateMutex、CreateEvent 、CreateThread 等函数就会返回一个HANDLE类行值,这种就叫句柄,对应着一个内核对象。调用CloseHandle 函数对应某个内核对象计数减一,当内核对象计数为0,这个对象就被销毁了。内核对象在内核存储,直接把地址给3环用很不安全,所以微软设计了句柄(HANDLE)给3环使用,句柄是一个整数,它的值除以4是句柄表的下标,通过下标能原创 2021-01-31 22:07:39 · 279 阅读 · 0 评论 -
Windows 内核(WRK)编译
引子WRK是微软于 2006 年针对教育和学术界开放的Windows内核的部分源码,WRK(Windows Research Kernel)也就是Windows研究内核,在WRK中不仅仅只提供了Windows内核模块的部分代码,其还提供了编译工具,也就是通过这个编译工具,你可以将你的WRK编译成一个EXE文件,也就是内核可执行模块,然后你可以利用这个EXE文件来取代操作系统本身的内核,这样的话,下次开机的时候操作系统所加载的内核就是您编译的那个EXE...原创 2021-01-31 14:56:47 · 1500 阅读 · 0 评论 -
系统非换页内存池的管理算法
Windows使用了两层内存管理。下层是基于页面的内存管理,仅限于执行体内部使用;上层建立在下层的内存管理工具基础之上,对外提供各种粒度的内存服务。两层结构如图:系统非换页内存池的管理算法MiInitializeNonPagedPool 和MiInitializeNonPagedPoolThresholds 初始化非换页内存池的管理信息。用于存放空闲页面链表头的MmNonPagedPoolFreeListHead 数组。数组的每一项都是一个MMFREE_POOL_ENTRY 结构。ty.原创 2020-12-30 15:34:21 · 298 阅读 · 0 评论 -
系统换页内存池的管理算法
系统换页内存池的管理算法换页内存池有两个,一个是系统全局范围的,一个是会话空间中的。起始地址分别位MmPagedPoolStart和MiSessionPoolStart。换页内存池有一个数据结构来描述其页面分配状态,定义如下:typedef struct _MM_PAGED_POOL_INFO { PRTL_BITMAP PagedPoolAllocationMap; PRTL_BITMAP EndOfPagedPoolBitmap; PMMPTE FirstPteFo...原创 2020-12-30 15:32:15 · 287 阅读 · 0 评论 -
执行体内存池的管理算法
执行体内存池的管理算法执行体内存池对象数据结构POOL_DESCRIPTOR,定义如下:typedef struct _POOL_DESCRIPTOR { POOL_TYPE PoolType; ULONG PoolIndex; ULONG RunningAllocs; ULONG RunningDeAllocs; ULONG TotalPages; ULONG TotalBigPages; ULONG Threshold;...原创 2020-12-30 15:31:20 · 245 阅读 · 0 评论 -
Windows引导过程
Windows引导过程 1 内核加载 在Intel x86系统上,Windows操作系统获得控制首先从硬盘的主引导记录(MBR,Master Boot Record)开始。MBR包含代码和数据,其代码称为引导代码,在系统引导时首先获得控制;MBR的数据时一张分区表,指定了每个分区在磁盘上的位置和大小,以及分区的类型。当MBR的引导代码被执行时,它检查并找到可引导的分区(引导分区),将引导分区的第一扇区(引导扇区)读到内存中。然后MBR的代码将控制权交给引导扇区的代码。引导扇区的代码给Windo.原创 2020-12-23 18:22:25 · 1012 阅读 · 0 评论 -
Windows的用户/内核模式切换
1. Windows的用户模式-内核模式切换Windows用户模式和内核模式的交互流程,如图:以CreateFile 为例,应用程序调用kernel32.dll 的CreateFile来创建文件,CreateFile调用ntdll.dll的存根函数NtCreateFile,然后直接将创建文件的请求转交给内核的NtCreateFile。为了转到内核,ntdll.dll 的KiIntSystemCall或KiFastSystemCall 执行”int 2e”或sysenter指令,切换到内核模式下.原创 2020-12-23 11:11:32 · 1873 阅读 · 0 评论 -
Intel x86的用户模式-内核模式切换
1 Intel x86的用户模式-内核模式切换Intel x86 提供了“门(gate)”机制允许可执行代码从R3 进入R0 模式,以及从R0返回R3模式。Intel x86 支持调用门(call gate)、陷阱门(trap gate)、中断门(interrupt gate)和任务门(task gate)四种门描述符。Windows 使用中断门来实现模式切换,其中断号为0x2e。意思就是,当应用程序在用户模式下运行时,它通过”int 2e”指令,切换到内核中,IDT(中断描述符表)的0x2e表项指定.原创 2020-12-22 22:02:01 · 775 阅读 · 0 评论 -
Windows内核中的对象管理
1 Windows内核中的对象管理每个对象都分为对象头和对象体,定义如下:typedef struct _OBJECT_HEADER{ LONG PointerCount; //引用计数 union { LONG HandleCount; //指向该对象的句柄数 PVOID NextToFree; //对象被延迟删除时加入到一条链中 }; POBJECT_TYPE Type; /...原创 2020-12-17 10:52:08 · 465 阅读 · 0 评论 -
Windows子系统(GUI)
Windows子系统1 Windows子系统结构Windows子系统结构,如图:Windows子系统有用户模式和内核模式组件。列出这些组件的职责:a. 内核模块win32k.sys。是Windows内核的扩展。包含两大功能组成部分:窗口管理器(window manager): 负责控制窗口显示、管理屏幕输出、手机来自键盘鼠标和其他设备的输入,以及将用户信息传递给应用程序。 GDI:图形输出设备的函数库。b.图形设备驱动程序。c.Windows环境子系统进程(csrss.e..原创 2020-12-15 11:42:17 · 5353 阅读 · 3 评论 -
进程和线程的结束
进程和线程的结束在执行体层,线程的终止函数是NtTerminateThread,内部调用PspTerminateThreadByPointer完成终止处理。系统线程的终止函数是PsTerminateSystemThread,内部调用PspTerminateThreadByPointer完成终止处理。三个函数原型如下:NTSTATUSNtTerminateThread(_in_opt HANDLE ThreadHandle,_in NTSTATUS ExitStatus);N.原创 2020-12-12 16:45:52 · 789 阅读 · 0 评论 -
Windows进程中的句柄表
1 Windows进程中的句柄表句柄是一个对象引用,同一个对象在不同的环境下可能有不同的引用(句柄)值。句柄仅在一个进程范围内有效。HANDLE_TABLE 结构的定义:typedef struct _HANDLE_TABLE { ULONG_PTR TableCode;//指向句柄表的存储结构 struct _EPROCESS *QuotaProcess;//句柄表的内存资源记录在此进程中 HANDLE UniqueProcessId;//创建进程的ID,用于回...原创 2020-12-12 16:40:10 · 713 阅读 · 0 评论 -
Windows中的线程调度
Windows中的线程调度1 线程优先级线程优先级分为3种类别:实时类别:16-31;动态类别:1-15;系统类别:0线程对象得KTHREAD 的BasePriority 和Priority 分别为线程的静态和动态优先级。KiComputeNewPriority 是计算Priority 值的函数,代码如下:FORCEINLINESCHARKiComputeNewPriority ( IN PKTHREAD Thread, IN SCHAR Adjustme...原创 2020-12-12 16:28:08 · 2199 阅读 · 1 评论 -
分发器对象--事件、突变体、信号量、队列、门、定时器
分发器对象Windows中的分发器对象一览表 名称 KOBJECTS的类型定义 数据结构定义 变成有信号状态的条件 事件 EventNotificationObject或 EventSynchroizationObject KEVENT 调用KeSetEvent设置状态 突变体 MutantOb原创 2020-12-12 16:04:08 · 490 阅读 · 0 评论 -
Windows内核的基本概念
Windows内核的基本概念 1 处理器模式Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode);3 表示用户模式(user mode)。1.1 内存管理Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间看待。其中2~4GB是所有进程共享的,为系统地址空间。0~2GB 为进程地址空间。在系统地址空间中,典型的三种内存页面管理算法:非换页内存池。这部分内存区域在初始化时已经被映射到物理页面,所以Windows利用空闲链表的...原创 2020-12-07 21:17:38 · 2027 阅读 · 0 评论 -
Windows系统结构
Windows系统结构Windows系统结构,如图:Windows 采用了双模式结构来保护操作系统本身。操作系统核心运行在内核模式,应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块(内核驱动程序)所提供的服务时,应用程序通过硬件指令从用户模式切换到内核模式中;当系统内核完成了所请求的服务以后,控制权又回到用户模式代码。一、 Windows内核结构Windows内核分为三层,硬件抽象层(Hardware Abstraction Layer...原创 2020-12-07 19:38:34 · 8010 阅读 · 0 评论 -
命名管道(Named Pipe)服务
命名管道(Named Pipe)服务1 命名管道的名称解析在Windows中,管道的名称遵循Windows统一命名规范(UNC,Universal Naming Convention)。命名管道的名称格式为\\<Server>\Pipe\<PipeName>。<Server>指定了一个命名管道的服务器所在的计算机名称,既可以是DNS名称,也可以是NetBIOS名称或者字符串形式的IP地址;<PipeName>是管道的唯一名,可以是层次结构中的一个.原创 2020-11-30 20:45:34 · 3997 阅读 · 0 评论 -
Windows中进程和线程数据结构(下)
2 执行体层的进程和线程对象执行体层进程对象的数据结构EPROCESS,第一部分Pcb : KPROCESS 内嵌结构体ProcessLock : 一个推锁(push lock)对象,用于保护EPROCESS中的数据成员CreateTime : 进程的创建时间ExitTime : 进程的退出时间RundownProtect : 进程的停止保护锁。当一个进程到最后被销毁时,它要等到所有其他进程和线程以及释放了此锁,才可继续进行UniqueProcessId : 进程的唯一编号.原创 2020-11-26 20:46:20 · 863 阅读 · 0 评论 -
内核层的进程和线程对象
Windows中进程和线程数据结构1 内核层的进程和线程对象进程数据结构:typedef struct _KPROCESS { // // The dispatch header and profile listhead are fairly infrequently // referenced. // DISPATCHER_HEADER Header; LIST_ENTRY ProfileListHead; // // T...原创 2020-11-26 20:42:37 · 490 阅读 · 0 评论 -
进程和线程基本概念
1 进程基本概念1.1 多进程模型多个进程是分时执行的,每个进程的指令流按顺序执行。多个进程在一个处理器上分时运行,如图:操作系统需要做的事情是:维护一个全局的进程表,记录下当前有哪些进程正在被执行;把时间分成适当的片段,现代处理器结构可以通过设置时钟中断,每次时钟中断到来时系统就会获得控制权,在进程间实施切换,即保留上一个进程的环境信息,恢复下一个进程的执行环境。1.2 进程和程序程序的内存布局结构一个c/c++ 程序的典型布局结构,如图:程序内存区域有三种类...原创 2020-11-25 20:50:04 · 196 阅读 · 0 评论 -
I/O 完成端口
Windows 提供一种称为I/O完成端口(I/O Completion Port)机制,能够让I/O的完成处理交由一个专门的线程池来完成,而线程池的线程数量是一个可配置的参数。这种做法将I/O请求的发起动作与完成处理分离到了不同的线程中,通过调节I/O完成端口的并行度(即线程池的线程数)使得系统处理客户请求的吞吐量最大化。I/O完成端口是内核对象,类型为IoCompletionObjectType。I/O完成端口是内核队列对象的一个应用,数据结构等同于KQUEUE。I/O完成端口的用法及其实现原理原创 2020-11-25 16:02:02 · 633 阅读 · 0 评论 -
基于线程调度的同步机制
基于线程调度的同步机制1 线程进入等待当一个线程的控制流到达一个等待函数时,若等待的条件不满足,则线程调度器会将处理器的执行权交给其他处于备用或就绪状态的线程。这些被等待的对象可以用来协调线程之间的行为,它们被称为同步对象或者分发器对象。头部以DISPATCH_HEADER开始的对象都市分发器对象,定义如下:typedef struct _DISPATCHER_HEADER { union { struct { UCHAR Type;...原创 2020-11-24 21:39:22 · 462 阅读 · 0 评论 -
不依赖于线程调度的同步机制
不依赖于线程调度的同步机制不依赖于线程调度的同步机制,包括提升IRQL、互锁操作、无锁操作、无锁的单链表和自旋锁。这些机制用于IRQL较高(大于等于DISPATCH_LEVEL)的情形。1 提升IRQL实现数据同步每个处理器都有一个IRQL属性,即KPCR数据结构的Irql 域,它表示该处理器当前的中断请求级别。一个基本规则是,当处理器在某个IRQL上运行时,它只能被更高级别的中断打断。在单处理器系统上,提升IRQL就可以确保对资源的独占访问。在多处理器系统上,还需互锁操作或自旋锁等互斥访.原创 2020-11-24 21:38:56 · 224 阅读 · 0 评论 -
Windows内核原理与实现读书笔记之异常分发
异常分发在Intel X86 体系结构中,异常也是通过IDI(中断描述符表)分发的。异常记录EXCEPTION_RECORD 定义:typedef struct _EXCEPTION_RECORD { DWORD ExceptionCode;//异常产生的原因 DWORD ExceptionFlags;//异常标志 struct _EXCEPTION_RECORD *ExceptionRecord;//相关联的异常记录 PVOID ExceptionAddress...原创 2020-11-24 21:34:41 · 348 阅读 · 0 评论 -
windows 内核原理与实现读书笔记之APC(异步过程调用)
APC(异步过程调用)APC_LEVEL ,APC(异步过程调用,Asynchronous Procedure Call)的软件中断而保留的IRQL。DPC是系统全局的,每个处理器都有DPC链表;APC是针对线程的,每个线程都有自己特有的APC链表。APC线程优先于普通的线程代码。APC 对象定义如下:typedef struct _KAPC { CSHORT Type; CSHORT Size; ULONG Sp...原创 2020-11-24 21:33:23 · 1365 阅读 · 0 评论 -
Windows内核与原理读书笔记之DPC和时钟中断和定时器管理
1.DPC(延迟过程调用)DPC有普通的(normal) 和线程的(threaded)。普通的DPC可以在任何一个线程环境中运行,线程的DPC只能在一个专门的DPC线程中运行。WRK 中DPC对象定义:typedef struct _KDPC { UCHAR Type; UCHAR Importance; UCHAR Number; UCHAR Expedite; LIST_ENTRY DpcListEntry; PKDEFERRED_...原创 2020-11-24 21:31:57 · 1066 阅读 · 0 评论 -
Windows内核原理与实现读书笔记之并发和同步基础
Windows中的并发和同步并发是指多个控制流同时在执行,既可能是真正的并行执行(如多处理器或多核的硬件环境),也可能是分时方式的并发执行。同步时保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序。1 进程和线程同步基础1.1 并发性基础 进程或线程的并发性可能的来源:多处理器环境、多核环境、超线程环境、处理器外部中断、内部中断、线程放弃执行权。Intel X86 指令体系中,运算指令加上lock 前缀保证其原子性。使用l..原创 2020-11-24 21:29:05 · 309 阅读 · 0 评论 -
windows 内核原理与实现读书笔记之LPC
LPC(本地过程调用)服务本地过程调用(LPC,Local Procedure Call),主要用于操作系统各个组件之间进行通信,或者用户模式程序与系统组件之间通信。LPC工作方式时消息传递,允许两个进程进行双向通信,在Windows的主要应用如下:Windows 应用程序与系统进程,包括Windows环境子系统之间的通信。 用户模式程序与内核模式组件之间的通信。 当RPC(远程过程调用,Remote Procecure Call)的两端在同一个系统时,RPC通信转化位LPC通信。8.2.原创 2020-11-24 21:14:48 · 2116 阅读 · 1 评论 -
windows内核原理与实现笔记之IO请求包
IRP 定义:typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP { CSHORT Type; USHORT Size; PMDL MdlAddress;//该I/O请求的用户缓冲区的MDL,仅用于“直接I/O”类型 ULONG Flags;//用于记录各种标志 union { struct _IRP *MasterIrp;//若这是一个关联IRP,则指向主IR...原创 2020-11-10 20:41:00 · 444 阅读 · 0 评论 -
windows内核原理与实现读书笔记之驱动程序对象和设备对象
I/O管理器加载设备驱动程序时,会创建一个驱动程序对象,该对象在对象管理器目录中的路径为:\Driver\<DriverName> 或\FileSystem\<DriverName>。如果时文件系统类型的驱动程序则放在”\FileSystem”目录下,否则放在“\Driver”目录下。与驱动程序相关的时设备对象,有两种途径创建设备对象:即插即用在检测到设备时,通过AddDevice 创建设备对象;非即插即用设备在初始化例程中创建设备对象。设备对象是通过IoCreateDevice原创 2020-11-09 21:41:17 · 412 阅读 · 0 评论 -
windows 内核原理与实现读书笔记之驱动程序初始化
I/O系统的初始化是在内核的阶段1初始化过程中完成的。主要函数是Phase1InitializationDiscard,它调用IoInitSystem 来初始化I/O系统。IoInitSystem 初始化工作:调用IopCreateObjectTypes ,创建7种类型对象:Adapter、DeviceHandler、Controller、Device、Driver、IoCompletion、File,并存放在相应的全局变量中。WRK中的全局类型对象变量,如下表: CmpKeyObjec原创 2020-11-06 15:59:11 · 998 阅读 · 0 评论 -
Windows内核与实现读书笔记之门等待
并发是指多个控制流同时在执行,既可能是真正的并行执行(如多处理器或多核的硬件环境),也可能是分时方式的并发执行。同步时保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序。5.1 进程和线程同步基础5.1.1 并发性基础 进程或线程的并发性可能的来源:多处理器环境、多核环境、超线程环境、处理器外部中断、内部中断、线程放弃执行权。Intel X86 指令体系中,运算指令加上lock 前缀保证其原子性。使用lock 前缀的两个...原创 2020-11-05 10:15:26 · 856 阅读 · 0 评论