IsBadStringPtr

Функция IsBadStringPtr проверяет, имеет ли вызывающий процесс права чтения памяти, но которую указывает строковый указатель.

function IsBadStringPtr(
  lpsz: PChar;    // указатель на строку
  ucchMax: UINT   // иаксимальная длина строки
): BOOL; stdcall;

Параметры

lpsz [in]
Указатель на строку, заканчивающуюся символом с нулевым кодом, либо Unicode, либо ANSI.

ucchMax [in]
Указыает максимальный размер строки. Функция IsBadStringPtr будет проверять доступ по указанному указателю байт за байтом либо до тех пор, пока не дойдет до нулевого символа, либо пока количество проверенных байт не достигнет значения ucchMax. Если этот параметр нуль, то функция вернет False.

Возвращаемое значение

Если вызывающий процесс имеет права чтения всех символов строки, на которую указывает параметр lpsz, до заканчивающего строку нулевого символа включительно, либо имеет права чтения всего всего диапазона памяти, заданного параметрами lpsz и ucchMax, то функция возвращает False.

Если длина строки превышает ucchMax и вызвающий процесс не имеет прав чтения всех первых ucchMax символов строки, то возвращенным значением будет False.

Если длина строки меньше значения ucchMax и вызвающий процесс не имеет прав чтения некоторых символов строки, то возвращенным значением будет False.

Если эта функция скомпилирована в отладочной версии приложения, и вызывающий процесс не имеет прав чтения строки по указанному адресу, то эта функция может выполниться аналогично проедуре Assert и послужить точкой останова в отладчике. По выходу из отладчика функция, как и положено, вернет True. Такое поведение при проектировании приложения служит для облегчения процесса отладки приложения.

Описание

Обычное использование этой функции - тест на допустимость передаваемых строковых параметров. Часто эта функция используется при проектировании DLL, где невозможно предугадать, какое значение будет передано пользователем в качестве аргумента функции.

Потоки в процессе должны выполняться совместно, в частности, один поток не может освободить память, в которой нуждается второй. Использование данной функции не отрицает это утверждение. Если это не выполнено, то поведение приложения не может быть спрогнозировано.

Разименование потенциально неверных указателей может послужить причиной получения неверных данных, некоторые из них, например размеры сруктур, массивов, и т.д., могут привести к непомерному увеличению стека потока и к запрету на увеление стека в других потоках. Если поток, который интенсивно использует стек, натолкнулся на отказ при попытке увеличить свой стек, то это приводит к немедленному завершению родительского процесса с указанием ошибки в всплывающем окне или диагностической информации.

Если вызывающий процесс имеет права чтения некоторых, символов строки, на которую указывает lpsz, но при этом:

  • Длина строки превосходит ucchMax. Среди первых ucchMax символов имеются такие, которые не являются доступными для чтения;
  • Длина строки меньше ucchMax. Среди символов строки имеются такие, которые не являются доступными для чтения,
  • то функция вернет False.

    В случае многопоточности возможна ситуация, когда один из потоков изменяет права доступа к фрагменту памяти (например, освобождает память) после того, как другой поток этот фрагмент уже протестировал. Даже если функция IsBadStringPtr показала вам, что вы имеем доступ для чтения в указанной строки, вы все равно должны помещать обращения к такойпамяти в try..finally блок. Использование блоков структурной обработки исключительных ситуаций позволяют системе уведомить процесс о том, что случилось нарушение доступа (access violation), и предоставлят процессу удобные средства для обработки исключения. Для более детальной информации смотрите раздел "Структурная обработка исключений".

    Требования

    Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
    Windows 95/98: Требуется Windows 95 или более поздняя версия
    Бибиотека: Kernel32.dll
    Подключаемый модуль: Windows
    Unicode: Реализована Unicode и ANSI версии под Windows NT/2000

    Смотри также:

  • виртуальная память,
  • проверка доступа,
  • список прочих функций,
  • IsBadCodePtr,
  • IsBadReadPtr,
  • IsBadWritePtr
  • НазадIsBadReadPtr IsBadWritePtrВперед

    © Mystic, 2002