Realización de la administración de conjuntos de datos del controlador de almacenamiento

A partir de Windows 7, los controladores pueden realizar acciones de administración en el conjunto de datos de un dispositivo. Microsoft define la lista de acciones de administración de conjuntos de datos (DSM) que se pueden realizar en un dispositivo de almacenamiento.

Uso de IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES

Una constante DEVICE_DSM_ACTION especifica la acción. Esta constante se pasa en el miembro Action de la estructura DEVICE_DSM_INPUT contenida en el búfer del sistema de una solicitud de IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES . Si la acción requiere parámetros adicionales, un bloque de parámetros seguirá inmediatamente la estructura DEVICE_DSM_INPUT y ParameterBlockOffset especificará el desplazamiento desde el principio de la estructura de DEVICE_DSM_INPUT en la que se inicia el bloque de parámetros. Los intervalos de conjuntos de datos, si los hay, seguirán inmediatamente el bloque de parámetros y DataSetRangesOffset especificará el desplazamiento desde el principio de la estructura DEVICE_DSM_INPUT en la que se inician los intervalos. La estructura del búfer del sistema se muestra en el diagrama siguiente.

DSM IOCTL Input Buffer.

Si la acción de administración devolverá la salida, se pasa un puntero a una estructura de DEVICE_DSM_OUTPUT en outputBuffer de IOCTL. Si la acción devolverá una salida específica de la acción adicional, un bloque de salida seguirá inmediatamente la estructura DEVICE_DSM_OUTPUT y OutputBlockOffset especificará el desplazamiento desde el principio de la estructura de DEVICE_DSM_OUTPUT en la que se inicia el bloque de parámetros. La estructura del búfer de salida se muestra en el diagrama siguiente.

Búfer de salida de DSM IOCTL.

Flujo de proceso de una acción DSM

El flujo de proceso de una acción DSM se describe a continuación, donde Sender es el solicitante de acción y handler procesa la acción solicitada. Tenga en cuenta que puede haber más de un controlador en la pila.

Flujo de acción dsm.

  1. El remitente inicializa el DSM y lo envía al primer controlador de la pila haciendo lo siguiente:

  2. El controlador controla la solicitud DSM IOCTL de una de estas tres maneras:

    1. Controle la solicitud y devuelva con la salida, si existe.
    2. Controle la solicitud y reenvíela al siguiente controlador inferior de la pila.
    3. Reenvíe la solicitud al siguiente controlador inferior de la pila sin controlar el DSM.

    Nota

    Independientemente de si el controlador controla el DSM, puede reenviar la solicitud de forma segura solo si se establece DEVICE_DSM_ACTION bit más significativo (DeviceDsmActionFlag_NonDestructive). Si no se establece DeviceDsmActionFlag_NonDestructive, el controlador debe devolverse con un error.

    Si Handler controla el DSM, realiza los pasos siguientes:

    • Valide la entrada llamando a DeviceDsmValidateInput.
    • Si la entrada es válida, handler extrae la entrada para obtener la acción. Si la acción tiene un bloque de parámetros, Handler llama a DeviceDsmParameterBlock para obtener el bloque de parámetros. Si la acción tiene datos de intervalo, el controlador llama a DeviceDsmDataSetRanges para obtener un puntero al bloque de intervalos del conjunto de datos y, a continuación, realiza el procesamiento normal en el bloque. Este bloque se encuentra en DataSetRangesOffset y consta de una o varias entradas contiguas con formato como estructuras DEVICE_DSM_RANGE . La longitud, en bytes, de los intervalos del conjunto de datos se establece en el miembro DataSetRangesLength de DEVICE_DSM_INPUT.
    • Si la acción requiere salida, el controlador llama a DeviceDsmValidateOutputLength para validar el búfer de salida proporcionado por el remitente. Si es válido, el controlador inicializa la parte DEVICE_DSM_OUTPUT del búfer de salida mediante una llamada a DeviceDsmInitializeOutput y rellena el bloque de salida con salida específica de la acción, si existe. A continuación, el controlador completa el IOCTL y devuelve o reenvía el IOCTL al siguiente controlador de la pila.
  3. Una vez que el DSM se controla y se devuelve al remitente, el remitente valida la salida, si existe, llamando a DeviceDsmValidateOutput. Si la salida es válida, sender extrae el bloque de salida, si existe, llamando a DeviceDsmOutputBlock.

Para obtener más información sobre cada acción de DSM específica, consulta Device DSM Action Descriptions.