Функция IsBadReadPtr проверяет, имеет ли процесс права чтения указанного региона памяти.
function IsBadReadPtr( lp: Pointer; // адрес памяти ucb: UINT // размер региона ): BOOL; stdcall;
Параметры
lp [in]
Указатель на начальный байт региона памяти.
ucb [in]
Задает размер региона памяти. Если этот параметр нулевой, то функция возвращает
True.
Возвращаемое значение
В случае, когда вызывающий процесс имеет права чтения всех байт в указанном регионе, функция возвращает False.
В случае, когда функция не имеет права чтения хотя бы для какого-то поддиапазона указанного региона, функция возвращает True.
Если эта функция скомпилирована в отладочной версии приложения, и вызывающий процесс не имеет прав чтения памяти по указанному региону, то эта функция может выполниться аналогично проедуре Assert и послужить точкой останова в отладчике. По выходу из отладчика функция, как и положено, вернет True. Такое поведение при проектировании приложения служит для облегчения процесса отладки приложения.
Описание
Обычное использование этой функции - тест на допустимость передаваемых в качестве параметров структур, массивов, и т. д. Часто эта функция используется при проектировании DLL, где невозможно предугадать, какое значение будет передано пользователем в качестве аргумента функции.
Потоки в процессе должны выполняться совместно, в частности, один поток не может освободить память, в которой нуждается второй. Использование данной функции не отрицает это утверждение. Если это не выполнено, то поведение приложения не может быть спрогнозировано.
Разименование потенциально неверных указателей может послужить причиной получения неверных данных, некоторые из них, например размеры сруктур, массивов, и т.д., могут привести к непомерному увеличению стека потока и к запрету на увеление стека в других потоках. Если поток, который интенсивно использует стек, натолкнулся на отказ при попытке увеличить свой стек, то это приводит к немедленному завершению родительского процесса с указанием ошибки в всплывающем окне или диагностической информации.
Если процесс имеет права чтения по указанному адресу, но это не относится ко всем байтам диапазона, то функция возвратит True.
В случае многопоточности возможна ситуация, когда один из потоков изменяет права доступа к фрагменту памяти (например, освобождает память) после того, как другой поток этот фрагмент уже протестировал. Даже если функция IsBadReadPtr показала вам, что вы имеем доступ для чтения в указанном регионе памяти, вы все равно должны помещать обращения к такойпамяти в try..finally блок. Использование блоков структурной обработки исключительных ситуаций позволяют системе уведомить процесс о том, что случилось нарушение доступа (access violation), и предоставлят процессу удобные средства для обработки исключения. Для более детальной информации смотрите раздел "Структурная обработка исключений".
Требования
Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Требуется Windows 95 или более поздняя версия
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows
Смотри также:
IsBadHugeWritePtr |
IsBadStringPtr![]() |
© Mystic, 2002