主要介绍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相关推荐

  1. windows 内核情景分析

    原文很长:先转部分过来,有时间看一下: 一 windows 内核情景分析---说明 说明 本文结合<Windows内核情景分析>(毛德操著).<软件调试>(张银奎著).< ...

  2. [14]Windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  3. windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  4. Windows内核情景分析-概述

    现在的Windows 现在的windows内核包含了两大部分,一部分是本来意面上的操作系统内核,另一部分则是移到了内核中的视窗服务,前者对应ntoskrnl.exe后者win32k.sys:后者部分为 ...

  5. Windows内核情景分析 笔记

    803页:WDK文档强调IoRegisterDriverReinitialization 主要用于同时支持Non-PNP和PNP下层的驱动.大概原因是:只依赖Legacy下层的驱动可以通过LoadOr ...

  6. windows内核情景分析---进程线程2

    二.线程调度与切换 众所周知:Windows系统是一个分时抢占式系统,分时指每个线程分配时间片,抢占指时间片到期前,中途可以被其他更高优先级的线程强制抢占. 背景知识:每个cpu都有一个TSS,叫'任 ...

  7. windows内核情景分析---进程线程1

    本篇主要讲述进程的启动过程.线程的调度与切换.进程挂靠 一.进程的启动过程: BOOL CreateProcess ( LPCTSTR lpApplicationName,               ...

  8. Windows内核与原理读书笔记之DPC和时钟中断和定时器管理

    1.DPC(延迟过程调用) DPC有普通的(normal) 和线程的(threaded).普通的DPC可以在任何一个线程环境中运行,线程的DPC只能在一个专门的DPC线程中运行. WRK 中DPC对象 ...

  9. [6]Windows内核情景分析 --APC

    APC:异步过程调用.这是一种常见的技术.前面进程启动的初始过程就是:主线程在内核构造好运行环境后,从KiThreadStartup开始运行,然后调用PspUserThreadStartup,在该线程 ...

最新文章

  1. c语言中数组名a和a详细介绍
  2. 模型审查的4个核心要点
  3. 《汇编语言》总结04 —— 更灵活的定位内存地址的方法
  4. 数据仓库的特点、数据仓库分层、数据仓库模型
  5. PS如何制作一寸照片
  6. uni ios视频黑屏、无声音或无法播放
  7. 秋天远程控制V1.0源码(易语言)
  8. 联想e480一键恢复小孔_联想一键恢复的使用方法
  9. FileZilla连接ubuntu主机时选择21端口无法连接
  10. 如何查看计算机硬盘的软件内存条,内存检测工具,内存检测软件 - 内存条检测工具就用金山卫士 - 安全专题...
  11. Echarts 雷达简单应用
  12. UE4像素流pixelstream的一些坑
  13. ESP8266 系统环境搭建
  14. Win10搭建Web局域网文件共享库
  15. 微信接入机器人实现对别人消息和群at消息的自动回复
  16. 安装oracle12f 闪退,安装oracle ,调用图形界面java卡死,
  17. 每周荐书:架构、Scratch、增长黑客(评论送书)
  18. 基于linux的在线英汉词典(带源码)
  19. 24、基于原型的切比雪夫低通滤波器设计理论(插入损耗法)
  20. 全球与中国激光光导鼓市场深度分析及发展研究预测报告

热门文章

  1. win10校验MD5,SHA1,SHA256
  2. 强大的Squid 代理服务器应用
  3. 2. MariaDB激活二进制日志
  4. 销售行业如何用智能名片高效拓客?
  5. 网络层笔记二、虚拟互连网络概念
  6. ubuntu 安装 monaco字体
  7. Java集合知识点,看这篇就够了,还有月薪3万简历模板+BAT面试题,帮你进大厂!
  8. 大一下|数据结构十大习题|part1
  9. jQuery 效果 ——slideDown() 方法、slideToggle() 方法、slideUp() 方法
  10. 数组(定义方式,赋值及使用数组)