Partilhar via


Rotinas separadas de DispatchCreate e DispatchClose

As rotinas de expedição de um driver para solicitações de IRP_MJ_CREATE e IRP_MJ_CLOSE não podem fazer nada mais do que concluir o IRP de entrada com STATUS_SUCCESS. Para obter mais informações, consulte Concluindo IRPs.

Outras rotinas de expedição de driver para solicitações de IRP_MJ_CREATE e IRP_MJ_CLOSE podem fazer mais trabalho, dependendo do driver de dispositivo subjacente ou do dispositivo subjacente. Considere os seguintes cenários:

  • Ao receber uma solicitação de criação, um driver de classe pode inicializar uma fila interna e enviar uma solicitação IRP_MJ_INTERNAL_DEVICE_CONTROL para o driver de porta correspondente solicitando informações de configuração do dispositivo ou acesso exclusivo a uma porta do controlador.

  • O recebimento de IRP_MJ_CLOSE indica que a última referência ao objeto de arquivo associado ao objeto de dispositivo de destino foi removida. Isso implica que todos os identificadores para o objeto de arquivo foram fechados e todas as solicitações de E/S pendentes foram concluídas ou canceladas.

  • Ao receber uma solicitação de criação, um driver de um dispositivo usado com pouca frequência pode chamar MmLockPagableCodeSection para tornar residente algumas das rotinas de driver que processam outras solicitações IRP_MJ_XXX . Ao receber uma solicitação de fechamento recíproca, o driver pode chamar MmUnlockPagableImageSection para conservar a memória do sistema, fazendo com que sua seção pageable-image seja paginada quando todos os identificadores de objeto de arquivo para esses objetos de dispositivo do driver forem fechados.

Alguns drivers lidam com IRP_MJ_CLOSE solicitações apenas para simetria porque, depois que seus objetos de dispositivo são abertos por um subsistema protegido ou driver de nível superior, os objetos de dispositivo dos drivers de nível inferior não são fechados até que o próprio sistema seja desligado. Por exemplo, drivers de teclado e mouse configuram objetos de dispositivo que representam dispositivos físicos que devem estar funcionais enquanto o sistema está em execução, portanto, esses drivers podem ter rotinas mínimas do DispatchClose para simetria ou podem ter rotinas combinadas de DispatchCreateClose .

Se o dispositivo controlado por um driver de nível inferior precisar estar disponível para o sistema continuar em execução, a rotina DispatchClose do driver geralmente não será chamada. Por exemplo, alguns dos drivers de disco do sistema não têm rotina DispatchClose , mas esses drivers geralmente têm rotinas DispatchFlushBuffers e DispatchShutdown para concluir quaisquer operações de E/S de arquivo pendentes antes que o sistema seja desligado.

Embora você possa implementar rotinas separadas de DRIVER_DISPATCH e DispatchClose , os drivers às vezes têm uma única rotina DispatchCreateClose para lidar com solicitações de criação e fechamento.