執行記憶體驅動程序數據集管理
從 Windows 7 開始,驅動程式可以在裝置的數據集上執行管理動作。 Microsoft 會定義可在儲存裝置上執行的 數據集管理 (DSM) 動作 清單。
使用IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
DEVICE_DSM_ACTION常數會指定動作。 這個常數會傳入包含在IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES要求之系統緩衝區中DEVICE_DSM_INPUT結構的Action成員。 如果動作需要其他參數,參數區塊會緊接在DEVICE_DSM_INPUT結構之後, 而ParameterBlockOffset 會指定參數區塊開始DEVICE_DSM_INPUT結構的位移。 如果有任何數據集範圍,則會緊接在參數區塊後面, 而 DataSetRangesOffset 會指定DEVICE_DSM_INPUT結構開頭的位移,範圍 () 開始。 下圖顯示系統緩衝區結構。
如果管理動作會傳回輸出,則會在IOCTL的 OutputBuffer 中傳遞DEVICE_DSM_OUTPUT結構的指標。 如果動作會傳回其他動作特定的輸出,輸出區塊會緊接在DEVICE_DSM_OUTPUT結構之後, 而 OutputBlockOffset 會指定參數區塊啟動DEVICE_DSM_OUTPUT結構的開頭的位移。 下圖顯示輸出緩衝區結構。
DSM 動作的進程流程
DSM 動作的進程流程如下所述,其中 Sender 是動作要求者, 而處理程式 會處理要求的動作。 請注意,堆疊中可以有多個 Handler 。
傳送者 會執行下列動作,初始化 DSM,並將其傳送至堆疊中的第一個 處理程式 :
- 使用與動作相關聯的定義,配置和初始化 DEVICE_DSM_DEFINITION 結構。
- 呼叫 DeviceDsmGetInputLength 來判斷動作輸入緩衝區所需的大小,然後配置此緩衝區的記憶體。
- 呼叫 DeviceDsmInitializeInput 來初始化 DSM_DEVICE_INPUT 結構,如果動作有參數,則為參數區塊。 參數區塊格式取決於動作。 如需詳細資訊 ,請參閱DEVICE_DSM_ACTION描述 。
- 如果動作有範圍,請針對每個範圍呼叫 DeviceDsmAddDataSetRange ,以將 DEVICE_DSM_RANGE 結構新增至輸入緩衝區 (s) 。
- 如果 DSM 有輸出,請呼叫 DeviceDsmGetOutputLength 來判斷動作輸出緩衝區所需的大小,然後配置此緩衝區的記憶體。
- 傳送 IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES 要求,並在有的話傳遞 IOCTL 系統緩衝區中初始化的輸入數據,以及配置的輸出緩衝區。
處理程式 會以下列三種方式之一處理 DSM IOCTL 要求:
- 如果有的話,請處理要求並傳回輸出。
- 處理要求,並將它轉送至堆疊中的下一個較低驅動程式。
- 將要求轉送至堆疊中的下一個較低驅動程式,而不需處理 DSM。
注意
不論驅動程式是否處理 DSM, 只有在 設定DEVICE_DSM_ACTION最重要的位 (DeviceDsmActionFlag_NonDestructive) 時 ,才能安全地轉送要求。 如果未設定DeviceDsmActionFlag_NonDestructive,驅動程式應該改為傳回並傳回錯誤。
如果 Handler 確實處理 DSM,則會執行下列步驟:
- 呼叫 DeviceDsmValidateInput 來驗證輸入。
- 如果輸入有效, Handler 會擷取輸入以取得動作。 如果動作有參數區塊, Handler 會呼叫 DeviceDsmParameterBlock 以取得參數區塊。 如果動作有範圍數據, Handler 會呼叫 DeviceDsmDataSetRanges 以取得數據集範圍區塊的指標,然後在區塊上執行正常處理。 此區塊位於 DataSetRangesOffset ,由一或多個連續項目組成,格式為 DEVICE_DSM_RANGE 結構。 數據集範圍的長度,以位元組為單位,是在 DEVICE_DSM_INPUT的 DataSetRangesLength 成員中設定。
- 如果動作需要輸出, 處理程式 會呼叫 DeviceDsmValidateOutputLength 來驗證傳送者提供的輸出緩衝區。 如果有效,處理程式會呼叫DeviceDsmInitializeOutput來初始化輸出緩衝區的DEVICE_DSM_OUTPUT部分,如果有的話,就會以動作特定的輸出填入輸出區塊。 處理程式接著會完成 IOCTL,並將 IOCTL 傳回或轉送至堆疊中的下一個驅動程式。
一旦處理 DSM 並傳回給 寄件者, 傳送者 會藉由呼叫 DeviceDsmValidateOutput 來驗證輸出。 如果輸出有效, Sender 會藉由呼叫 DeviceDsmOutputBlock 來擷取輸出區塊。
如需每個特定 DSM 動作的詳細資訊,請參閱 裝置 DSM 動作描述。