從 Windows 7 開始,驅動程式可以在裝置的數據集上執行管理動作。 可以在記憶體裝置上執行的 資料集管理 (DSM) 動作 清單是由Microsoft所定義。
使用 IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
DEVICE_DSM_ACTION常數會指定動作。 這個常數會傳入包含在Action成員的DEVICE_DSM_INPUT結構中,並位於IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES要求的系統緩衝區中。 如果該動作需要額外的參數,則參數區塊將緊接在 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 結構新增至輸入緩衝區。
- 如果 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 動作描述。