对 Windows驱动开发技术详解 第五章的(Windows内存管理)自我理解
BY:ALALMN—飞龙 QQ:316118740 BLOG:http://hi.baidu.com/alalmn
分配内核内存
PVOID
ExAllocatePool(
IN POOL_TYPE PoolType, //
如果值为NonPagedPool,则分配非分页内存。
如果值为PagedPool,则分配内存为分页内存。
NonPagedPoolMustSucceed,指定分配非分页内存,必须成功。
DontUseThisType, 未指定。
NonPagedPoolCacheAligned,指定要求分配非分页内存,而且必须内存对齐。
PagedPoolCacheAligned,指定分配分页内存,而且必须内存。
NonPagedPoolCacheAlignedMustS,指定分配非分页内存,而且必须内存对齐,必须成功。
IN SIZE_T NumberOfBytes //分配内存大小。注意最好为4的倍数。
);
PVOID
ExAllocatePoolWithTag(
IN POOL_TYPE PoolType, //同上
IN SIZE_T NumberOfBytes, //同上
IN ULONG Tag
);
PVOID
ExAllocatePoolWithQuota(
IN POOL_TYPE PoolType, //同上
IN SIZE_T NumberOfBytes //同上
);
PVOID
ExAllocatePoolWithQuotaTag(
IN POOL_TYPE PoolType, //同上
IN SIZE_T NumberOfBytes, //同上
IN ULONG Tag
);
///
回收内存
exfreepool
exfreepoolwithtag
VOID
ExFreePool(
IN PVOID P //要释放的地址
);
VOID
ExFreePoolWithTag(
IN PVOID P, //要释放的地址
IN ULONG Tag
);
///
链表操作
检测链表是否为空 IsListEmpty
从首部插入链表 InsertHeadList
从尾部部插入链表 InsertTailList
从链表删除 RemoveHeadList or RemoveTeadList
///
频繁使用内存方法 使用Lookaside
初始化Lookaside函数 非分页内存ExInitializeNPagedLookasideList 分页内存ExInitializePagedLookasideList
申请内存操作 非分页内存ExAllocateFromNPagedLookasideList 分页内存ExAllocateFromPagedLookasideList
回收内存操作 非分页内存ExFreeToNPagedLookasideList 分页内存ExFreeToPagedLookasideList
删除对象操作 非分页内存ExDeleteNPagedLookasideList 分页内存ExDeletePagedLookasideList
///
内存间复制(非重叠)
VOID
RtlCopyMemory(
IN VOID UNALIGNED *Destination, //表示要复制内存的目的地址。
IN CONST VOID UNALIGNED *Source, //表示要复制内存的源地址。
IN SIZE_T Length //表示要复制内存的长度,单位是字节。
);
内存间复制(可重叠)
VOID
RtlMoveMemory(
IN VOID UNALIGNED *Destination, //表示要复制内存的目的地址。
IN CONST VOID UNALIGNED *Source, //表示要复制内存的源地址。
IN SIZE_T Length //表示要复制内存的长度,单位是字节。
);
///
填充内存
VOID
RtlFillMemory(
IN VOID UNALIGNED *Destination, //目的地址。
IN SIZE_T Length, //长度。
IN UCHAR Fill //需要填充的字节。
);
将内存填充为零
VOID
RtlZeroMemory(
IN VOID UNALIGNED *Destination, //目的地址。
IN SIZE_T Length //长度。
);
内存比较
ULONG
RtlEqualMemory(
CONST VOID *Source1, //比较的第一个内存地址。
CONST VOID *Source2, //比较的第二个内存地址。
SIZE_T Length //比较的长度,单位为字节。
);
///
数据类型的定义
变量类型 C语言的定义 DDK中的定义
void VOID
8位有符号整数 cahr CHAR
8位--符号整数 short SHORT
32位有符号整数 long LONG
wchat_t WCHAR
以Null结束的字符串 char* PCHAR
wchat_t* PWCHAR
///
检查内存可用性
检查某段内存是否可读写
VOID
ProbeForRead(
IN CONST VOID *Address, //需要检查的内存的地址。
IN ULONG Length, //需要被检查的内存的长度,单位是字节。
IN ULONG Alignment //描述该段内存是以多少字节对齐的。
);
VOID
ProbeForWrite(
IN CONST VOID *Address, //需要检查的内存的地址。
IN ULONG Length, //需要被检查的内存的长度,单位是字节。
IN ULONG Alignment //描述该段内存是以多少字节对齐的。
);
///
异常处理(r3下可以使用异常处理r0下也可以使用)
_try
{
}
_except(filter_value)
{
}
filter_value值有3种
EXCEPTION_EXECUTE_HANDLER 该值为1.进入到_except进行错误处理,处理完后不再回到_try{}块中,转而继续执行。
EXCEPTION_CONTINUE_SEARCH 该值为0.不使用_excep块中的异常处理,转而向上一层回卷。如果已经是最外层,则向操作系统
请求异常处理函数。
EXCEPTION_CONTINUE_EXECUTION 该值为-1.重复先前错误的指令,这个在驱动程序中很少用到。
//
_try
{
}
_finally
{
}
触发异常函数
ExRaiseStatus 用指定状态代码触发异常
ExRaiseAccessViolation 触发STATUS_ACCESS_VIOLATION异常
ExRaiseDatatypeMisalignment 触发STATUS_DATATYPE_MISALIGNMENT异常
///
断言 判断是否为空
ASSERT(str!=NULL); //断言
///