Sincronizando o cancelamento de IRP

Da perspectiva de um driver, um IRP pode ser cancelado a qualquer momento. O cancelamento de IRP ocorre de forma assíncrona; Portanto, os pilotos devem ser capazes de lidar com várias condições potenciais de corrida, criadas se o IRP for cancelado em qualquer um dos seguintes pontos:

  • Depois que uma rotina de driver é chamada, mas antes de enfileirar um IRP.

  • Depois que uma rotina de driver é chamada, mas antes de tentar processar um IRP. Por exemplo, um IRP pode ser cancelado depois que a rotina StartIo de um driver é chamada, mas antes que a rotina StartIo remova o IRP da fila do dispositivo.

  • Depois que a rotina do driver desativa o IRP, mas antes de iniciar a E/S solicitada.

Observe que depois que um driver enfileira um IRP e libera todos os bloqueios de rotação que protegem a fila, outro thread pode acessar e alterar o IRP. Quando o thread original é retomado, mesmo assim que a próxima linha de código, o IRP pode já ter sido cancelado ou alterado de outra forma.

O driver pode usar a estrutura de fila IRP cancel-safe para implementar o enfileiramento IRP. Em seguida, o sistema registra uma rotina Cancelar para o driver que manipula automaticamente a sincronização para cancelar IRPs com segurança. Consulte Cancel-Safe IRP Queues para obter mais informações. Caso contrário, os drivers devem implementar sua própria sincronização.

Os seguintes membros de um IRP contêm informações sobre cancelamento:

  • Irp-> Cancelar indica se um IRP está sendo cancelado ou deve ser cancelado.

  • Irp-> CancelRoutine indica se um IRP é cancelável. Se esse membro contiver um ponteiro para uma rotina de cancelamento, o IRP será cancelável. Se esse membro for NULL, o IRP não poderá ser cancelado. Se esse membro for NULL, mas Irp-Cancel> estiver definido, isso indicará que a rotina de cancelamento está em execução e o IRP está em processo de cancelamento.

Se um driver lida com IRPs canceláveis, ele é responsável por definir a rotina De cancelamento apropriada em cada IRP que ele mantém em um estado cancelável.

Esta seção inclui os tópicos a seguir sobre como sincronizar o cancelamento de IRP.

Usando o bloqueio de rotação de cancelamento do sistema

Sincronizando o cancelamento em rotinas de driver que processam IRPs

Sincronizando o cancelamento em drivers de Higher-Level sem rotinas de cancelamento

Usando um Driver-Supplied Spin Lock