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


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

Предупреждение

Функция ProbeForWrite не рекомендуется использовать в текущем программном обеспечении и включена только для обеспечения совместимости с журналами. Вместо этого используйте ProbeForRead при проверке пользовательских буферов. Дополнительные сведения см. в разделе Примечания.

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

Синтаксис

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

Параметры

[in, out] Address

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

[in] Length

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

[in] Alignment

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

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

None

Remarks

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

В следующей таблице описаны свойства каждой подпрограммы проверки буфера в режиме ядра.

Поведение ProbeForRead ProbeForWrite
Подтверждает, что буфер описывает область в адресном пространстве пользовательского режима, если длина не равна нулю. x x
Подтверждает, что базовый адрес и длина буфера не переносят за пределы максимального значения указателя. x x
Подтверждает, что буфер выравнивается по запрошенной границе выравнивания, если длина не равна нулю x x
Подтверждает, что буфер изначально доступен для записи (может измениться в любое время, если приложение пользовательского режима повторно защищает свое адресное пространство). x
Доступ к каждой странице в буфере (дополнительные издержки) x
Изменяет каждую страницу в буфере (может привести к непредвиденному поведению, если один и тот же буфер используется параллельно с несколькими запросами драйвера). x

Исторически сложилось так, что на некоторых процессорах, которые не учитывали разрешения только на чтение для кода в режиме ядра, существовали значимые функциональные различия между ProbeForWrite и ProbeForRead. В таких случаях операционная система ранее полагалась на ProbeForWrite, выполняющую явную возможность записи по страницам проверка. Это различие больше не имеет смысла для процессоров, поддерживаемых Windows NT 4.0 или более поздней версии.

Устаревшие примечания

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

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

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

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

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

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

Требования

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

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

ProbeForRead