Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 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 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 a partir do início da estrutura DEVICE_DSM_INPUT onde os intervalos começam. A estrutura do buffer do sistema é mostrada no diagrama a seguir.
Se a ação de gerenciamento retornar uma 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 para essa ação, um bloco de saída seguirá imediatamente após 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.
Fluxo de processo de uma ação DSM
O fluxo de processo de uma ação DSM é descrito abaixo, em que o Remetente é o solicitante de ação e o Manipulador processa a ação solicitada. Observe que pode haver mais de um Handler na pilha.
O Remetente inicializa o DSM e o envia para o primeiro Handler 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 de 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 DEVICE_DSM_ACTION Descrições para obter mais detalhes.
- Se a ação tiver intervalos, chame DeviceDsmAddDataSetRange para cada intervalo a fim de adicionar a estrutura DEVICE_DSM_RANGE 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 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 o resultado, 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 de DEVICE_DSM_ACTION (DeviceDsmActionFlag_NonDestructive) estiver ativado. 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, o Manipulador extrairá a entrada para obter a ação. Se a ação tiver um bloco de parâmetros, o Manipuladorchamará DeviceDsmParameterBlock para obter o bloco de parâmetros. Se a ação tiver dados de intervalo, o Manipuladorchamará 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, o Manipuladorchamará 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, o Remetente extrairá o bloco de saída, se houver, chamando DeviceDsmOutputBlock.
Para obter detalhes sobre cada ação de DSM específica, consulte Descrições da ação DSM do dispositivo.