IoRaiseHardError 函数 (ntddk.h)

IoRaiseHardError 例程会导致对话框显示警告用户设备 I/O 错误已发生,这可能表示物理设备出现故障。

语法

void IoRaiseHardError(
  [in]           PIRP           Irp,
  [in, optional] PVPB           Vpb,
  [in]           PDEVICE_OBJECT RealDeviceObject
);

参数

[in] Irp

指向由于设备 I/O 错误而失败的 IRP 的指针。

[in, optional] Vpb

指向装载的文件对象的卷参数块(如果存在)的指针。 如果没有与设备对象关联的 VPB,则此参数 NULL

[in] RealDeviceObject

指向表示 I/O作失败的物理设备的设备对象的指针。

返回值

没有

言论

最高级别的驱动程序,尤其是文件系统驱动程序,调用 IoRaiseHardError

警告

由于 IoRaiseHardError 使用普通内核 APC 创建用户对话框,因此在发生设备错误时禁用正常内核 APC 时,可能会发生死锁。 例如:

  1. 高级筛选器驱动程序调用 KeEnterCriticalRegion(这会禁用正常的内核 APC),并将 I/O 请求发送到文件系统驱动程序。 筛选器驱动程序在筛选器驱动程序调用 KeLeaveCriticalRegion(可重新启用正常内核 APC)之前等待文件系统驱动程序完成请求。

  2. 文件系统上发生错误,文件系统驱动程序调用 IoRaiseHardError 向用户报告错误。 文件系统驱动程序在对话框中等待。

  3. 死锁现在存在:IoRaiseHardError 创建的正常内核 APC 创建对话框,等待启用正常内核 APC。 文件系统在对话框上等待,然后才能完成 I/O 请求。 筛选器驱动程序在调用 KeLeaveCriticalRegion(可重新启用正常内核 APC)之前等待 I/O 请求完成。

此例程的行为取决于正在运行的线程的硬错误的当前状态。 如果通过调用 IoSetThreadHardErrorMode禁用了硬错误,则此例程将完成由 Irp 指定的 IRP,而无需将数据传输到用户缓冲区。 此外,不会发送任何消息通知用户此失败。

要求

要求 价值
目标平台 普遍
标头 ntddk.h (包括 Ntddk.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL
DDI 符合性规则 HwStorPortProhibitedDIs(storport)IrqlIoApcLte(wdm)

另请参阅

IoGetRelatedDeviceObject

IoSetHardErrorOrVerifyDevice

IoSetThreadHardErrorMode