共用方式為


單一 DispatchCreateClose 常式

許多驅動程式,特別是層次驅動程式鏈結中的較低層級驅動程式,只需要在收到 建立 要求時建立其存在,而且只需要認可 關閉 要求的收據。

例如,具有一或多個呼叫 IoGetDeviceObjectPointer 之裝置控制器的埠驅動程式,可能會有最少 的 DispatchCreateClose 常式。 常式可能不只完成 IRP,如下所示:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

這個最小 DispatchCreateClose 常式會將 I/O 狀態欄塊 的資訊 成員設定為零,指出已開啟檔案物件以進行建立要求; 資訊 對關閉要求沒有意義。 常式會將 Status 成員設定為 STATUS_SUCCESS,並傳回此狀態值,指出驅動程式已準備好接受 I/O 要求。

這個最小 DispatchCreateClose 常式會完成建立 IRP,而不會提升 IRP (IO_NO_INCREMENT) 的源器優先順序,因為來源器會假設等候不確定但非常小的間隔,要求完成。

DispatchCreateClose常式的運作方式,部分取決於驅動程式裝置或基礎裝置的本質,以及部分取決於驅動程式的設計。 如果驅動程式針對建立和關閉要求執行非常不同的作業,它應該在不同的 DispatchCreate 和 DispatchClose 常式中處理這些要求。

若要處理建立要求以開啟代表邏輯或實體裝置的檔案物件,最高層級驅動程式應該執行下列動作:

  1. 呼叫 IoGetCurrentIrpStackLocation 以取得 IRP 中其 I/O 堆疊位置的指標。

  2. 檢查 FileObject。I/O 堆疊位置中的FileName ,如果 FileName 的 Unicode 字串長度為零,請使用 STATUS_SUCCESS 完成 IRP;否則,請使用 STATUS_INVALID_PARAMETER 來完成 IRP。

遵循上述步驟可確保不會嘗試在裝置上開啟虛擬檔案,稍後可能會造成問題。 例如,這可防止嘗試開啟不存在的 \\device\parallel0\temp.dat。