Usando o bloqueio de rotação de cancelamento do sistema
O sistema fornece um único bloqueio de rotação de cancelamento, que é adquirido ou liberado quando determinadas rotinas do sistema são chamadas.
Rotinas de driver que alteram o estado dos IRPs canceláveis, incluindo todas as rotinas que podem concluir um IRP com STATUS_CANCELLED, devem adquirir e liberar o bloqueio de rotação de cancelamento do sistema de acordo com as diretrizes nesta seção.
Em drivers que usam a fila de dispositivos fornecida pelo gerente de E/S, qualquer rotina de driver diferente da rotina Cancelar que altere o estado cancelável de um IRP deve primeiro chamar IoAcquireCancelSpinLock para adquirir o sistema cancelar o bloqueio de rotação.
A aquisição do bloqueio de rotação de cancelamento garante que apenas o chamador possa alterar o estado cancelável desse IRP. Enquanto o chamador mantém o bloqueio de rotação, o gerente de E/S não pode chamar a rotina cancelar do driver para esse IRP. Da mesma forma, outra rotina de driver, como uma rotina DispatchCleanup , não pode tentar simultaneamente alterar o estado cancelável desse IRP.
Em drivers que gerenciam suas próprias filas de IRPs e usam bloqueios de rotação fornecidos pelo driver para sincronizar o acesso à fila, as rotinas de driver não precisam adquirir o bloqueio de rotação de cancelamento antes de chamar IoSetCancelRoutine. No entanto, esses drivers devem marcar o ponteiro de rotina Cancelar que IoSetCancelRoutine retorna para determinar se a rotina Cancelar já foi iniciada. Consulte Usando um Driver-Supplied Spin Lock para obter detalhes.
Qualquer rotina de driver que chame IoAcquireCancelSpinLock deve chamar IoReleaseCancelSpinLock o mais rápido possível.
Um driver nunca deve chamar IoCompleteRequest com um IRP enquanto mantém um bloqueio de rotação. Tentar concluir um IRP enquanto mantém um bloqueio de rotação pode causar um deadlock.