由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
这时使用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. Django之路由配置系统(urlConfig)

    简而言之,django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户端http ...

  2. 最大值最小值(max,max_element)

    min 如果比不出大小就返回第一个引数 //版本一:调用operator< template <class LessThanComparable> const LessThanCom ...

  3. CSS vertical-algin的使用

    一.什么vertical-algin vertical的意思就是垂直,algin是对齐的意思,连起来就是“垂直对齐方式”,接下来看看vertical-algin有哪些属性,打开浏览器一看 vertic ...

  4. TypeScript 与 es6 写法的区别

    import 方式 ts 默认对于 commonjs 的模块是这样加载的:import * as React from 'react'; es6:import React from 'react'; ...

  5. tp5服务器验证案例

    1.验证器代码 <?php namespace app\user\validate; use think\Validate; use Potting\IDCard; /** * 山区治理报名验证 ...

  6. Linux Shell脚本中获取本机ip地址方法

    ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"​ 命令解释 ...

  7. windows 下 Anaconda 安装 TensorFlow

    转自: https://www.cnblogs.com/nosqlcoco/p/6923861.html 什么是 Anaconda? Anaconda is the leading open data ...

  8. JavaScript跟踪-Piwik

    1.先决条件:使用新版本的JavaScript跟踪代码 2.JavaScript跟踪代码的功能 (1)自定义在Piwik中显示的页面名称 (2)手动触发目标转化 (3)考虑一个主机的“别名”,不将这个 ...

  9. 阅读<Video Timing Controller>笔记

    阅读<Video Timing Controller>笔记   1.Video Timing Controller Block Diagram 2.Example Video Timing ...

  10. Mule ESB 介绍

    Mule ESB 介绍 博客分类: ESB ESB  1. 简介 Mule ESB是一个基于Java的轻量级企业服务总线和集成平台,允许开发人员快速便利地连接多个应用,并支持应用间的数据交换.Mule ...