Поделиться через


Функция ProbeForRead (wdm.h)

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

Синтаксис

void ProbeForRead(
  [in] const volatile VOID *Address,
  [in] SIZE_T              Length,
  [in] ULONG               Alignment
);

Параметры

[in] Address

Указывает начало буфера пользовательского режима.

[in] Length

Указывает длину буфера пользовательского режима в байтах.

[in] Alignment

Указывает требуемое выравнивание (в байтах) начала буфера пользовательского режима.

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

None

Remarks

Если указанный диапазон памяти не входит в диапазон адресов в пользовательском режиме, ProbeForRead вызывает исключение STATUS_ACCESS_VIOLATION. Если начало диапазона адресов не выравнивается по границе байтов, заданной параметром Выравнивание, ProbeForRead вызывает исключение STATUS_DATATYPE_MISALIGNMENT.

Драйверы режима ядра должны использовать ProbeForRead для проверки доступа на чтение к буферам, выделенным в пространстве пользователя. Чаще всего он используется во время METHOD_NEITHER ввода-вывода для проверки буфера пользователя, на который указывает Irp —> UserBuffer.

Драйверы должны вызывать ProbeForRead внутри блока try/except . Если подпрограмма вызывает исключение, драйвер должен завершить IRP с соответствующей ошибкой. Обратите внимание, что последующие доступы драйвера к буферу пользовательского режима также должны быть инкапсулированы в блок try/except . Вредоносное приложение может иметь другой поток, удаляющий, заменяющий или изменяющий защиту диапазонов адресов пользователей в любое время (даже после или во время вызова ProbeForRead или ProbeForWrite). Дополнительные сведения см. в разделе Обработка исключений.

Не используйте эту подпрограмму для адресов в режиме ядра; он вызовет исключение.

Если Irp-RequestorMode> = KernelMode, поля Irp-AssociatedIrp.SystemBuffer> и Irp-UserBuffer> не содержат адресов в пользовательском режиме, а вызов ProbeForRead для проверки буфера, на который указывает любое из полей, вызовет исключение.

Если length = 0, ProbeForRead не проверяет адрес. В этом случае подпрограмма не создает исключение для адреса, который является неправильным или находится за пределами диапазона допустимых адресов пользователей.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Правила соответствия DDI HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm)

См. также раздел

ProbeForWrite