Condividi tramite


Esecuzione della gestione dei set di dati del 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 è possibile eseguire 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 di 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.

DSM IOCTL Input Buffer.

Se l'azione di gestione restituisce l'output, viene passato un puntatore a una struttura DEVICE_DSM_OUTPUTnell'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.

Buffer di output DSM IOCTL.

Flusso di processo di un'azione DSM

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

Flusso di azione 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. Gestire la richiesta e restituire con l'output, se presente.
    2. Gestire la richiesta e inoltrarla al driver inferiore successivo nello stack.
    3. Inoltrare la richiesta al driver inferiore successivo nello stack senza gestire il DSM.

    Nota

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

    Se Handler gestisce il DSM, esegue la procedura seguente:

    • 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 include dati di intervallo, Handler chiama DeviceDsmDataSetRanges per ottenere un puntatore al blocco di intervalli di set di dati e quindi esegue la normale elaborazione nel 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.