Функция 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 |