Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES. Si la acción requiere parámetros adicionales, un bloque de parámetros seguirá inmediatamente la estructura de 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 rangos de datos, si los hay, seguirán inmediatamente al bloque de parámetros, y DataSetRangesOffset especificará el desplazamiento desde el inicio de la estructura DEVICE_DSM_INPUT donde comienzan los rangos. La estructura del búfer del sistema se muestra en el diagrama siguiente.
Si la acción de administración genera una salida, se pasa un puntero a una estructura DEVICE_DSM_OUTPUT en el OutputBuffer del IOCTL. Si la acción devolverá una salida adicional específica de la acción, 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.
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 El controlador procesa la acción solicitada. Tenga en cuenta que puede haber más de un controlador en la pila.
El remitente inicializa el DSM y lo envía al primer controlador de la pila haciendo lo siguiente:
- Asigne e inicialice una estructura de DEVICE_DSM_DEFINITION con la definición asociada a la acción.
- Llame a DeviceDsmGetInputLength para determinar el tamaño necesario para el búfer de entrada de la acción y, a continuación, asigne memoria para este búfer.
- Llame a DeviceDsmInitializeInput para inicializar la estructura de DSM_DEVICE_INPUT y, si la acción tiene parámetros, el bloque de parámetros. El formato de bloque de parámetros depende de la acción. Consulte DEVICE_DSM_ACTION Descripciones para obtener más información.
- Si la acción tiene intervalos, llame a DeviceDsmAddDataSetRange para cada intervalo con el fin de agregar DEVICE_DSM_RANGE estructura(s) al búfer de entrada.
- Si el DSM tiene salida, llame a DeviceDsmGetOutputLength para determinar el tamaño necesario para el búfer de salida de la acción y, a continuación, asigne memoria para este búfer.
- Envíe una solicitud IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES , pasando los datos de entrada inicializados en el búfer del sistema del IOCTL, junto con el búfer de salida asignado, si existe.
El controlador controla la solicitud DSM IOCTL de una de estas tres maneras:
- Maneje la solicitud y devuélvala con el resultado, si existe.
- Controle la solicitud y reenvíela al siguiente controlador de nivel inferior en la pila.
- 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 el bit más significativo de DEVICE_DSM_ACTION (DeviceDsmActionFlag_NonDestructive). Si DeviceDsmActionFlag_NonDestructiveno está establecido, el controlador debería devolver 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 llamando 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.
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, consulte Descripciones de acción dsm del dispositivo.