IRP_MJ_PNP (FS 和篩選驅動程式)

傳送時

每當系統上發生 隨插即用 活動時,隨插即用 管理員就會傳送IRP_MJ_PNP要求。 根據次要函式程序代碼,其他操作系統元件和其他核心模式驅動程式也可以傳送特定IRP_MJ_PNP要求。

如需驅動程式 隨插即用 IRP 處理需求的詳細資訊,請參閱 隨插即用

如需IRP_MJ_PNP次要函式代碼的參考資訊,請參閱 隨插即用 次要 IRP

作業:檔案系統驅動程式

文件系統應該檢查次要函式程式代碼,以判斷要求的作業。 檔案系統必須處理下列次要函式代碼:

程式碼 描述
IRP_MN_CANCEL_REMOVE_DEVICE 指出先前的查詢移除裝置要求已取消。 此要求會傳送給文件系統警示,以防需要執行與取消相關的任何清除。
IRP_MN_QUERY_REMOVE_DEVICE 表示即將移除裝置。 如果文件系統掛接在裝置上,PnP 管理員會將此要求傳送至文件系統和任何文件系統篩選器。 如果裝置有開啟的句柄,文件系統通常會失敗查詢移除要求。 如果沒有,文件系統通常會鎖定磁碟區,以防止未來建立要求成功。 如果掛接的文件系統不支援查詢移除要求,PnP 管理員會失敗裝置的查詢移除要求。
IRP_MN_REMOVE_DEVICE 表示即將移除裝置。 如果文件系統掛接在裝置上,PnP 管理員會將此 IRP 傳送至檔案系統和任何檔案系統篩選器。 檔系統應該立即將此 IRP 傳遞至裝置的記憶體驅動程式,設定檔系統接著卸載磁碟區的完成例程。
IRP_MN_START_DEVICE 指出正在啟動裝置。 檔系統應該將此 IRP 傳遞至裝置的記憶體驅動程式。
IRP_MN_SURPRISE_REMOVAL 指出裝置已移除。 如果裝置上掛接檔系統,PnP 管理員會將此 IRP 傳送至檔案系統和任何檔案系統篩選器。 檔系統應該立即將此 IRP 傳遞至裝置的記憶體驅動程式,設定檔系統接著卸載磁碟區的完成例程。

作業:舊版文件系統篩選驅動程式

檔案系統篩選驅動程式應該根據下列指導方針來處理 PnP IRP:

  • 當用戶即將正常移除磁碟區時,PnP 管理員會傳送IRP_MN_QUERY_REMOVE_DEVICE要求。 在接收此 IRP 時,篩選條件必須關閉磁碟區上所有開啟的句柄,並將 IRP 向下傳遞至堆疊上的下一個較低驅動程式。 此步驟很重要。 如果驅動程式無法關閉所有開啟的句柄,則會防止卸載磁碟區,進而防止實體裝置退出。

    在收到IRP_MN_QUERY_REMOVE_DEVICE要求時,FAT 文件系統會立即卸除它可安全地移除的所有磁碟區。 因此,附加至 FAT 磁碟區的任何篩選應預期會在呼叫篩選完成例程之前釋放其篩選裝置物件。 NTFS 檔系統不會這麼做。 因此,連結至NTFS磁碟區的篩選可能會預期當呼叫篩選完成例程時,其裝置物件仍會附加至磁碟區。

  • 在收到IRP_MN_QUERY_REMOVE_DEVICE要求之後,但在收到IRP_MN_CANCEL_REMOVE_DEVICE或IRP_MN_REMOVE_DEVICE要求之前收到的 IRP,可以安全地將記憶體裝置堆疊的堆疊傳遞給失敗,或保留在佇列中,直到收到取消移除或移除裝置要求為止。

  • 如果篩選條件在已關閉磁碟區的所有開啟句柄之後收到IRP_MN_CANCEL_REMOVE_DEVICE要求,以回應IRP_MN_QUERY_REMOVE_DEVICE要求,它可以重新開啟句柄。 不過,篩選條件只能在完成例程中重新開啟,在堆疊中驅動程式成功完成 IRP 之後。

  • 當篩選收到IRP_MN_REMOVE_DEVICE要求時,通常不需要在 IRP 上執行任何處理,除非已在佇列中保存 IRP,因為收到IRP_MN_QUERY_REMOVE_DEVICE要求。 如果它在佇列中保存 IRP,篩選條件必須清除磁碟區的所有 IRP,並在將 IRP 向下傳遞至堆疊上的下一個較低驅動程式之前 ,將其取消 佇列。

  • 在收到IRP_MN_SURPRISE_REMOVAL要求時,篩選應該執行下列作業:

    • 關閉磁碟區的所有開啟句柄,因為檔系統在沒有未處理的參考之前無法清除堆疊。

    • 如果篩選條件在佇列中保存 IRP,它可能會失敗,或將它們傳遞至堆疊,讓記憶體裝置堆疊失敗。

參數

文件系統或篩選驅動程式會針對指定的 IRP 呼叫 IoGetCurrentIrpStackLocation ,以取得 IRP 中本身堆疊位置的指標。 在下列參數中, Irp 指向 IRP而 IrpSp 指向 IO_STACK_LOCATION。 驅動程式可以使用下列 IRP 成員中設定的資訊,以及 IRP 堆疊位置中設定的資訊來處理 隨插即用 要求:

  • DeviceObject 是目標裝置物件的指標。

  • Irp->IoStatus 指向 IO_STATUS_BLOCK結構, 該結構會接收最終完成狀態和所要求作業的相關信息。

  • IrpSp->FileObject 應該指向 PnP IRP 的 NULL

  • IrpSp->MajorFunction 設定為 IRP_MJ_PNP。

  • IrpSp->MinorFunction 設定為下列其中一個值:

    • IRP_MN_CANCEL_REMOVE_DEVICE
    • IRP_MN_QUERY_REMOVE_DEVICE
    • IRP_MN_REMOVE_DEVICE
    • IRP_MN_START_DEVICE
    • IRP_MN_SURPRISE_REMOVAL

另請參閱

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_PNP (WDK 核心參考)

IRP_MN_CANCEL_REMOVE_DEVICE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_START_DEVICE

IRP_MN_SURPRISE_REMOVAL