⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wd_mem.h

📁 国内文件驱动编程知名人物蔡大侠的教程源代码
💻 H
字号:
/**
	@file	wd_mem.h
	@brief	内存管理相关.如果你直接包含这个头文件,
			在包含之前必须包含DDK相关头文件.(你可以
			选择WDM或者IFS或者NDIS相关头文件.)
	@author tan wen 谭文
	@date	2005-12-20
*/

#ifndef _WD_MEM_HEADER_
#define _WD_MEM_HEADER_

#include "wdf.h"

_inline wd_pvoid wd_malloc(wd_bool paged,wd_size size)
{	return ExAllocatePool(paged?PagedPool:NonPagedPool,size);	}

_inline wd_void	wd_free(wd_pvoid point)
{		ExFreePool(point);	};

_inline wd_void	wd_memzero(wd_pvoid point,wd_size size)
{		RtlZeroMemory(point,size);	};

_inline wd_void wd_memcpy(wd_pvoid dst,wd_pvoid src,wd_size size)
{	RtlCopyMemory(dst,src,size);	};

_inline wd_void wd_mdl_free(wd_mdl *mdl)
{	IoFreeMdl(mdl);	}

_inline wd_void *wd_mdl_vaddr(wd_mdl *mdl)
{
	return MmGetSystemAddressForMdlSafe(mdl,NormalPagePriority);
}

_inline wd_mdl *wd_mdl_alloc(wd_void* buf,
							 wd_ulong length)
{
	wd_mdl * pmdl = IoAllocateMdl(buf,length,wd_false,wd_false,NULL);
	if(pmdl == NULL)
		return NULL;
	MmBuildMdlForNonPagedPool(pmdl);
	pmdl->Next = NULL;
	return pmdl;
}

_inline wd_mdl *wd_mdl_malloc(wd_ulong length)
{
	wd_mdl *mdl;
	wd_void *point = wd_malloc(wd_false,length);
	if(point == NULL)
		return NULL;
	mdl = wd_mdl_alloc(point,length);
	if(mdl == NULL)
	{
		wd_free(point);
		return NULL;
	}
	return mdl;
}

_inline wd_void wd_mdl_mfree(wd_mdl *mdl)
{
	wd_void *point = wd_mdl_vaddr(mdl);
	wd_mdl_free(mdl);
	wd_free(point);
}

_inline wd_void *wd_map_user_buffer (
    in wd_void *KernelAddress,
    in wd_ulong Length,
    out wd_mdl **Mdl
    )
{
    *Mdl = IoAllocateMdl(KernelAddress, Length, FALSE, FALSE, NULL);
    if (*Mdl == NULL)
    {
        return NULL; //or you can raise STATUS_INSUFFICIENT_RESOURCES here
    }
    MmProbeAndLockPages(*Mdl, KernelMode, IoModifyAccess);
    return MmMapLockedPages(*Mdl, UserMode);
}

_inline wd_void wd_unmap_user_buffer(
			in wd_void *UserAddress,
			in wd_mdl *Mdl)
{
    MmUnmapLockedPages(UserAddress, Mdl);
    MmUnlockPages(Mdl);
    IoFreeMdl(Mdl);
}

#endif // _WD_MEM_HEADER_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -