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