Partilhar via


Realizando a gestão do conjunto de dados do driver de armazenamento

A partir do Windows 7, os drivers podem executar ações de gerenciamento no conjunto de dados de um dispositivo. A lista de ações de gerenciamento de conjunto de dados (DSM) que podem ser executadas em um dispositivo de armazenamento é definida pela Microsoft.

Usando IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES

Uma constante DEVICE_DSM_ACTION especifica a ação. Essa constante é passada no membro Action da estrutura DEVICE_DSM_INPUT contida no buffer do sistema de uma solicitação IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES . Se a ação exigir parâmetros adicionais, um bloco de parâmetros seguirá imediatamente a estrutura de DEVICE_DSM_INPUT e ParameterBlockOffset especificará o deslocamento desde o início da estrutura de DEVICE_DSM_INPUT na qual o bloco de parâmetros é iniciado. Os intervalos de conjuntos de dados, se houver, seguirão imediatamente o bloco de parâmetros, e DataSetRangesOffset especificará o deslocamento desde o início da estrutura DEVICE_DSM_INPUT onde os intervalos começam. A estrutura do buffer do sistema é mostrada no diagrama a seguir.

Buffer de entrada do IOCTL DSM.

Se a ação de gestão devolver um resultado, um ponteiro para uma estrutura DEVICE_DSM_OUTPUT será passado no OutputBuffer do IOCTL. Se a ação devolver uma saída adicional específica, um bloco de saída irá seguir imediatamente a estrutura DEVICE_DSM_OUTPUT, e OutputBlockOffset especificará o deslocamento a partir do início da estrutura DEVICE_DSM_OUTPUT onde o bloco de parâmetros começa. A estrutura do buffer de saída é mostrada no diagrama a seguir.

Buffer de saída do IOCTL do DSM.

Fluxo de processo de uma ação do DSM

O fluxo de processo de uma ação do DSM é descrito abaixo, onde Sender é o solicitante da ação e Handler processa a ação solicitada. Observe que pode haver mais de um manipulador na pilha.

Fluxo de ação do DSM.

  1. O Remetente inicializa o DSM e envia-o para o primeiro Handler na pilha, efetuando o seguinte:

  2. O manipulador lida com a solicitação IOCTL do DSM de uma das três maneiras:

    1. Trate a solicitação e devolva o resultado, se houver.
    2. Manipule a solicitação e encaminhe-a para o próximo controlador de nível inferior na pilha.
    3. Encaminhe a solicitação para o próximo driver inferior na pilha sem manipular o DSM.

    Observação

    Independentemente de o driver lidar com o DSM, ele pode encaminhar a solicitação com segurança somente se o bit (DeviceDsmActionFlag_NonDestructive) mais significativo do DEVICE_DSM_ACTION estiver definido. Se DeviceDsmActionFlag_NonDestructivenão estiver definido, o driver deve em vez disso retornar um erro.

    Se o Handler manipular o DSM, ele executará as seguintes etapas:

    • Valide a entrada chamando DeviceDsmValidateInput.
    • Se a entrada for válida, o Handler extrai a entrada para obter a ação. Se a ação tiver um bloco de parâmetro, o manipulador chamará DeviceDsmParameterBlock para obter o bloco de parâmetros. Se a ação tiver dados de intervalo, o manipulador chamará DeviceDsmDataSetRanges para obter um ponteiro para o bloco de intervalos do conjunto de dados e, em seguida, executará o processamento normal no bloco. Este bloco está localizado em DataSetRangesOffset e consiste em uma ou mais entradas contíguas formatadas como estruturas DEVICE_DSM_RANGE . O comprimento, em bytes, dos intervalos do conjunto de dados é definido no membro DataSetRangesLength de DEVICE_DSM_INPUT.
    • Se a ação exigir saída, o manipulador chamará DeviceDsmValidateOutputLength para validar o buffer de saída fornecido pelo remetente. Se for válido, o manipulador inicializa a parte DEVICE_DSM_OUTPUT do buffer de saída chamando DeviceDsmInitializeOutput e preenche o bloco de saída com saída específica da ação, se houver. Em seguida, o Handler conclui o IOCTL e ou retorna, ou encaminha o IOCTL para o próximo driver na pilha.
  3. Depois que o DSM é manipulado e retornado ao remetente, o remetente valida a saída, se houver, chamando DeviceDsmValidateOutput. Se a saída for válida, o remetente extrai o bloco de saída, se houver, chamando DeviceDsmOutputBlock.

Para obter detalhes sobre cada ação específica do DSM, consulte Descrições da ação do DSM do dispositivo.