共用方式為


函式或篩選驅動程式中的 AddDevice 常式

函式或篩選驅動程式中的 AddDevice 常式應該採取下列步驟:

  1. 呼叫 IoCreateDevice 來建立功能或篩選裝置物件, (要新增之裝置的 FDO 或篩選 DO) 。

    請勿為裝置物件指定 DeviceName ,因為這樣做會略過 PnP 管理員的安全性。 如果使用者模式元件需要裝置的符號連結,請註冊裝置介面 (請參閱下一個步驟) 。 如果核心模式元件需要舊版裝置名稱,驅動程式必須命名裝置物件,但不建議命名。

    DeviceCharacteristics 參數中包含FILE_DEVICE_SECURE_OPEN。 這項特性會指示 I/O 管理員針對所有開啟要求對裝置物件執行安全性檢查,包括相對開啟和尾端檔案名開啟。

  2. [選擇性]建立裝置的一或多個符號連結。

    呼叫 IoRegisterDeviceInterface 來註冊裝置功能,並建立應用程式或系統元件可用來開啟裝置的符號連結。 驅動程式應該在處理IRP_MN_START_DEVICE要求時呼叫IoSetDeviceInterfaceState來啟用介面。 如需詳細資訊,請參閱 裝置介面類別別

  3. 將裝置 PDO 的指標儲存在裝置擴充功能中。

    PnP 管理員會將 PDO 的指標作為 PhysicalDeviceObject 參數提供給 AddDevice。 驅動程式會在 呼叫 IoGetDeviceProperty等常式中使用 PDO 指標。

  4. 定義裝置擴充功能中的旗標,以追蹤裝置的特定 PnP 狀態,例如裝置暫停、移除和意外移除。

    例如,定義一個旗標,指出當裝置處於暫停狀態時,應該保留傳入的 IRP。 如果驅動程式還沒有佇列 IRP 的機制,請建立用來保存 IRP 的佇列。 如需詳細資訊,請參閱 佇列和清除佇列 IRP

    此外,在裝置擴充功能中配置 IO_REMOVE_LOCK 結構,並呼叫 IoInitializeRemoveLock 來初始化此結構。 如需詳細資訊,請參閱 使用移除鎖定

  5. 在裝置物件中設定DO_BUFFERED_IO或DO_DIRECT_IO旗標位,以指定 I/O 管理員用於傳送至裝置堆疊之 I/O 要求的緩衝類型。 較高層級的驅動程式或此成員的值與堆疊中下一個較低驅動程式的值相同,但可能適用于最高層級的驅動程式。 如需詳細資訊,請參閱 初始化裝置物件

  6. 視需要設定電源管理的DO_POWER_INRUSH或DO_POWER_PAGABLE旗標。 可分頁的驅動程式必須設定DO_POWER_PAGABLE旗標。 裝置物件旗標通常會由匯流排驅動程式在建立裝置的 PDO 時設定。 不過,較高層級的驅動程式有時可能需要在建立 FDO 或篩選 DO 時,變更其 AddDevice 常式中的這些旗標值。 如需詳細資訊 ,請參閱設定電源管理的裝置物件旗標

  7. 建立和/或初始化驅動程式用來管理此裝置的任何其他軟體資源,例如事件、微調鎖定或其他物件。 (硬體資源,例如 I/O 埠,稍後會設定,以回應 IRP_MN_START_DEVICE 要求。)

    因為 AddDevice 常式會在 IRQL = PASSIVE_LEVEL的系統執行緒內容中執行,所以使用 ExAllocatePoolWithTag 配置的任何記憶體都可以從分頁集區使用,只要驅動程式不會控制保存系統頁面檔案的裝置即可。 在AddDevice傳回控制項之前,必須先使用ExFreePool釋放這類記憶體配置。

  8. 將裝置物件附加至裝置堆疊, (IoAttachDeviceToDeviceStack) 。

    TargetDevice 參數中指定裝置 PDO 的指標。

    儲存 IoAttachDeviceToDeviceStack所傳回的指標。 這個指標指向裝置下一個較低驅動程式的裝置物件,是將 IRP 傳遞至裝置堆疊時 ,IoCallDriverPoCallDriver 的必要參數。

  9. 使用如下所示的 語句清除 FDO 或篩選 DO 中的DO_DEVICE_INITIALIZING旗標:

    FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    
  10. 準備好處理裝置 (的 PnP IRP,例如 IRP_MN_QUERY_RESOURCE_REQUIREMENTSIRP_MN_START_DEVICE)

驅動程式必須等到收到包含 PnP 管理員指派給裝置之硬體資源清單的 IRP_MN_START_DEVICE ,才能開始控制裝置。