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

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

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_INPUTDataSetRangesLength 成員中設定。
    • 如果動作需要輸出, 處理程式 會呼叫 DeviceDsmValidateOutputLength 來驗證傳送者提供的輸出緩衝區。 如果有效,處理程式會呼叫DeviceDsmInitializeOutput來初始化輸出緩衝區的DEVICE_DSM_OUTPUT部分,如果有的話,就會以動作特定的輸出填入輸出區塊。 處理程式接著會完成 IOCTL,並將 IOCTL 傳回或轉送至堆疊中的下一個驅動程式。
  3. 一旦處理 DSM 並傳回給 寄件者傳送者 會藉由呼叫 DeviceDsmValidateOutput 來驗證輸出。 如果輸出有效, Sender 會藉由呼叫 DeviceDsmOutputBlock 來擷取輸出區塊。

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