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 的 。 例如,实时锁定机制可以分配 MDL 列表,但仅根据需要锁定内存。 客户端必须在完成 IRP 之前提供清理代码以删除部分锁定的 MDL 列表,这大概是在完成例程中。

如果标头似乎已复制到系统缓冲区,则不会再次对其进行验证。 通常,使用 IRP 多次调用 KsProbeStreamIrp 函数并不有害。 调用函数后,流标头在 PIRP 中可用。AssociatedIrp.SystemBuffer。 如果已分配流缓冲区 MDL,则可以通过 PIRP 获取它们。MdlAddress。

以下定义用于 ProbeFlags 变量:

ProbeFlags 价值 说明
KSPROBE_READ 指示操作是在设备上读取的流。 这是默认值。
KSPROBE_WRITE 指示操作是设备上的流写入。
KSPROBE_ALLOCATEMDL 指示应为流缓冲区分配 MDL(如果尚未分配)。 如果不存在流缓冲区,则忽略标志。 如果未在此标志同时指定KSPROBE_PROBEANDLOCK,则调用方必须具有完成例程才能清理所有 MDL(如果并非所有 MDL 都已成功探测和锁定)。
KSPROBE_PROBEANDLOCK 如果设置了KSPROBE_ALLOCATEMDL,则指示应探测和锁定流缓冲区的 MDL 引用的内存。 如果未设置 MDL 分配标志,则即使以前已进行 MDL 分配,也会忽略此标志。 探测方法由传递的 IRP 类型决定。 对于写入操作,使用 IoReadAccess 。 对于读取操作,使用 IoWriteAccess 。 如果发送数据的客户端使用非分页池,则会初始化相应的 MDL,而不是探测和锁定。
KSPROBE_SYSTEMADDRESS 检索链中每个 MDL 的系统地址,以便调用方无需在单独的步骤中执行此操作。 如果未设置探测和锁定标志,则忽略这一点,即使以前已探测过 MDL 也是如此。
KSPROBE_ALLOWFORMATCHANGE 对于Stream Write,允许在流标头中设置KSSTREAM_HEADER_OPTIONSF_TYPECHANGED标志。 这意味着流标头的长度不是扩展的,即使已指示扩展标头大小。 此外,在这种情况下,IRP 中可能只包含一个流标头。 与此标头关联的缓冲区包含新的数据格式。 对于系统内存数据流,不应从协商分配器获取缓冲区,因为它不是数据流的一部分。

要求

要求
目标平台 通用
标头 ks.h (包括 Ks.h)
Library Ks.lib