Partilhar via


Executando o gerenciamento 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 DSM (gerenciamento de conjunto de dados) 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 de IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES . Se a ação exigir parâmetros adicionais, um bloco de parâmetros seguirá imediatamente a estrutura DEVICE_DSM_INPUT e ParameterBlockOffset especificará o deslocamento do início da estrutura DEVICE_DSM_INPUT na qual o bloco de parâmetros é iniciado. Os intervalos do conjunto de dados, se houver, seguirão imediatamente o bloco de parâmetros e DataSetRangesOffset especificará o deslocamento do início da estrutura DEVICE_DSM_INPUT na qual os intervalos são iniciados. A estrutura de buffer do sistema é mostrada no diagrama a seguir.

Buffer de entrada IOCTL do DSM.

Se a ação de gerenciamento retornar a saída, um ponteiro para uma estrutura DEVICE_DSM_OUTPUT será passado no OutputBuffer do IOCTL. Se a ação retornar uma saída adicional específica da ação, um bloco de saída seguirá imediatamente a estrutura DEVICE_DSM_OUTPUT e OutputBlockOffset especificará o deslocamento do início da estrutura DEVICE_DSM_OUTPUT na qual o bloco de parâmetros é iniciado. A estrutura do buffer de saída é mostrada no diagrama a seguir.

Buffer de Saída IOCTL do DSM.

Fluxo de processo de uma ação de DSM

O fluxo de processo de uma ação DSM é descrito abaixo, em que Remetente é o solicitante de ação e Manipulador 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 o envia para o primeiro Manipulador na pilha fazendo o seguinte:

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

    1. Manipule a solicitação e retorne com saída, se houver.
    2. Manipule a solicitação e encaminhe-a para o próximo driver 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 manipular o DSM, ele só poderá encaminhar a solicitação com segurança se o bit mais significativo (DeviceDsmActionFlag_NonDestructive) de DEVICE_DSM_ACTION estiver definido. Se DeviceDsmActionFlag_NonDestructivenão estiver definido, o driver deverá retornar com um erro.

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

    • Valide a entrada chamando DeviceDsmValidateInput.
    • Se a entrada for válida, Handler extrairá a entrada para obter a ação. Se a ação tiver um bloco de parâmetros, Handler 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. Esse 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 do DEVICE_DSM_INPUT.
    • Se a ação exigir saída, Handler chamará DeviceDsmValidateOutputLength para validar o buffer de saída fornecido pelo remetente. Se 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 Manipulador conclui o IOCTL e retorna ou encaminha o IOCTL para o próximo driver na pilha.
  3. Depois que o DSM é tratado e retornado ao Remetente, o Remetente valida a saída, se houver, chamando DeviceDsmValidateOutput. Se a saída for válida, Sender extrairá 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 DSM do dispositivo.