Ring0 - Lookaside结构
由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
这时使用Lookaside.
1.每次申请固定大小的内存.
2.申请和回收的操作十分频繁.
实现原理:
他先向windows申请了一块比较大的内存.而后以后申请内存都从Lookaside对象申请.这样就会避免内存"空洞",Lookaside对象内部的内存不够用时,他会向操作系统申请更多内存.当Lookaside内部有大量的未使用的内存时,他会自动让windows回收一部分内存.总之Lookaside是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向windows申请内存。
初始化Lookaside
//分页
VOID
ExInitializePagedLookasideList (
_Out_ PPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size,
_In_ ULONG Tag, //随便写
_In_ USHORT Depth //保留.必须是零.
);
//不分页
VOID
ExInitializeNPagedLookasideList (
_Out_ PNPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size, //每个非分页条目的大小,即字节的大小
_In_ ULONG Tag,
_In_ USHORT Depth //保留.必须是零
);
#include <ntifs.h> typedef struct _ITEM_
{
ULONG ItemData;
}ITEM, *PITEM; void LookasideTest(); VOID DriverUnload(PDRIVER_OBJECT DriverObject); #include "Lookaside.h" //bp Lookaside!DriverEntry
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
NTSTATUS Status = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject = NULL; DriverObject->DriverUnload = DriverUnload; LookasideTest(); return Status;
} void LookasideTest()
{
//初始化Lookaside对象
int i = ;
PAGED_LOOKASIDE_LIST PagedLookasideList; ExInitializePagedLookasideList(
&PagedLookasideList,
NULL, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
NULL,
,
sizeof(ITEM),
'',//ulong 4位数字
//保留.必须是零.
);//分页 #define ARRAY_NUMBER 50
PITEM Item[ARRAY_NUMBER];
//模拟频繁申请内存
for (i = ; i < ARRAY_NUMBER; i++)
{
Item[i] = (PITEM)ExAllocateFromPagedLookasideList(
&PagedLookasideList);
} for (i = ; i < ARRAY_NUMBER; i++)
{
Item[i]->ItemData = i;
} for (i = ; i < ARRAY_NUMBER; i++)
{
DbgPrint("%d\r\n", Item[i]->ItemData);
}
//模拟频繁回收内存
for (i = ; i < ARRAY_NUMBER; i++)
{
ExFreeToPagedLookasideList(
&PagedLookasideList,
Item[i]
); Item[i] = NULL;
} ExDeletePagedLookasideList(&PagedLookasideList);
//删除LookasidePagedLookasideList } VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("DriverUnload()\r\n");
}
Ring0 - Lookaside结构的更多相关文章
- Windows内存管理(2)--Lookaside结构 和 运行时函数
1. Lookaside结构 频繁的申请和回收内存,会导致在内存上产生大量的内存"空洞",从而导致最终无法申请内存.DDK为程序员提供了Lookaside结构来解决这个问 ...
- 由枚举模块到ring0内存结构 (分析NtQueryVirtualMemory)
是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其 ...
- Lookaside
频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存.DDK提供了Lookaside结构来解决这个问题.可以将Lookaside结构想象成一个内存容器.在初始的时候,它先向W ...
- [Windows驱动开发](四)内存管理
一.内存管理概念 1. 物理内存概念(Physical Memory Address) PC上有三条总线,分别是数据总线.地址总线和控制总线.32位CPU的寻址能力为4GB(2的32次方)个字 ...
- 《Windows驱动开发技术详解》之Windows内存管理
虚拟内存地址 Windows所有的程序(Ring0和Ring3层)可以操作的都是虚拟内存.有一部分单元会和物理内存对应起来,但并非一一对应,多个虚拟内存页可以映射同一个物理内存页.还有一部分单元会被映 ...
- Windows内核中的内存管理
内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...
- ring0 与 ring3 层之间的交互
在进行Windows的ring0层开发时,必不可免的要与 ring3 层进行交互.进行数据间的相互传输.可用的方法有DeviceIoCntrol,ReadFile.我平常都是用的DeviceIoCon ...
- SSDT Hook结构
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- Linux基础系列—Linux体系结构和Linux内核结构
/** ****************************************************************************** * @author 暴走的小 ...
随机推荐
- (15)javaScript入门
什么是javaScript HTML用来做页面的架构,CSS用来做页面样式的布局 javaScript就是用来完成页面用户交互的,JS写的就是叫脚本 js就是弱语言类型,不同类型的时候可以相互转换 j ...
- BOM-JavaScript浏览器的对象模型
BOM-JavaScript是运行在浏览器中的,所以提供了一系列对象用于和浏览器窗口进行交互,这些对象主要包括window.document.location.navigator和screen等.通常 ...
- 小白python 安装
小白python 安装: https://blog.csdn.net/qq_36667170/article/details/79275605 https://blog.csdn.net/nmjuzi ...
- 区块链 blockchain
区块链是去中心化的记账方式.没有中心,安全,高效.区块链是属于分布式计算的一种.是一种数据库. 区块链不是什么比特币,xx币.而是比特币他们用了区块链的技术. 区块链具有去中心化.无须中心信任.不可篡 ...
- extundelete
http://extundelete.sourceforge.net/options.html 误删除/usr/share目录因此考虑恢复目录过程如下:1.选用extundelete软件来进行恢复,源 ...
- js技巧专题篇: 页面跳转
本篇主要介绍网页上常见的页面跳转技术.页面跳转有几种方式,比较常用的是window.location.href,window.location.replace,window.open,当然还有目前比较 ...
- [转]Java之JMX 详解
一.JMX简介 JMX是一种JAVA的正式规范,它主要目的是让程序有被管理的功能,那么怎么理解所谓的“被管理”呢?试想你开发了一个软件(如WEB网站),它是在24小时不间断运行的,那么你可能会想要“监 ...
- taro 学习资料
taro 学习资料 学习资料 网址 github https://github.com/NervJS/taro taro 官方文档 https://nervjs.github.io/taro/docs ...
- create-react-app-typescript 知识点
github:https://github.com/wmonk/create-react-app-typescript 报错:Import sources within a group must be ...
- Flume 案例 Telnet安装及采集Telnet发送信息到控制台
Telnet安装 一.查看本机是否安装telnet #rpm -qa | grep telnet 如果什么都不显示.说明你没有安装telnet 二.开始安装 yum install xinetd yu ...