ddk Windows内存管理

对 Windows驱动开发技术详解 第五章的(Windows内存管理)自我理解
2009年09月16日 星期三 20:28

对 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);   //断言

///

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值