Rotinas dispatchCleanup
A rotina DispatchCleanup de um driver manipula IRPs para o código de função de E/S de IRP_MJ_CLEANUP .
Os drivers podem usar uma rotina DispatchCleanup para executar quaisquer operações de limpeza necessárias depois que todos os identificadores de um objeto de arquivo tiverem sido fechados. Observe que DispatchCleanup é chamado no contexto de processo do processo que fechou o identificador final; esse processo pode ser diferente do processo que inicialmente abriu o identificador. (Normalmente, essa diferença ocorre 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 de processo original podem usar a rotina PsSetCreateProcessNotifyRoutine para registrar uma rotina de retorno de chamada para essa finalidade, mas tenha em mente que esses retornos de chamada são um recurso limitado do sistema.
Em geral, uma rotina DispatchCleanup deve processar uma solicitação IRP_MJ_CLEANUP fazendo o seguinte para cada IRP que está atualmente na fila do dispositivo (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 Cancelar como NULL.
Cancele cada IRP que está atualmente na fila do objeto de dispositivo de destino, se o objeto de arquivo especificado no local da pilha de E/S do driver do IRP enfileirado corresponder ao objeto de arquivo que foi recebido no local da pilha de E/S da solicitação de IRP_MJ_CLEANUP .
Chame IoCompleteRequest para concluir o IRP e retorne 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 expedição, como DispatchRead e DispatchWrite.