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,则可能会出现死锁。 例如:
上层筛选器驱动程序调用 KeEnterCriticalRegion (这会禁用常规内核 APC) 并将 I/O 请求发送到文件系统驱动程序。 筛选器驱动程序等待文件系统驱动程序完成请求后,筛选器驱动程序调用 KeLeaveCriticalRegion (这会重新启用) 正常内核 APC。
文件系统上发生错误,文件系统驱动程序调用 IoRaiseHardError 向用户报告错误。 文件系统驱动程序在对话框中等待。
死锁现在存在: 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) |