Notificando o sistema de arquivos de possíveis alterações de mídia
Um driver de dispositivo de mídia removível deve garantir que a mídia não seja alterada para o dispositivo representado pelo DeviceObject (entrada para cada rotina de driver que é enviada a um IRP) sempre que o driver processa um IRP que solicita uma transferência de/para a mídia ou uma operação de controle de E/S do dispositivo que afeta a mídia. O melhor momento possível para marcar para mídia alterada é logo após a transição de um estado sem mídia presente para um estado de mídia presente se o dispositivo físico sempre notificar o driver sobre essas alterações de estado.
Se seu dispositivo físico indicar que o estado da mídia pode ter sido alterado antes que o driver inicie uma operação de E/S ou durante uma operação, o driver deve fazer o seguinte:
Verifique se o volume está montado verificando o sinalizador VPB_MOUNTED no VPB. (Se o volume não estiver montado, o driver não deverá definir o bit DO_VERIFY_VOLUME. O driver deve definir IoStatus.Status como STATUS_IO_DEVICE_ERROR, definir IoStatus.Information como zero e chamar IoCompleteRequest com o IRP.)
Defina os Sinalizadores no DeviceObject by ORing Flags com DO_VERIFY_VOLUME.
Defina o bloco IoStatus no IRP para o seguinte:
- Status definido como STATUS_VERIFY_REQUIRED
- Informações definidas como zero
Antes de concluir qualquer IRP com um bloco IoStatus no qual o campo Status não está definido como STATUS_SUCCESS, o driver deve chamar IoIsErrorUserInduced, que retorna um TRUE booliano para qualquer um dos seguintes valores de Status :
- STATUS_VERIFY_REQUIRED
- STATUS_NO_MEDIA_IN_DEVICE
- STATUS_WRONG_VOLUME
- STATUS_UNRECOGNIZED_MEDIA
- STATUS_MEDIA_WRITE_PROTECTED
- STATUS_IO_TIMEOUT
- STATUS_DEVICE_NOT_READY
Se IoIsErrorUserInduced retornar TRUE, o driver deverá chamar IoSetHardErrorOrVerifyDevice para que o FSD possa abrir uma caixa de diálogo para o usuário, que pode optar por fornecer a mídia correta, repetir a solicitação original ou cancelar a operação solicitada.