3.1.7 内存操作的运行时函数
运行时函数是由编译器提供的,它在程序运行时必不可少。不同的操作系统,运行时函数的实现方法也有所不同,但其接口基本一致。例如malloc函数就是典型的运行时函数,所有编译器厂商都必须提供这个函数,但在不同操作系统上它的实现方法不尽相同。
在Windows驱动程序开发中,经常用到的内存操作运行时函数如下。
1.内存间复制
(1)非重叠的情况
在驱动程序开发中经常用到内存间的复制,WDK(Windows Driver Kit)使用RtlCopyMemory函数实现该功能,其原型如下:
VOID RtlCopyMemory(IN VOID UNALIGNED*Destination,
IN CONST VOID UNALIGNED*Source,IN SIZE_T Length);
上述函数中,参数Destination表示要复制内存的目标地址;参数Source表示要复制内存的源地址;参数Length表示要复制的内存的长度,单位是字节。
(2)可重叠的情况
用RtlCopyMemory函数可以复制内存,但是它的实现没有考虑目标内存与源内存重叠的情况。如果存在重叠的情况,可使用WDK提供的RtlMoveMemory函数,其原型如下:
VOID RtlMoveMemory(IN VOID UNALIGNED*Destination,
IN CONST VOID UNALIGNED*Source,IN SIZE_T Length);
上述函数中,参数Destination表示要复制内存的目标地址;参数Source表示要复制内存的源地址;参数Length表示要复制的内存长度,单位是字节。
2.填充内存
在驱动程序开发中,经常会使用固定的字节值对某段内存区域进行填充,WDK为程序员提供了RtlFillMemory函数实现该功能,其原型如下:
VOID RtlFillMemory(IN VOID UNALIGNED*Destination,
IN SIZE_T Length,IN UCHAR Fill);
上述函数中,参数Destination为目标内存的地址;参数Length为待填充内存的长度;参数Fill为所填充的字节内容。
在驱动程序开发中,还经常要对某段内存填零,为此,WDK提供了RtlZeroMemory函数实现此功能,其原型如下:
VOID RtlZeroMemory(IN VOID UNALIGNED*Destination,
IN SIZE_T Length);
上述函数中,参数Destination为目标内存的地址;参数Length为待填内存的长度。
3.内存比较
在驱动程序的开发中,可能要比较两块内存的内容是否一致,可采用RtlCompareMemory函数实现该功能,其原型如下:
SIZE_T RtlCompareMemory(IN CONST VOID*Source1,
IN CONST VOID*Source2,IN SIZE_T Length);
上述函数中,参数Sourcel为比较的第一个内存地址;参数Source2为比较的第二个内存地址;参数Length为待比较内存的长度,单位为字节。此函数返回两块内存相等的字节数。
同时,WDK提供了RtlEqualMemory函数,直接判断两块内存是否一致,其原型如下:
LOGICAL RtlEqualMemory(CONST VOID*Source1,
CONST VOID*Source2,SIZE_T Length);
函数RtlEqualMemory在两块内存一致的情况下返回非0值,否则返回0值。