Condividi tramite


Esecuzione della gestione dei dataset per i driver di archiviazione

A partire da Windows 7, i driver possono eseguire azioni di gestione nel set di dati di un dispositivo. L'elenco delle azioni di gestione dei set di dati (DSM) che possono essere eseguite in un dispositivo di archiviazione sono definite da Microsoft.

Uso di IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES

Una costante DEVICE_DSM_ACTION specifica l'azione. Questa costante viene passata nel membro Action della struttura DEVICE_DSM_INPUT contenuta nel buffer di sistema di una richiesta di IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES . Se l'azione richiede parametri aggiuntivi, un blocco di parametri seguirà immediatamente la struttura DEVICE_DSM_INPUT e ParameterBlockOffset specificherà l'offset dall'inizio della struttura DEVICE_DSM_INPUT in corrispondenza della quale viene avviato il blocco di parametri. Gli intervalli del set di dati, se presenti, seguiranno immediatamente il blocco di parametri e DataSetRangesOffset specificherà l'offset dall'inizio della struttura DEVICE_DSM_INPUT in corrispondenza della quale iniziano gli intervalli. La struttura del buffer di sistema è illustrata nel diagramma seguente.

Buffer di input DSM IOCTL.

Se l'azione di gestione restituirà un output, viene passato un puntatore a una struttura DEVICE_DSM_OUTPUT nel OutputBuffer di IOCTL. Se l'azione restituirà un output aggiuntivo specifico dell'azione, un blocco di output seguirà immediatamente la struttura DEVICE_DSM_OUTPUT e OutputBlockOffset specificherà l'offset dall'inizio della struttura DEVICE_DSM_OUTPUT in corrispondenza della quale viene avviato il blocco di parametri. La struttura del buffer di output è illustrata nel diagramma seguente.

DSM IOCTL Output Buffer.

Flusso del processo di un'azione DSM

Il flusso di processo di un'azione DSM è descritto di seguito, dove Sender è il richiedente dell'azione e il gestore elabora l'azione richiesta. Si noti che nello stack possono essere presenti più gestori .

Flusso delle azioni DSM.

  1. Il mittente inizializza il DSM e lo invia al primo gestore nello stack eseguendo le operazioni seguenti:

  2. Il gestore gestisce la richiesta DSM IOCTL in uno dei tre modi seguenti:

    1. Gestisci la richiesta e restituisci l'output, se presente.
    2. Gestire la richiesta e inoltrarla al driver del livello inferiore successivo nello stack.
    3. Inoltrare la richiesta al driver inferiore successivo nello stack senza gestire il DSM.

    Annotazioni

    Indipendentemente dal fatto che il driver gestisca il DSM, può inoltrare la richiesta in modo sicuro solo se viene impostato il bit più significativo (DeviceDsmActionFlag_NonDestructive) di DEVICE_DSM_ACTION. Se DeviceDsmActionFlag_NonDestructivenon è impostato, il driver deve invece restituire un errore.

    Se Handler gestisce il DSM, esegue i passaggi seguenti:

    • Convalidare l'input chiamando DeviceDsmValidateInput.
    • Se l'input è valido, Handler estrae l'input per ottenere l'azione. Se l'azione ha un blocco di parametri, Handler chiama DeviceDsmParameterBlock per ottenere il blocco di parametri. Se l'azione contiene dati di intervallo, Handler chiama DeviceDsmDataSetRanges per ottenere un puntatore al blocco di intervalli di set di dati e quindi esegue la normale elaborazione sul blocco. Questo blocco si trova in DataSetRangesOffset ed è costituito da una o più voci contigue formattate come strutture DEVICE_DSM_RANGE . La lunghezza, in byte, degli intervalli del set di dati viene impostata nel membro DataSetRangesLength di DEVICE_DSM_INPUT.
    • Se l'azione richiede l'output, Handler chiama DeviceDsmValidateOutputLength per convalidare il buffer di output fornito dal mittente. Se valido, il gestore inizializza la parte DEVICE_DSM_OUTPUT del buffer di output chiamando DeviceDsmInitializeOutput e popola il blocco di output con output specifico dell'azione, se presente. Il gestore completa quindi IOCTL e restituisce o inoltra IOCTL al driver successivo nello stack.
  3. Dopo che il DSM viene gestito e restituito al mittente, il mittente convalida l'output, se presente, chiamando DeviceDsmValidateOutput. Se l'output è valido, Sender estrae il blocco di output, se presente, chiamando DeviceDsmOutputBlock.

Per informazioni dettagliate su ogni azione DSM specifica, vedere Descrizioni delle azioni DSM del dispositivo.