IoCreateDevice 傳回之後,會為呼叫者提供一個指向 DeviceObject 的指標,其中包含一個指向裝置擴充功能 的指標,驅動程式必須在此裝置對象中設定其個別實體、邏輯和/或虛擬設備的特定欄位。
IoCreateDevice 會將新建立裝置物件的 StackSize 字段設定為一個。 最低層級驅動程式可以忽略此欄位。 當較高層級驅動程式呼叫 IoAttachDeviceToDeviceStack 以將自己附加至下一個較低驅動程式時,該例程會自動將裝置物件中的 StackSize 字段設定為下一個較低驅動程式的裝置物件加上一個。 不過,針對某些裝置類型,較高層級的驅動程式可能需要將 StackSize 字段設定為較大的值,如裝置特定檔中所述。 設定堆疊大小可確保傳送至較高層級驅動程式的 IRP 將包含驅動程式特定的 I/O 堆疊位置,以及鏈結中所有較低層級驅動程式的正確 I/O 堆疊位置數目。
IoCreateDevice 會將新建立裝置物件的 AlignmentRequirement 字段設定為處理器的數據快取行大小減一,以確保直接 I/O 中使用的緩衝區會正確對齊。 IoCreateDevice 傳回之後,最低層級的實體設備驅動器必須執行下列動作:
從裝置的對齊需求減去其中一個。
將步驟 1 的結果與裝置物件的目前值 AlignmentRequirement進行比較。
如果裝置的對齊需求更大,請將 AlignmentRequirement 設定為步驟 1 的結果。 否則,請將 AlignmentRequirement 值保留 IoCreateDevice所設定。
在任何較高層級的驅動程式透過呼叫 IoGetDeviceObjectPointer將自身鏈接到另一個驅動程式後,必須將新建立之裝置物件的 AlignmentRequirement 欄位設定為下一個較低層級驅動程式的裝置物件的對齊需求。 一般情況下,較高層級的驅動程式不應該變更此值。 如果較高層級的驅動程式呼叫 IoAttachDevice 或 IoAttachDeviceToDeviceStack,這些例程會自動將裝置物件中的 AlignmentRequirement 字段設定為較低層級驅動程式的裝置物件。
IoGetDeviceObjectPointer 會將指標傳回至較低層級驅動程式的裝置對象和相關聯的檔案物件。 只有 FSD (或可能是另一個最高層級的驅動程式)可以使用傳回的檔案物件指標。 呼叫 IoGetDeviceObjectPointer 的中繼驅動程式 應該儲存此檔案物件指標,以便在卸除驅動程式時呼叫 ObDereferenceObject 來取值。
FSD 掛載包含代表較低層驅動程式的裝置對象的檔案對象後,中介驅動程式無法透過呼叫 IoAttachDevice 或 IoAttachDeviceToDeviceStack來連接在檔案系統與較低層驅動程式之間。 此外,FSD 可以在掛接時根據基礎磁碟區硬體的形狀或配置,設定裝置物件的 SectorSize 成員。 如需詳細資訊,請參閱 DEVICE_OBJECT。
中繼或最低層級驅動程式也會在裝置物件的 旗標 中設定位,方法是將其與 DO_DIRECT_IO 或 DO_BUFFERED_IO 進行 OR 運算後應用於其所建立的每個裝置物件。 最高層級的邏輯或虛擬設備驅動程式可以避免為緩衝處理或直接 I/O 設定 旗標,如果驅動程式開發者認為所涉及的額外工作將會以更好的驅動程式效能回報。 中繼驅動程式必須設定其裝置物件的 Flags 欄位,以符合下一個較低驅動程式的裝置物件。
使用DO_DIRECT_IO或DO_BUFFERED_IO設定裝置物件 旗標 欄位會決定 I/O 管理員如何在後續傳送至驅動程式的所有數據傳輸要求中傳遞用戶緩衝區的存取權。
驅動程式接著可以在裝置物件中設定任何其他裝置相依值。 例如,對於抽取式媒體裝置的非 WDM 驅動程式,如果在 I/O 操作期間偵測到或懷疑媒體變更,則必須將裝置物件的 旗標 成員與 DO_VERIFY_VOLUME 進行 OR 運算。 (如需詳細資訊,請參閱 支援卸除式媒體。需要無聲電源的裝置驅動程式必須或具有DO_POWER_INRUSH的 旗標 成員,而不在系統分頁路徑上的裝置驅動程式必須或具有DO_POWER_PAGABLE之 旗標 成員。 函式和篩選驅動程式必須清除DO_DEVICE_INITIALIZING旗標。
初始化裝置物件之後,驅動程式也可以初始化任何核心定義的物件,以及它已在裝置延伸模組中提供記憶體的其他系統定義數據結構。 確切地說,當驅動程式執行這些工作時,取決於其裝置、對象的類型和/或數據的本質。 一般而言,任何可以透過 PnP 啟動和停止要求保存的物件或數據結構,都可以在 AddDevice 例程中初始化。 當驅動程式處理 IRP_MN_START_DEVICE 要求時,應該初始化那些需要 PnP IRP_MN_START_DEVICE 要求所提供的資源資訊,或在裝置停止和/或重新啟動時可能需要變更的資源資訊。 如需 addDevice 例程 的詳細資訊,請參閱 撰寫 AddDevice 例程。