驱动内存映射文件

驱动内存映射文件,一切尽在代码中,各位老爷请看:

 

 

 

// 内存映射文件,返回基址 
// 用完记得ZwUnmapViewOfSection(ZwCurrentProcess(), BaseAddress);
PVOID CreateMapFileAndGetBaseAddr(PUNICODE_STRING FilePath, PSIZE_T Size)
{
#define SEC_IMAGE 0x01000000

	PVOID MapFileBaseAddress = NULL;
	HANDLE  FileHandle = NULL;
	HANDLE  SectionHandle = NULL;
	NTSTATUS status;
	IO_STATUS_BLOCK IoStatus = { 0 };
	OBJECT_ATTRIBUTES oa = { 0 };

	InitializeObjectAttributes(
		&oa,
		FilePath,
		OBJ_CASE_INSENSITIVE,
		0,
		0
		);

	status = ZwOpenFile(&FileHandle,
		FILE_READ_DATA,
		&oa,
		&IoStatus,
		FILE_SHARE_READ,
		FILE_SYNCHRONOUS_IO_NONALERT);
	if (!NT_SUCCESS(status))
	{
		KdPrint(("ZwOpenFile failed: 0x%x\n", status));
		return NULL;
	}
	oa.ObjectName = 0;

	status = ZwCreateSection(&SectionHandle,
		SECTION_ALL_ACCESS,
		&oa,
		0,
		PAGE_READONLY,
		SEC_IMAGE,
		FileHandle);
	if (!NT_SUCCESS(status))
	{
		KdPrint(("ZwCreateSection failed: 0x%x\n", status));
		ZwClose(FileHandle);
		return NULL;
	}

	status = ZwMapViewOfSection(SectionHandle,
		ZwCurrentProcess(),
		&MapFileBaseAddress,
		0,
		0,
		0,
		Size,
		ViewUnmap,
		0,
		PAGE_READONLY);

	if (!NT_SUCCESS(status))
	{
		KdPrint(("ZwMapViewOfSection failed: 0x%x\n", status));
		ZwClose(SectionHandle);
		ZwClose(FileHandle);
		return NULL;
	}

	ZwClose(SectionHandle);
	ZwClose(FileHandle);
	return MapFileBaseAddress;
}

 

 

 

本博客旨在提供高稳定性和良好风格的代码。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值