程序异常崩溃,多数是有内存访问异常引起。为定位崩溃位置通常考虑加强内存访问控制,如此有必要进行内存可用性判断,从《Windows核心编程》中看到内存指针的可用性判断方法,感觉还不错,此处记录下。
判断内存指针的可用性,是通过判断指针所指向的虚拟内存页面的状态和属性来实现的。Windows提供了相关的API。相同的功能也可以通过获取虚拟内存页面属性来判断。
1)IsBadCodePtr:
判断调用进程是否拥有对指定地址内存的读操作权限,函数原型如下:
BOOL WINAPI IsBadCodePtr(
__inFARPROC lpfn//指定的内存地址
);
返回值表示当前进程是否拥有对该地址内存的读取权限。
2)IsBadReadPtr:
判断调用进程是否拥有对指定地址段内存的读操作权限,函数原型如下:
BOOL WINAPI IsBadReadPtr(
__inconstVOID *lp,//指定起始内存地址
__inUINT_PTR ucb//从起始内存地址开始的内存块长度
);
返回值表示当前进程是否拥有对该段地址内存块的读取权限。
3)IsBadStringPtr:
判断调用进程是否拥有对指定字符串指针的读取权限,函数原型如下:
BOOL WINAPI IsBadStringPtr(
__inLPCTSTR lpsz,//指向字符串的指针
__inUINT_PTR ucchMax//读取字符串的最大长度
);
返回值表示当前进程是否拥有字符串指针指向的字符串的读取权限。
4)IsBadWritePtr:
判断调用进程是否拥有对指定地址段内存的写操作权限,函数原型如下:
BOOL WINAPI IsBadWritePtr(
__inLPVOID lp,//指向起始内存地址
__inUINT_PTR ucb//从起始内存地址开始的内存块长度
);
返回值表示当前进程是否拥有该段地址内存块的写入权限。
http://www.it610.com/article/2564887.htm