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) (如果有)的指针。 如果没有与设备对象关联的 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 请求之前等待对话框。 筛选器驱动程序在 I/O 请求完成后等待,然后调用 KeLeaveCriticalRegion (这会重新启用) 正常内核 APC。

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

要求

要求
目标平台 通用
标头 ntddk.h (包括 Ntddk.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= APC_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlIoApcLte (wdm)

另请参阅

IoGetRelatedDeviceObject

IoSetHardErrorOrVerifyDevice

IoSetThreadHardErrorMode