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