IoSetMasterIrpStatus 函数 (ntddk.h)

IoSetMasterIrpStatus 例程有条件地将 IRP 中的 Status 值替换为指定的 NTSTATUS 值。

语法

void IoSetMasterIrpStatus(
  [in, out] PIRP     MasterIrp,
  [in]      NTSTATUS Status
);

参数

[in, out] MasterIrp

指向主 IRP 的指针。 有关详细信息,请参阅“备注”。

[in] Status

一个 NTSTATUS 值,用于与主 IRP 中 I/O 状态块Status 成员进行比较。

返回值

备注

收到 IRP 后,驱动程序可以创建两个或多个从属 IRP 来执行原始 (或主) IRP 请求的工作。 当从属 IRP 完成后,驱动程序会从从 IRP 收集完成状态代码,并将它们合并为主 IRP 形成单个完成状态代码。

IoSetMasterIrpStatus 实现统一策略,用于将多个从属 IRP 中的状态代码合并为主 IRP 的状态代码。 例如,如果主 IRP 拆分为两个从属 IRP,其中一个从属 IRP 成功,另一个失败,则失败 IRP 中的状态代码将用作主 IRP 的状态代码。 但是,如果两个从属 IRP 都失败,则更严重的故障代码将用作主 IRP 的状态。

在第一次调用 IoSetMasterIrpStatus 之前,驱动程序将主 IRP 中的 IoStatus.Status 成员设置为STATUS_SUCCESS (或STATUS_FT_READ_FROM_COPY,以防预期) 。 接下来,当每个从属 IRP 完成时,驱动程序会调用 IoSetMasterIrpStatus ,以将来自此 IRP 的状态代码与主 IRP 中的状态代码合并。 在此调用中, PIRP 参数指向主 IRP,Status 参数设置为 从属 IRP 中 IoStatus.Status 成员的值。

作为一般规则,在以下情况下,IoSetMasterIrpStatus 会将 PIRP-IoStatus.Status > 中的状态代码替换为 Status 值:

  • PIRP* 中的状态值 STATUS_SUCCESS,Status 是错误代码。
  • PIRP* 中的状态值是错误代码,但 Status 是更严重的错误代码。
一般规则有两个例外。 状态值 STATUS_VERIFY_REQUIRED 始终替换 PIRP* 中的状态值。 状态值 STATUS_FT_READ_FROM_COPY 永远不会替换 PIRP* 中的状态值。

要求

要求
最低受支持的客户端 从Windows 8开始可用。
目标平台 通用
标头 ntddk.h (包括 Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 任何级别。

另请参阅

IRP