閱讀英文

共用方式為


初始化裝置物件

IoCreateDevice傳回之後,為呼叫者提供DeviceObject的指標,其中包含裝置擴充功能的指標,驅動程式必須在裝置物件中設定其各自的實體、邏輯和/或虛擬裝置的特定欄位。

IoCreateDevice 會將新建立之裝置物件的 StackSize 欄位設定為一個。 最低層級驅動程式可以忽略此欄位。 當較高層級的驅動程式呼叫 IoAttachDeviceToDeviceStack 以將本身附加至下一個較低的驅動程式時,該常式會自動將裝置物件中的 StackSize 欄位設定為下一個較低驅動程式的裝置物件加上一個。 不過,對於某些裝置類型,較高層級的驅動程式可能需要將 StackSize 欄位設定為更高的值,如裝置特定檔中所述。 設定堆疊大小可確保傳送至較高層級驅動程式的 IRP 將包含驅動程式特定的 I/O 堆疊位置,以及鏈結中所有較低層級驅動程式的正確 I/O 堆疊位置數目。

IoCreateDevice 會將新建立之裝置物件的 AlignmentRequirement 欄位設定為處理器的資料快取行大小減一,以確保直接 I/O 中使用的緩衝區正確對齊。 IoCreateDevice傳回之後,最低層級的實體設備磁碟機必須執行下列動作:

  1. 從裝置的對齊需求中減去一個。

  2. 比較步驟 1 的結果與裝置物件的 AlignmentRequirement目前值。

  3. 如果裝置的對齊需求較大,請將 AlignmentRequirement 設定為步驟 1 的結果。 否則,保留由 IoCreateDevice所設定的 AlignmentRequirement值。

在任何較高層級的驅動程式透過呼叫 IoGetDeviceObjectPointer將自己鏈結至另一個驅動程式之後,較高層級驅動程式必須將新建立之裝置物件的 AlignmentRequirement 欄位設定為下一個較低層級驅動程式的裝置物件。 一般而言,較高層級的驅動程式不應該變更此值。 如果較高層級的驅動程式呼叫 IoAttachDeviceIoAttachDeviceToDeviceStack,這些常式會自動將裝置物件中的 AlignmentRequirement 欄位設定為較低層級驅動程式的裝置物件。

IoGetDeviceObjectPointer 會將指標同時傳回至較低層級驅動程式的裝置物件和相關聯的檔案物件。 只有 FSD (,或者,另一個最高層級驅動程式) 可以使用傳回的檔案物件指標。 呼叫 IoGetDeviceObjectPointer 的中繼驅動程式應該儲存此檔案物件指標,以便在卸載驅動程式時呼叫 ObDereferenceObject 來取值。

在 FSD 掛接包含代表較低驅動程式裝置物件的檔案物件之後,中繼驅動程式無法藉由呼叫 IoAttachDeviceIoAttachDeviceToDeviceStack,在檔案系統與較低驅動程式之間鏈結本身。 此外,FSD 可以根據掛接時基礎磁片區硬體的幾何,設定裝置物件的 SectorSize 成員。 如需詳細資訊,請參閱 DEVICE_OBJECT

中繼或最低層級驅動程式也會在裝置物件的 Flags 中設定一個位,方法是使用 DO_DIRECT_IO 或其建立的每個裝置物件中的DO_BUFFERED_IO。 邏輯或虛擬裝置的最高層級驅動程式可避免在驅動程式寫入器決定涉及的額外工作時,為緩衝或直接 I/O 設定 標,以提升驅動程式效能。 中繼驅動程式必須設定其裝置物件的 [旗標] 欄位,以符合下一個較低驅動程式裝置物件的旗標欄位。

設定具有DO_DIRECT_IO或DO_BUFFERED_IO的裝置物件 [旗 標] 欄位會決定 I/O 管理員如何在後續傳送至驅動程式的所有資料傳輸要求中傳遞使用者緩衝區的存取權。

驅動程式接著可以在裝置物件中設定任何其他裝置相依值。 例如,卸載式媒體裝置的非 WDM 驅動程式必須在 I/O 作業期間偵測到媒體 (或懷疑) 變更時,使用 DO_VERIFY_VOLUME 裝置物件的 Flags 成員。 (如需詳細資訊,請參閱 支援卸載式媒體 。) 需要啟動電源之裝置的驅動程式必須或具有DO_POWER_INRUSH的 標成員,以及不在系統分頁路徑的裝置驅動程式必須或具有DO_POWER_PAGABLE的 Flags 成員。 函式和篩選驅動程式必須清除DO_DEVICE_INITIALIZING旗標。

初始化裝置物件之後,驅動程式也可以初始化任何核心定義物件,以及它已在裝置延伸模組中提供儲存空間的其他系統定義資料結構。 精確地說,當驅動程式執行這些工作時,取決於其裝置、物件的類型,以及/或資料的本質。 一般而言,任何可以透過 PnP 啟動和停止要求保存的物件或資料結構,都可以在 AddDevice 常式中初始化。 需要 PnP IRP_MN_START_DEVICE 要求所提供的資源資訊,或在裝置停止和/或重新開機時可能需要變更的資源資訊,應該在驅動程式處理 IRP_MN_START_DEVICE 要求時初始化。 如需 AddDevice 常式的詳細資訊,請參閱 撰寫 AddDevice 常式