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.
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.
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.
O remetente inicializa o DSM e o envia para o primeiro Manipulador na pilha fazendo o seguinte:
- Aloque e inicialize uma estrutura DEVICE_DSM_DEFINITION com a definição associada à ação.
- Chame DeviceDsmGetInputLength para determinar o tamanho necessário para o buffer de entrada da ação e, em seguida, aloque memória para esse buffer.
- Chame DeviceDsmInitializeInput para inicializar a estrutura DSM_DEVICE_INPUT e, se a ação tiver parâmetros, o bloco de parâmetros. O formato de bloco de parâmetro depende da ação. Consulte descrições DEVICE_DSM_ACTION para obter mais detalhes.
- Se a ação tiver intervalos, chame DeviceDsmAddDataSetRange para cada intervalo para adicionar DEVICE_DSM_RANGE estruturas ao buffer de entrada.
- Se o DSM tiver saída, chame DeviceDsmGetOutputLength para determinar o tamanho necessário para o buffer de saída da ação e, em seguida, aloque memória para esse buffer.
- Envie uma solicitação de IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES , passando os dados de entrada inicializados no buffer do sistema do IOCTL, juntamente com o buffer de saída alocado, se houver.
O manipulador manipula a solicitação IOCTL do DSM de uma das três maneiras:
- Manipule a solicitação e retorne com saída, se houver.
- Manipule a solicitação e encaminhe-a para o próximo driver inferior na pilha.
- 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.
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.