共用方式為


執行記憶體驅動程序數據集管理

從 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 結構開頭開始的範圍位移。 下圖顯示系統緩衝區結構。

DSM IOCTL 輸入緩衝區。

如果管理動作會傳回輸出,則會在IOCTL的 OutputBuffer 中傳遞DEVICE_DSM_OUTPUT結構的指標。 如果該動作會產生其他與該動作相關的特定輸出,則輸出區塊會緊接在 DEVICE_DSM_OUTPUT 結構之後,並且 OutputBlockOffset 會指定從 DEVICE_DSM_OUTPUT 結構起始位置開始的參數區塊的位移。 輸出緩衝區結構如下圖所示。

DSM IOCTL 輸出緩衝區。

DSM 動作的進程流程

DSM 動作的進程流程如下所述, 其中 Sender 是動作要求者和 處理程式 會處理要求的動作。 請注意,堆疊中可以有多個 Handler

DSM 動作流程。

  1. 傳送者 會執行下列動作,初始化 DSM,並將其傳送至堆疊中的第一個 處理程式

  2. 處理程式 會以下列三種方式之一處理 DSM IOCTL 要求:

    1. 處理要求,並傳回輸出,如果有的話。
    2. 處理要求,並將它轉送至堆疊中的下一個較低驅動程式。
    3. 將要求轉送至堆疊中的下一個較低驅動程式,而不需要處理 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 傳回或轉送至堆疊中的下一個驅動程式。
  3. 當 DSM 處理並傳回 給寄件者之後, 寄件者 會藉由呼叫 DeviceDsmValidateOutput 來驗證輸出。 如果輸出有效, Sender 會藉由呼叫 DeviceDsmOutputBlock 來擷取輸出區塊。

如需每個特定 DSM 動作的詳細資訊,請參閱 裝置 DSM 動作描述