Compartilhar via


Ponteiros de fluxo e cancelamento de IRP

Se um quadro tiver um ponteiro de fluxo bloqueado referenciando-o, o IRP que corresponde a esse quadro não poderá ser cancelado. Consulte Bloquear e desbloquear ponteiros de fluxo.

A tabela a seguir lista técnicas que o minidriver pode usar para dar suporte ao cancelamento de IRP. Sua estratégia de cancelamento deve ser baseada nos requisitos de acesso de fluxo do minidriver, conforme descrito na coluna mais à esquerda.

Se precisar. Faça isto Comentários

Acesso breve a dados de fluxo em um único ponto de acesso

Chame KsPinGetLeadingEdgeStreamPointer com o parâmetro State definido como KSSTREAM_POINTER_STATE_LOCKED. Em seguida, chame KsStreamPointerUnlock ou KsStreamPointerAdvanceOffsetsAndUnlock imediatamente após a conclusão do processamento.

Fornece capacidade de resposta rápida ao cancelamento, a menos que o thread bloqueie entre adquirir o ponteiro e desbloqueá-lo.

Tempo de acesso indefinido, mas pode renunciar à declaração no contexto de um retorno de chamada de cancelamento

Chame KsStreamPointerClone para clonar um ponteiro de fluxo bloqueado (geralmente a borda à esquerda), desbloqueá-lo e responder a CancelCallback. O retorno de chamada ocorre com o bloqueio de rotação da fila mantido, portanto, em DISPATCH_LEVEL. Assim, a rotina CancelCallback fornecida pelo fornecedor não pode executar funções de chamada ou manipulação de fila que adquirem um mutex. Em vez disso, na rotina de retorno de chamada, o minidriver verifica se os dados associados não serão acessados posteriormente e, em seguida, chama KsStreamPointerDelete.

Pode ser mais difícil de implementar, mas geralmente fornece o melhor equilíbrio entre acesso eficiente e resposta rápida ao cancelamento.

Acesso periódico a um quadro e pode tolerar o desaparecimento do quadro entre acessos

Mantenha um clone desbloqueado e chame KsStreamPointerLock para bloqueá-lo no momento do acesso. Se o quadro for cancelado, a próxima tentativa de bloquear o ponteiro de fluxo falhará e o minidriver poderá chamar KsStreamPointerDelete.

Assim como acontece com a primeira opção, a capacidade de resposta ao cancelamento é uma função de quanto tempo o ponteiro de fluxo está bloqueado.

Tempo de acesso indefinido e não é possível renunciar à declaração em resposta a um retorno de chamada

Mantenha um ponteiro de fluxo de clone bloqueado por qualquer período de tempo para evitar o cancelamento. Para criar um ponteiro de fluxo de clone, chame KsStreamPointerClone. Em seguida, chame KsStreamPointerLock e KsStreamPointerUnlock para bloquear ou desbloquear o clone.

A capacidade de resposta ao cancelamento pode ser ruim. Considere usar tempos limite de ponteiro de fluxo com essa técnica.

Se um quadro tiver um ponteiro de fluxo fazendo referência a ele, o minidriver poderá chamar KsStreamPointerGetIrp para acessar o IRP correspondente a esse quadro. Para recuperar a MDL (lista de descritores de memória) associada a um quadro, chame KsStreamPointerGetMdl.