支援 UMDF 驅動程式中的Kernel-Mode用戶端

本主題描述從 UMDF 第 2 版開始,User-Mode Driver Framework (UMDF) 驅動程式如何支援 核心模式用戶端

核心模式用戶端是核心模式驅動程式,可將 I/O 要求傳送至 UMDF 驅動程式。 核心模式驅動程式可能位於 UMDF 驅動程式上方、位於相同的裝置堆疊中,或可能位於不同的裝置堆疊中。

核心模式驅動程式可以轉送它從使用者模式應用程式收到的 I/O 要求,也可以建立新的 I/O 要求,並將其傳送至使用者模式驅動程式。

如何在 UMDF 驅動程式中支援核心模式用戶端

若要啟用 UMDF 驅動程式對核心模式用戶端的支援,UMDF 驅動程式的 INF 檔案必須在其 INF DDInstall中包含UmdfKernelModeClientPolicy指示詞。WDF區段。

架構提供兩種方法,對支援核心模式用戶端的驅動程式很有用。 驅動程式可以呼叫 WdfRequestGetRequestorMode 方法來判斷 I/O 要求是否來自核心模式或使用者模式。 如果 I/O 要求來自使用者模式,驅動程式可以呼叫 WdfRequestIsFromUserModeDriver 來判斷要求是否來自應用程式或其他使用者模式驅動程式。

核心模式驅動程式的限制

只有在核心模式驅動程式符合下列需求時,UMDF 驅動程式才能處理來自核心模式驅動程式的 I/O 要求:

  • 當核心模式驅動程式傳送 I/O 要求時,必須在 IRQL = PASSIVE_LEVEL執行。

  • 除非驅動程式已將 UmdfFileObjectPolicy INF 指示詞設定為 AllowNullAndUnknownFileObjects,否則核心模式驅動程式傳送至使用者模式驅動程式的每個 I/O 要求都必須有相關聯的檔案物件。 架構先前必須收到 I/O 管理員已建立檔案物件的通知。 (這類通知會導致架構呼叫使用者模式驅動程式的 EvtDeviceFileCreate 回呼函式,但該回呼函式是選擇性的。)

  • I/O 要求不能包含 IRP_MJ_INTERNAL_DEVICE_CONTROL 函式程式碼。

  • I/O 要求的緩衝區不得包含其他資訊的指標,因為使用者模式驅動程式無法取值指標。

  • 如果 I/O 要求包含指定「兩者」緩衝區存取方法的 I/O 控制項程式碼 ,則核心模式驅動程式必須在建立 I/O 要求之應用程式的處理常式內容中傳送 I/O 要求。 如需如何在 UMDF 驅動程式中支援「兩者」方法的詳細資訊,請參閱 管理 UMDF 驅動程式中的緩衝區存取方法

  • UMDF 驅動程式可能會在使用者模式中修改 I/O 要求的輸出資料。 因此,核心模式驅動程式必須驗證它從使用者模式驅動程式接收的任何輸出資料。

  • 核心模式用戶端通常會驗證 UMDF 驅動程式傳遞給WdfRequestCompleteWithInformation的資訊值。 如果用戶端是 KMDF 驅動程式,它可以呼叫 WdfRequestGetCompletionParams ,以在IO_STATUS_BLOCK結構中取得此資訊。

    一般而言,架構不會驗證 UMDF 驅動程式傳遞給 WdfRequestCompleteWithInformation的資訊值。 (此參數通常會指定已傳送的位元組數目。) 架構只會驗證輸出緩衝區的資訊值,而只會針對 緩衝的 I/O 資料存取方法驗證資訊值。 (例如,如果存取方法是緩衝處理 I/O.) ,架構會驗證已傳送的位元組數目未超過讀取作業的輸出緩衝區大小