📄 wd_mem.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 + -