Compartilhar via


Rotinas de DispatchCreate e DispatchClose separadas

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

As rotinas de Despacho de outro driver para IRP_MJ_CREATE e IRP_MJ_CLOSE podem realizar mais tarefas, 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 do objeto de arquivo foram fechados e que 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 residentes algumas das rotinas do 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 de imagem paginável seja excluída quando todos os identificadores de objeto de arquivo para esses objetos de dispositivo do driver estiverem fechados.

Alguns drivers lidam com solicitações de IRP_MJ_CLOSE apenas para manter a simetria, porque, após seus objetos de dispositivo serem abertos por um subsistema protegido ou por um 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 ser 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 que o sistema continue 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 DRIVER_DISPATCH e DispatchClose, os drivers às vezes utilizam uma única rotina DispatchCreateClose para lidar com solicitações de criação e fechamento.