在驱动程序开发中,对内存的操作要格外小心。如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃。同样,当某段内存是不可读的情况下,驱动程序试图去读,同样会导致系统的崩溃。
DDK提供了两个函数,帮助程序员在不知道某段内存是否可读写的情况下,试探这段内存可读写性。这两个函数分别是 ProbeForRead 和 ProbeForWrite。
ProbeForRead 的原型结构如下:
void ProbeForRead([in] const volatile VOID *Address,[in] SIZE_T Length,[in] ULONG Alignment
);// Address: 需要被检查的内存的地址
// Length: 需要被检查的内存的长度
// Alignment: 描述该字段内存是以多少字节对齐的。
ProbeForWrite 的原型结构如下:
void ProbeForWrite([in, out] volatile VOID *Address,[in] SIZE_T Length,[in] ULONG Alignment
);// Address: 需要被检查的内存的地址
// Length: 需要被检查的内存的长度
// Alignment: 描述该字段内存是以多少字节对齐的。
这两个函数不是返回该段内存是否可读写,而是当不可读写的时候,引发一个异常(Exception)。这个异常需要用到微软编译器提供的“结构化异常”处理办法。“结构化异常”机制会轻松地检测到这种异常,进而做出相应的异常处理。关于结构化异常的介绍见下一戒。