Compartilhar via


Rotinas de DispatchCleanup

A rotina DispatchCleanup de um driver manipula IRPs para o código de função de entrada/saída IRP_MJ_CLEANUP.

Os drivers podem usar uma rotina DispatchCleanup para executar todas as operações de limpeza necessárias depois que todas as alças de um objeto de arquivo tiverem sido fechadas. Note que DispatchCleanup é chamado no contexto 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 do 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 de sistema limitado.

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 para o objeto de 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 recebido na localização da pilha de E/S da solicitação IRP_MJ_CLEANUP.

  • Execute IoCompleteRequest para concluir o IRP e retornar 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.