Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.
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.
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.
O Remetente inicializa o DSM e envia-o para o primeiro Handler na pilha, efetuando 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 do bloco de parâmetros 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 para adicionar DEVICE_DSM_RANGE estrutura(s) 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 da IOCTL, juntamente com o buffer de saída alocado, se houver.
O manipulador lida com a solicitação IOCTL do DSM de uma das três maneiras:
- Trate a solicitação e devolva o resultado, se houver.
- Manipule a solicitação e encaminhe-a para o próximo controlador de nível 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 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.
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.