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:

  1. 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.)

  2. Defina os Sinalizadores no DeviceObject by ORing Flags com DO_VERIFY_VOLUME.

  3. Defina o bloco IoStatus no IRP para o seguinte:

    • Status definido como STATUS_VERIFY_REQUIRED
    • Informações definidas como zero
  4. 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.