使用控制裝置物件

控制裝置物件是不支援 隨插即用 (PnP) 或電源管理作業的架構裝置物件。 驅動程式可以使用控制裝置物件來代表僅限軟體的虛擬裝置或 舊版硬體裝置 (,也就是未提供 PnP 或電源管理功能的裝置) 。

建立控制裝置物件的驅動程式通常會建立裝置物件的符號連結。 應用程式可以將符號連結名稱傳遞至 API 元素,例如 Microsoft Win32 CreateFile 函式,將 I/O 要求傳送至控制裝置物件。

架構不會將控制裝置物件附加至 裝置堆疊。 因此,當應用程式將 I/O 要求傳送至控制裝置物件時,I/O 管理員會將要求直接傳遞給建立控制裝置物件的驅動程式,而不是傳送至堆疊頂端的驅動程式。 不過, (,其他驅動程式可以呼叫 IoAttachDevice ,在控制裝置物件上方附加裝置物件。在此情況下,其他驅動程式會先收到 I/O 要求。)

控制裝置物件的用法

控制裝置的兩個一般用途如下:

  1. 如果驅動程式支援一組自訂 I/O 控制程式碼,則為 PnP 裝置的篩選驅動程式,以供應用程式使用。

    如果應用程式嘗試使用 將自訂 I/O 控制項代碼傳送至驅動程式堆疊頂端 (,例如,裝置 介面 的符號連結名稱) ,如果驅動程式無法辨識自訂 I/O 控制項代碼,則篩選驅動程式上方的驅動程式可能會失敗。 若要避免這個問題,篩選驅動程式可以建立控制裝置物件。 應用程式可以使用控制項裝置物件的符號連結名稱,直接將 I/O 控制程式碼傳送至篩選驅動程式。

    (請注意,篩選驅動程式避免問題的最佳方式是做為匯流排驅動程式,並 列舉 在原始模式中運作的子裝置。 換句話說,針對篩選驅動程式支援的每個裝置,驅動程式可以在不需要函式驅動程式的 PDO) (建立實體裝置物件。 驅動程式會為每個裝置呼叫 WdfPdoInitAssignRawDeviceWdfDeviceInitAssignName ,而應用程式可以在傳送自訂 I/O 控制項程式碼時依名稱識別裝置。)

  2. 不支援 PnP 之裝置的驅動程式。

    這類驅動程式必須使用控制裝置物件,因為這類裝置的裝置物件不在裝置堆疊中,而且不提供 PnP 功能。 如需支援非 PnP 裝置的詳細資訊,請參閱 搭配非 PnP 驅動程式使用 Kernel-Mode Driver Framework

建立控制裝置物件

若要建立控制裝置物件,驅動程式必須:

  1. 呼叫 WdfControlDeviceInitAllocate 以取得 WDFDEVICE_INIT 結構。

  2. 視需要呼叫物件初始化方法,以初始化WDFDEVICE_INIT結構。 驅動程式只能呼叫下列初始化方法:

  3. 呼叫 WdfDeviceCreate,它會使用 WDFDEVICE_INIT 結構的內容來建立架構裝置物件。

  4. 完成下列初始化作業:

  5. 呼叫 WdfControlFinishInitializing

使用控制裝置物件的規則

建立控制裝置物件的驅動程式必須遵守下列規則:

  • 驅動程式無法將控制裝置物件的控制碼傳遞至 列舉子裝置的架構方法。

  • 驅動程式無法將控制裝置物件的控制碼傳遞至支援 裝置介面的架構方法。

  • 驅動程式可以建立 I/O 佇列,並註冊佇列的要求處理常式,但架構不允許佇列受到 電源管理

  • 驅動程式可以建立控制裝置物件的 檔案物件

命名控制項裝置物件

所有控制裝置物件都必須命名。 一般而言,您的驅動程式會呼叫 WdfDeviceInitAssignName 來指派裝置名稱,然後呼叫 WdfDeviceCreateSymbolicLink ,以建立應用程式可用來存取物件的符號連結名稱。

如果您的驅動程式未呼叫 WdfDeviceInitAssignName 來指派裝置名稱,架構會自動產生控制裝置的名稱,但您的驅動程式無法呼叫 WdfDeviceCreateSymbolicLink

您的驅動程式可以呼叫 WdfDeviceInitSetDeviceClass 來指定控制 裝置的裝置安裝類別 。 裝置安裝類別會識別登錄的區段,其中包含屬於安裝類別之裝置的系統管理員提供相關資訊。 如需呼叫 WdfDeviceInitSetDeviceClass的詳細資訊,請參閱 控制Framework-Based驅動程式中的裝置存取

接收系統關機通知

因為控制裝置物件不支援 PnP,所以您的驅動程式無法註冊回呼函式,以在裝置的電源狀態變更時通知驅動程式。 不過,驅動程式可以呼叫 WdfControlDeviceInitSetShutdownNotification 來註冊 EvtDeviceShutdownNotification 回呼函式。 此回呼函式會在系統即將失去其電源時通知驅動程式。

刪除控制裝置物件

某些驅動程式必須在驅動程式卸載之前刪除其控制裝置物件,如下所示:

  • 如果您的驅動程式建立控制裝置物件 (不支援 PnP 或電源管理) ,而且驅動程式也會建立支援 PnP 和電源管理的架構裝置物件,驅動程式最終必須在 IRQL = PASSIVE_LEVEL呼叫 WdfObjectDelete 來刪除控制裝置物件。

    如果驅動程式建立這兩種類型的裝置物件,則作業系統在驅動程式刪除控制裝置物件之前,無法卸載您的驅動程式。

    不過,在架構刪除其他裝置物件之後,驅動程式不得刪除控制裝置物件。 若要判斷架構何時刪除其他裝置物件,您的驅動程式應該為那些物件提供 EvtCleanupCallback 函式。

  • 如果您的驅動程式建立控制裝置物件,但不會建立支援 PnP 和電源管理的架構裝置物件,驅動程式就不需要刪除控制裝置物件。

    在此情況下,架構會在驅動程式的 EvtDriverUnload 回呼 函式傳回之後刪除控制裝置物件。