Функция KsProbeStreamIrp (ks.h)

Функция KsProbeStreamIrp вносит указанные изменения в входные и выходные буферы заданного IRP на основе переданных флагов, а затем проверяет заголовок потока. Это полезно при локализации обработки исключений или выполнении асинхронной работы с IRP. Результирующий IRP имеет формат METHOD_OUT_DIRECT или METHOD_IN_DIRECT, за исключением того, что доступ к буферу данных может быть IoModifyAccess в зависимости от флагов, переданных этой функции, или флагов в заголовке потока.

Синтаксис

KSDDKAPI NTSTATUS KsProbeStreamIrp(
  [in, out]      PIRP  Irp,
  [in]           ULONG ProbeFlags,
  [in, optional] ULONG HeaderSize
);

Параметры

[in, out] Irp

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

[in] ProbeFlags

Задает флаги, указывающие способ проверки потоковой передачи IRP; флаги перечислены в следующей таблице.

[in, optional] HeaderSize

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

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

Функция KsProbeStreamIrp возвращает STATUS_SUCCESS в случае успешного выполнения или возвращает ошибку памяти или доступа.

Комментарии

Если функция используется только для выделения MDL, а не для проверки и блокировки адресов, вызывающий объект должен иметь подпрограмму завершения для очистки MDL. Например, механизм JIT-блокировки может выделять список MDL, но блокировать память только по мере необходимости. Клиент должен предоставить код очистки, чтобы удалить частично заблокированный список MDL до завершения IRP, предположительно в процедуре завершения.

Если заголовки уже скопированы в системный буфер, они не проверяются повторно. Как правило, вызов функции KsProbeStreamIrp несколько раз с помощью IRP не является вредным. После вызова функции заголовки потока становятся доступны в PIRP. AssociatedIrp.SystemBuffer. Если многомерные библиотеки буфера потока выделены, они доступны через PIRP. MdlAddress.

Для переменной ProbeFlags используются следующие определения:

ProbeFlags Значение Описание
KSPROBE_READ Указывает, что операция является потоком чтения на устройстве. Это значение по умолчанию.
KSPROBE_WRITE Указывает, что операция является потоковой записью на устройстве.
KSPROBE_ALLOCATEMDL Указывает, что многомерные списки должны быть выделены для буферов потока, если они еще не были выделены. Если буферы потока отсутствуют, флаг игнорируется. Если KSPROBE_PROBEANDLOCK не указан в то же время, что и этот флаг, вызывающий объект должен иметь подпрограмму завершения, чтобы очистить все MDL, если не все многомерные библиотеки были успешно прощупированы и заблокированы.
KSPROBE_PROBEANDLOCK Если задано KSPROBE_ALLOCATEMDL, указывает, что память, на которую ссылаются многомерные библиотеки для буферов потока, должна проверяться и блокироваться. Если флаг выделения MDL не задан, этот флаг игнорируется, даже если выделение MDL было ранее установлено. Метод проверки определяется типом передаваемого IRP. Для операции записи используется IoReadAccess . Для операции чтения используется IoWriteAccess . Если клиент, отправляющий данные, использует невыгребованный пул, инициализируются соответствующие многомерные списки, а не проверка и блокировка.
KSPROBE_SYSTEMADDRESS Извлекает системный адрес для каждого MDL в цепочке, поэтому вызывающей объекту не нужно делать это в отдельном шаге. Этот параметр игнорируется, если флаги пробы и блокировки не заданы, даже если ранее были проверены многомерные списки.
KSPROBE_ALLOWFORMATCHANGE Для записи Stream позволяет задать флаг KSSTREAM_HEADER_OPTIONSF_TYPECHANGED в заголовке потока. Это означает, что заголовок потока не имеет расширенной длины, даже если указан расширенный размер заголовка. Кроме того, в этом случае в IRP может содержаться только один заголовок потока. Буфер, связанный с этим заголовком, содержит новый формат данных. Для потоков данных системной памяти буфер не должен быть получен из согласованного распределителя, так как он не является частью потока данных.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ks.h (включая Ks.h)
Библиотека Ks.lib