Partilhar via


Processamento de dados

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no 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.]

Análise de dados de mídia

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

  • Ler N bytes de dados, onde o valor de N veio do conteúdo, sem verificar N em relação ao tamanho real do seu buffer.
  • Saltar diretamente para um deslocamento de byte dentro de um buffer, sem verificar se o deslocamento está realmente 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 para um BITMAPINFO sem primeiro verificar o tamanho do buffer que foi alocado para a estrutura BITMAPINFO.
  • Uma estrutura de WAVEFORMATEX pode ter informações de formato extra anexadas à estrutura. O membro cbSize especifica o tamanho das informações extras.

Durante a ligação de pinos, um filtro deve verificar se todas as estruturas de formato estã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 especial cuidado com o overflow aritmético. Por exemplo, em um BITMAPINFOHEADER, a largura e a altura são valores de de 32 bits longos, mas o tamanho da imagem (que é uma função do produto dos dois) é apenas um valor de DWORD.

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

Erros Durante a Transmissão

Quando o gráfico 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 para uma alteração de formato dinâmico, ele deverá rejeitar a solicitação ou honrar o novo formato quando ele chegar. Da mesma forma, nunca mude de formato, a menos que o outro filtro concorde. Para obter mais informações, consulte Alterações de formato dinâmico.