Partilhar via


Rotinas de limpeza do DispatchCleanup

A rotina DispatchCleanup de um driver processa IRPs para o código de função de I/O IRP_MJ_CLEANUP.

Os drivers podem usar uma rotina DispatchCleanup para executar quaisquer operações de limpeza necessárias depois de todos os manipuladores de um objeto de arquivo terem sido fechados. Observe que DispatchCleanup é chamado no contexto do processo que fechou o identificador final; esse processo pode ser diferente do processo que abriu inicialmente o identificador. (Normalmente, essa diferença acontece porque outro processo usa a rotina de modo de usuário DuplicateHandle para duplicar os identificadores de processos.) Os drivers que devem executar a limpeza no contexto do processo original podem usar a rotina PsSetCreateProcessNotifyRoutine para registrar uma rotina de retorno de chamada para essa finalidade, mas lembre-se de que esses retornos de chamada são um recurso limitado do sistema.

Em geral, uma rotina DispatchCleanup deve processar uma solicitação de IRP_MJ_CLEANUP fazendo o seguinte para cada IRP que está atualmente na fila de dispositivos (ou na fila interna de IRPs do driver), para o objeto de dispositivo de destino e está associado ao objeto de arquivo:

  • Chame IoSetCancelRoutine para definir o ponteiro de rotina Cancel como NULL.

  • Cancele cada IRP que está atualmente na fila para o dispositivo de destino, se o objeto de arquivo especificado na localização da pilha de E/S do driver do IRP enfileirado corresponder ao objeto de arquivo que foi recebido na localização da pilha de E/S da solicitação IRP_MJ_CLEANUP.

  • Chame IoCompleteRequest para concluir o IRP e devolver STATUS_SUCCESS.

Ao processar uma solicitação de IRP_MJ_CLEANUP , um driver pode receber solicitações adicionais, como IRP_MJ_READ ou IRP_MJ_WRITE. Portanto, um driver que deve desalocar recursos também deve sincronizar a execução de sua rotina DispatchCleanup com outras rotinas de despacho, como DispatchRead e DispatchWrite.