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 | 对于流写入,允许在流标头中设置KSSTREAM_HEADER_OPTIONSF_TYPECHANGED标志。 这意味着流标头的长度不是延长的,即使指示了扩展的标头大小。 此外,在这种情况下,IRP 中可能只有一个流标头。 与此标头关联的缓冲区包含新的数据格式。 对于系统内存数据流,缓冲区不应从协商分配器获取,因为它不是数据流的一部分。 |
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | ks.h (包括 Ks.h) |
库 | Ks.lib |