windows内核情景分析读书笔记-----HYPERSPACE
主要介绍HYPERSPACE的创建映射函数
赏光看我这一系列文章的朋友最好结合毛德操老师的书来看,具体的细节我这里就不阐述了
简单说下这个函数功能
Windows内核有时候需要把某些物理页面临时映射到内核的虚存空间,用做临时的用途
#define HYPERSPACE (Ke386Pae?0x c080 0000:0x c040 0000)
区间大小为0x0040 0000 也就是1024个页面
其中Ke386Pae这个布尔值代表系统是32位还是64位
PVOID
NTAPI
MmCreateHyperspaceMapping(PFN_TYPE Page)
{
PVOID Address;
ULONG i;
if (Ke386Pae)
{
ULONGLONG Entry;
ULONGLONG ZeroEntry = 0LL;
PULONGLONG Pte;
Entry = PFN_TO_PTE(Page) | PA_PRESENT | PA_READWRITE;
Pte = PAE_ADDR_TO_PTE(HYPERSPACE) + Page % 1024;
if (Page & 1024)
{
for (i = Page %1024; i < 1024; i++, Pte++)
{
if (0LL == ExfInterlockedCompareExchange64UL(Pte, &Entry, &ZeroEntry))
{
break;
}
}
if (i >= 1024)
{
Pte = PAE_ADDR_TO_PTE(HYPERSPACE);
for (i = 0; i < Page % 1024; i++, Pte++)
{
if (0LL == ExfInterlockedCompareExchange64UL(Pte, &Entry, &ZeroEntry))
{
break;
}
}
if (i >= Page % 1024)
{
KEBUGCHECK(0);
}
}
}
else
{
for (i = Page %1024; (LONG)i >= 0; i--, Pte--)
{
if (0LL == ExfInterlockedCompareExchange64UL(Pte, &Entry, &ZeroEntry))
{
break;
}
}
if ((LONG)i < 0)
{
Pte = PAE_ADDR_TO_PTE(HYPERSPACE) + 1023;
for (i = 1023; i > Page % 1024; i--, Pte--)
{
if (0LL == ExfInterlockedCompareExchange64UL(Pte, &Entry, &ZeroEntry))
{
break;
}
}
if (i <= Page % 1024)
{
KEBUGCHECK(0);
}
}
}
}
else
{
ULONG Entry;
PULONG Pte;
Entry = PFN_TO_PTE(Page) | PA_PRESENT | PA_READWRITE;//构建页面表项PTE内容,设置PRESENT,WRITEREAD标志位等
Pte = ADDR_TO_PTE(HYPERSPACE) + Page % 1024;//页面表项的地址 讲解点A
if (Page & 1024)//page第10位为1,代表虚存页面搜索的方向为上
{
for (i = Page % 1024; i < 1024; i++, Pte++)
{
if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
{//Pte与0比较,如果相等,返回Pte。否则返回Entry
break;
}
}
if (i >= 1024)//遍历到上边界,则要重新返回下边界,下边界就是那个特殊页面
{
Pte = ADDR_TO_PTE(HYPERSPACE);
for (i = 0; i < Page % 1024; i++, Pte++)
{
if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
{
break;
}
}
if (i >= Page % 1024)
{
KEBUGCHECK(0);
}
}
}
else
{
for (i = Page % 1024; (LONG)i >= 0; i--, Pte--)
{
if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
{
break;
}
}
if ((LONG)i < 0)
{
Pte = ADDR_TO_PTE(HYPERSPACE) + 1023;
for (i = 1023; i > Page % 1024; i--, Pte--)
{
if (0 == InterlockedCompareExchange((PLONG)Pte, (LONG)Entry, 0))
{
break;
}
}
if (i <= Page % 1024)
{
KEBUGCHECK(0);
}
}
}
}
Address = (PVOID)((ULONG_PTR)HYPERSPACE + i * PAGE_SIZE);
__invlpg(Address);
return Address;
}
讲解点A
#define ADDR_TO_PTE(v) (PULONG)(PAGETABLE_MAP + ((((ULONG)(v) / 1024))&(~0x3)))
首先我们先看几个宏
#define PAGETABLE_MAP 0xC000 0000
#define HYPERSPACE 0xC040 0000
我们应当明确,虚拟地址中从PAGETABLE_MAP,也就是0xC000 0000一直到C03f ffff保存着该进程的页表,而从下一个单元,也就是HYPERSPACE(C040 0000)开始一直到C0C0 0000,这一段空间则是大小为4M的HYPERSPACE空间,我们知道一个页面是4K大小,则4M就是1K个页面大小的空间。
而页表空间,从0xC000 0000一直到C03f ffff大小则为2^22次方,也就是4M,也就是1K个一个页面的大小。
这个页面空间大家要注意,我们知道,这里的页面对应于整个4G空间,也就是说,里面一个32位的单元,就对应于整个4G的虚存空间的一个页面。
这个方式比较神奇,也就是说,自己的一部分,对应于自己的整个身体。
如果我们把计算机比作一个人体,则在人体肚子上取几个细胞,每个细胞从上到下依次对应着人的头,胳膊,胸,腹,腿等··(当然这个脑洞开的有点大),自己映射了自己。
那么,页表中肯定有几个32位的值,对应着页表自身,同时,肯定也有几个32位的值,对应着后面大小为4M的HYPERSPACE。
我们既然知道页表大小为4M,而且这4M对应着整个4G空间,其中每个32位的值(也就是4B)对应着一个页面,所以其中页面项在页表中的偏移就是其对应的物理页面在整个4G空间的偏移。
在非Ke386Pae部分,我们看到了
Pte = ADDR_TO_PTE(HYPERSPACE) + Page % 1024;
ADDR_TO_PTE宏定义如下
#define ADDR_TO_PTE(v) (PULONG)(PAGETABLE_MAP + ((((ULONG)(v) / 1024))&(~0x3)))
经过上面的叙述,这个应该不难分析了,部分映射整体。
经过计算,该宏结果为C030 1000
整体过程分析如下:
蓝色代表页表空间,红色代表HYPERSPACE,二者大小都是4M
而位于蓝色页表中的黄色部分,则映射着整个HYPERSPACE,也就是红色部分。
程序首先从 ADDR_TO_PTE(HYPERSPACE) + Page % 1024位置处开始寻找(这里假设为),如果B10位1,则往上找,到了顶点后,再返回最下边,往上找,如果B10为0,则相反。
这里有个比较有意思的事情,它并不是直接在红色部分直接一个一个页面的找自由页面的,而是在它的映射里(也就是黄色部分)中查找的。
所以循环里i的变化,pte的变化,一直限定在黄色部分。直到循环结束,i确定后,才从红色部分基址C040 0000开始,加上i*PAGESIZE,返回的结果就是红色部分中一个页面的地址。
windows内核情景分析读书笔记-----HYPERSPACE相关推荐
- windows 内核情景分析
原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...
- [14]Windows内核情景分析 --- 文件系统
文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...
- windows内核情景分析 --- 文件系统
文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...
- Windows内核情景分析-概述
现在的Windows 现在的windows内核包含了两大部分,一部分是本来意面上的操作系统内核,另一部分则是移到了内核中的视窗服务,前者对应ntoskrnl.exe后者win32k.sys:后者部分为 ...
- Windows内核情景分析 笔记
803页:WDK文档强调IoRegisterDriverReinitialization 主要用于同时支持Non-PNP和PNP下层的驱动.大概原因是:只依赖Legacy下层的驱动可以通过LoadOr ...
- windows内核情景分析---进程线程2
二.线程调度与切换 众所周知:Windows系统是一个分时抢占式系统,分时指每个线程分配时间片,抢占指时间片到期前,中途可以被其他更高优先级的线程强制抢占. 背景知识:每个cpu都有一个TSS,叫'任 ...
- windows内核情景分析---进程线程1
本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 一.进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName, ...
- Windows内核与原理读书笔记之DPC和时钟中断和定时器管理
1.DPC(延迟过程调用) DPC有普通的(normal) 和线程的(threaded).普通的DPC可以在任何一个线程环境中运行,线程的DPC只能在一个专门的DPC线程中运行. WRK 中DPC对象 ...
- [6]Windows内核情景分析 --APC
APC:异步过程调用.这是一种常见的技术.前面进程启动的初始过程就是:主线程在内核构造好运行环境后,从KiThreadStartup开始运行,然后调用PspUserThreadStartup,在该线程 ...
最新文章
- c语言中数组名a和a详细介绍
- 模型审查的4个核心要点
- 《汇编语言》总结04 —— 更灵活的定位内存地址的方法
- 数据仓库的特点、数据仓库分层、数据仓库模型
- PS如何制作一寸照片
- uni ios视频黑屏、无声音或无法播放
- 秋天远程控制V1.0源码(易语言)
- 联想e480一键恢复小孔_联想一键恢复的使用方法
- FileZilla连接ubuntu主机时选择21端口无法连接
- 如何查看计算机硬盘的软件内存条,内存检测工具,内存检测软件 - 内存条检测工具就用金山卫士 - 安全专题...
- Echarts 雷达简单应用
- UE4像素流pixelstream的一些坑
- ESP8266 系统环境搭建
- Win10搭建Web局域网文件共享库
- 微信接入机器人实现对别人消息和群at消息的自动回复
- 安装oracle12f 闪退,安装oracle ,调用图形界面java卡死,
- 每周荐书:架构、Scratch、增长黑客(评论送书)
- 基于linux的在线英汉词典(带源码)
- 24、基于原型的切比雪夫低通滤波器设计理论(插入损耗法)
- 全球与中国激光光导鼓市场深度分析及发展研究预测报告