win10驱动开发5——内存管理

本文探讨了Windows驱动程序如何与进程交互,特别是在DriverEntry和Unload函数中的过程。同时,解释了分页与非分页内存的区别,并展示了如何在驱动程序中使用ExAllocatePool进行内核内存的分配和释放。
摘要由CSDN通过智能技术生成

Windows驱动程序与进程的关系

驱动:通过一定的方式加载到内存模式地址空间,通过某个进程调用驱动的入口函数,是通过微软提供的接口间接的调用dll的函数。

查看DriverEntry是由那个进程调用的。

#include <ntddk.h>   
//获取进程的主模块路径
PCHAR PsGetProcessImageFileName(IN PEPROCESS Process);


VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
	//PsGetProcessImageFileName:获取当前调用驱动的进程的EPROCESS结构
	KdPrint(("%s\n", PsGetProcessImageFileName(PsGetCurrentProcess())));
	KdPrint(("驱动卸载\n"));
}

NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath
)
{
	KdPrint(("驱动加载\n"));
	DriverObject->DriverUnload = Unload;
	KdPrint(("%s\n", PsGetProcessImageFileName(PsGetCurrentProcess())));
	return STATUS_SUCCESS;
}

PsGetCurrentProcess:获取当前调用驱动的进程的EPROCESS结构
可以看到进程由system进程: 调用 初始化 卸载
在这里插入图片描述

分页与非分页内存

分页指的是拟内存可以交换到磁盘上,非分页内存代表拟内存不可交换到磁盘上。
Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存
#pragma code_seg(“PAGE”)//分页内存
#pragma code_seg() //非分页的
#pragma code_seg(“INIT”) 加载到 INIT 内存区域中
在这里插入图片描述

分配内核内存

ExAllocatePoolExFreePool
ExAllocatePoolWithTagExFreePoolWithTag
ExAllocateWithQuotaExFreePool
ExAllocateWithQuotaTagExFreePoolWithTag
#include <ntddk.h>   
//获取进程的主模块路径
//PCHAR PsGetProcessImageFileName(IN PEPROCESS Process);


VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
	//PsGetProcessImageFileName:获取当前调用驱动的进程的EPROCESS结构
	//KdPrint(("%s\n", PsGetProcessImageFileName(PsGetCurrentProcess())));
	KdPrint(("驱动卸载\n"));
}

NTSTATUS DriverEntry(
	IN PDRIVER_OBJECT DriverObject,
	IN PUNICODE_STRING RegistryPath
)
{
	PCHAR pcstr;
	KdPrint(("驱动加载\n"));
	DriverObject->DriverUnload = Unload;
	//PagedPool 分页 NonPagedPool非分页
	pcstr = (PCHAR)ExAllocatePoolWithTag(PagedPool, 1024,'abc');
	if (pcstr==NULL)
	{
		KdPrint(("内存分配失败\n"));
		return STATUS_INSUFFICIENT_RESOURCES;
	}
	KdPrint(("内存分配成功\n"));
	//清空内存
	RtlZeroMemory(pcstr, 1024);
	strcpy(pcstr, "内存分配strcpy测试");
	KdPrint(("%s\n", pcstr));
	ExFreePoolWithTag(pcstr,'abc');
	return STATUS_SUCCESS;
}
易语言辅助必备驱动保护模块 代码公开 透明 绝无暗装之类 ------------------------------ .版本 2 .子程序 关闭保护辅助进程, 逻辑型, 公开, 取消禁止结束并保护程序 .参数 进程ID, 整数型, 可空, 可空,默认取消自身,可用的进程_名取ID()获取进程ID, .子程序 关闭防各类调试, 逻辑型, 公开, 取消结束并保护程序 .参数 进程ID, 整数型, 可空, 可空,默认取消自身,可用的进程_名取ID()获取进程ID, .子程序 开启保护辅助进程, 逻辑型, 公开, 可禁止他人有意结束某程序,并保护程序不被注入,打开程序,支持所有系统,32,WIN764位都可以 .参数 进程ID, 整数型, 可空, 可空,默认保护自身,可用的进程_名取ID()获取进程ID, .子程序 开启防各类调试, 逻辑型, 公开, 可禁止他人有意,用CE,VE,ME,GE,内存工具和WPE等程序,打开程序,支持所有系统,32,WIN764位都可以 .参数 进程ID, 整数型, 可空, 可空,默认保护自身,可用的进程_名取ID()获取进程ID, .子程序 隐藏模块, 逻辑型, 公开, 隐藏模块 (GetModuleHandle (“隐藏.dll”)) .参数 模块基地址, 整数型 .子程序 郁金香取消隐藏进程, 逻辑型, 公开, 取消隐藏进程 暂时无法取消隐藏 .参数 进程ID, 整数型, 可空, 可空,默认取消自身,可用进程_名取ID()获取进程ID, .子程序 郁金香隐藏进程, 逻辑型, 公开, 隐藏进程,,支持32位,和64位WIn7,与所有系统请自行测试 .参数 进程ID, 整数型, 可空, 可空,默认隐藏自身,可用进程_名取ID()获取进程ID, .子程序 置格盘陷阱, 逻辑型, 公开 .子程序 置蓝屏陷阱, 逻辑型, 公开, 利用蓝屏代码 绝对值蓝屏 .子程序 置死机陷阱, 逻辑型, 公开 .子程序 置重启陷阱, 逻辑型, 公开, 绝对值重启 .DLL命令 GetModuleHandle, 整数型, "kernel32", "GetModuleHandleA", 公开 .参数 lpModuleName, 文本型 .DLL命令 RtlMoveMemory, 整数型, , "RtlMoveMemory", 公开, _写内存3 .参数 dest, 整数型, 传址 .参数 Source, 整数型 .参数 len, 整数型, , 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值