Processando dados

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Analisando dados de mídia

Se o filtro analisar dados de mídia, não confie em cabeçalhos ou em outros dados autodescritivos no conteúdo. Por exemplo, não confie em valores de tamanho que aparecem em blocos AVI RIFF ou pacotes MPEG. Exemplos comuns desse tipo de erro incluem:

  • Leitura de N bytes de dados, em que o valor de N veio do conteúdo, sem verificar N em relação ao tamanho real do buffer.
  • Saltar para um deslocamento de bytes dentro de um buffer, sem verificar se o deslocamento está dentro do buffer.

Outra classe comum de erros envolve não validar descrições de formato encontradas no conteúdo. Por exemplo:

  • Uma estrutura BITMAPINFOHEADER pode ser seguida por uma tabela de cores. A estrutura BITMAPINFO é definida como uma estrutura BITMAPINFOHEADER seguida por uma matriz de valores RGBQUAD que compõem a tabela de cores. O tamanho da matriz é determinado pelo valor de biClrUsed. Nunca copie uma tabela de cores em um BITMAPINFO sem primeiro verificar o tamanho do buffer alocado para a estrutura BITMAPINFO .
  • Uma estrutura WAVEFORMATEX pode ter informações de formato extra acrescentadas à estrutura. O membro cbSize especifica o tamanho das informações extras.

Durante a conexão de pino, um filtro deve verificar se todas as estruturas de formato são bem formadas e contêm valores razoáveis. Caso contrário, rejeite a conexão. No código que valida a estrutura de formato, tenha cuidado especial com o estouro aritmético. Por exemplo, em um BITMAPINFOHEADER, a largura e a altura são valores longos de 32 bits, mas o tamanho da imagem (que é uma função do produto dos dois) é apenas um valor DWORD .

Se os dados de formato da origem forem maiores que o buffer alocado, não trunque os dados de origem para copiá-los para o buffer. Isso pode criar uma estrutura cujo tamanho implícito é maior que seu tamanho real. Por exemplo, um cabeçalho bitmap pode especificar uma tabela de paleta que não existe mais. Em vez disso, realocar o buffer ou simplesmente falhar a conexão.

Erros durante o streaming

Quando o grafo estiver em execução, se o filtro receber conteúdo malformado, ele deverá encerrar o streaming. Faça o seguinte:

Alterações de formato

Existem vários mecanismos para que os filtros alterem os formatos no meio do fluxo. Cada um deles envolve mais de uma etapa, o que cria o potencial para falsas aceitações. Se o filtro receber uma solicitação de alteração de formato dinâmico, ele deverá rejeitar a solicitação ou então respeitar o novo formato quando ela chegar. Da mesma forma, nunca alterne formatos, a menos que o outro filtro concorde. Para obter mais informações, consulte Alterações de formato dinâmico.