由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
这时使用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结构的更多相关文章

  1. Windows内存管理(2)--Lookaside结构 和 运行时函数

    1.      Lookaside结构 频繁的申请和回收内存,会导致在内存上产生大量的内存"空洞",从而导致最终无法申请内存.DDK为程序员提供了Lookaside结构来解决这个问 ...

  2. 由枚举模块到ring0内存结构 (分析NtQueryVirtualMemory)

    是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其 ...

  3. Lookaside

    频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存.DDK提供了Lookaside结构来解决这个问题.可以将Lookaside结构想象成一个内存容器.在初始的时候,它先向W ...

  4. [Windows驱动开发](四)内存管理

    一.内存管理概念 1. 物理内存概念(Physical Memory Address)     PC上有三条总线,分别是数据总线.地址总线和控制总线.32位CPU的寻址能力为4GB(2的32次方)个字 ...

  5. 《Windows驱动开发技术详解》之Windows内存管理

    虚拟内存地址 Windows所有的程序(Ring0和Ring3层)可以操作的都是虚拟内存.有一部分单元会和物理内存对应起来,但并非一一对应,多个虚拟内存页可以映射同一个物理内存页.还有一部分单元会被映 ...

  6. Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,Driver ...

  7. ring0 与 ring3 层之间的交互

    在进行Windows的ring0层开发时,必不可免的要与 ring3 层进行交互.进行数据间的相互传输.可用的方法有DeviceIoCntrol,ReadFile.我平常都是用的DeviceIoCon ...

  8. SSDT Hook结构

    目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...

  9. Linux基础系列—Linux体系结构和Linux内核结构

    /** ****************************************************************************** * @author    暴走的小 ...

随机推荐

  1. SharpZipLib 压缩ZIP导出

    var uploadSectionDir = Path.Combine("Upload", "QQ", DateTime.Now.ToString(" ...

  2. (3)diango的架构

    MVC架构:主流的web都是MVC架构 M 就是模型层指得是model,对应的就是数据库操作层 V 就是视图,和MTV架构的视图层不是一个概念,对应MTV架构中的T C 控制器,根据请求地址执行什么代 ...

  3. 【状压DP】【HDOJ1074】

    http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Time Limit: 2000/1000 MS (Java/Others) ...

  4. 【mybatis源码学习】mybtias基础组件-反射工具

    一.JavaBean的规范 类中定义的成员变量也称为字段,属性则是通过getter/setter方法得到的,属性只与类中的方法有关,与是否存在对应成员变量没有关系. 属性的getter/setter方 ...

  5. vue全家桶+Koa2开发笔记(8)--开发网页

    1.使用 mongoose 动态倒入数据 mongoimport -d student -c areas areas.dat -d 后面是数据库名称: -c后面是表名称 最后是数据源 2.使用vue的 ...

  6. Unity3D的主要类图 N年前的版本

    1. GameObject_Structure 2. Component_Design 3. Behaviour_Design 4. Animation_Design

  7. SharePoint Online 使用 adal js 获取access token

    最近在写一些SharePoint 的sample code, 有兴趣的小伙伴可以查看我的GitHub. 今天给大家介绍SharePoint Framework (SPFx  )web part 当中怎 ...

  8. oracle之 单实例监听修改端口

    Oracle 单一主机多个实例多个监听器配置要点   1. 一台服务器主机, 有多个实例, 如: TSDB/ORCL; 又需要配置多个监听器 2. 需要指定不同的LISTENER端口   3.pmon ...

  9. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' 解决办法

    启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...

  10. DeviceIoControl 驱动交互

    驱动程序通信的函数,除了ReadFile和WriteFile函数还有DeviceIoControl函数,而且DeviceIoControl函数那是相当的彪悍.因为它可以自定义控制码,你只要在IRP_M ...