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) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= APC_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport)、IrqlIoApcLte(wdm) |