程序異常崩潰,多數是有內存訪問異常引起。為定位崩潰位置通常考慮加強內存訪問控制,如此有必要進行內存可用性判斷,從《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