Introdução aos ponteiros de fluxo

No modelo de classe de fluxo mais antigo, o minidriver é responsável por manter suas próprias filas de SRB (bloco de solicitação de fluxo de dados). O AVStream fornece essa funcionalidade por meio da abstração do ponteiro de fluxo. Um ponteiro de fluxo é uma referência a um quadro de dados AVStream específico.

Minidrivers que usam o processamento centrado em pin (a maioria dos drivers de hardware), usam ponteiros de fluxo para gerenciar filas de pinos. Cada pino tem uma fila independente de buffers de dados. Quando um pacote de dados chega ao pino (uma solicitação de leitura ou gravação), o AVStream adiciona o pacote à fila e pode chamar a expedição do processo do pino.

Minidrivers que usam processamento centrado em filtro não devem usar ponteiros de fluxo diretamente. Consulte processamento centrado em filtro para obter mais informações.

Por padrão, cada fila tem um ponteiro de fluxo de borda à esquerda. Opcionalmente, ele poderá ter um ponteiro de fluxo de borda à direita se o sinalizador de borda à direita for especificado. O minidriver pode criar novos ponteiros de fluxo chamando KsStreamPointerClone.

Você pode mover um ponteiro de fluxo apenas em uma direção: para um quadro mais recente. Isso é chamado de avanço do ponteiro de fluxo.

Avançando um ponteiro de fluxo

Quando você avança um ponteiro de fluxo, move-o para um quadro mais recente ou avança-o em algum número de bytes dentro de seu quadro atual. Por exemplo, o minidriver pode avançar um ponteiro de fluxo da chegada do primeiro quadro para a chegada do segundo quadro.

Para avançar um ponteiro de fluxo, um filtro centrado em pin pode chamar KsStreamPointerAdvance ou KsStreamPointerUnlock com o parâmetro Ejetar definido como TRUE.

Contagens de referência de quadro

Quadros com ponteiros de fluxo apontando para eles são contados por referência, assim como quadros que estão na janela entre as bordas à esquerda e à direita.

Quando um minidriver é concluído com um ponteiro de fluxo, ele pode opcionalmente chamar KsStreamPointerSetStatusCode para especificar um código de erro com o qual concluir o IRP (pacote de solicitação de E/S) fornecido. Em seguida, o minidriver deve chamar KsStreamPointerDelete. Em seguida, o AVStream diminui a contagem de referência no quadro que o ponteiro de fluxo excluído referenciava anteriormente. Os ponteiros de fluxo de borda à esquerda e à direita não podem ser excluídos.