Elaborazione dei dati
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Analisi dei dati multimediali
Se il filtro analizza i dati multimediali, non considerare attendibili le intestazioni o altri dati autodescrizione nel contenuto. Ad esempio, non considerare attendibili i valori delle dimensioni visualizzati in blocchi AVI RIFF o pacchetti MPEG. Esempi comuni di questo tipo di errore includono:
- Lettura N byte di dati, dove il valore di N proviene dal contenuto, senza controllare N rispetto alle dimensioni effettive del buffer.
- Passaggio a un offset di byte all'interno di un buffer, senza verificare che l'offset rientra nel buffer.
Un'altra classe comune di errori comporta la mancata convalida delle descrizioni di formato disponibili nel contenuto. Ad esempio:
- Una struttura BITMAPINFOHEADER può essere seguita da una tabella di colori. La struttura BITMAPINFO è definita come struttura BITMAPINFOHEADER seguita da una matrice di valori RGBQUAD che costituiscono la tabella dei colori. La dimensione della matrice è determinata dal valore di biClrUsed. Non copiare mai una tabella di colori in un BITMAPINFO senza prima controllare le dimensioni del buffer allocato per la struttura BITMAPINFO .
- Una struttura WAVEFORMATEX potrebbe avere informazioni di formato aggiuntive aggiunte alla struttura. Il membro cbSize specifica le dimensioni delle informazioni aggiuntive.
Durante la connessione pin, un filtro deve verificare che tutte le strutture di formato siano ben formate e contengano valori ragionevoli. In caso contrario, rifiutare la connessione. Nel codice che convalida la struttura di formato, prestare particolare attenzione all'overflow aritmetico. Ad esempio, in bitmapINFOHEADER, la larghezza e l'altezza sono valori lunghi a 32 bit, ma le dimensioni dell'immagine (che è una funzione del prodotto dei due) sono solo un valore DWORD .
Se i dati di formato dall'origine sono maggiori del buffer allocato, non troncare i dati di origine per copiarlo nel buffer. In questo modo, è possibile creare una struttura la cui dimensione implicita è maggiore della dimensione effettiva. Ad esempio, un'intestazione bitmap potrebbe specificare una tabella della tavolozza che non esiste più. Invece, riallocare il buffer o semplicemente non riuscire la connessione.
Errori durante lo streaming
Quando il grafico è in esecuzione, se il filtro riceve contenuto non valido, deve terminare lo streaming. Eseguire le operazioni seguenti:
- Restituisce un codice di errore da Ricezione.
- Chiamare IPin::EndOfStream nel filtro downstream.
- Chiamare CBaseFilter::NotifyEvent per pubblicare un evento EC_ERRORABORT .
Modifica formato
Esistono diversi meccanismi per i filtri per modificare i formati di flusso intermedio. Ognuno di essi prevede più passaggi, che creano il potenziale di accettazione false. Se il filtro ottiene una richiesta per una modifica del formato dinamico, deve rifiutare la richiesta oppure rispettare il nuovo formato quando arriva. Analogamente, non passare mai ai formati, a meno che l'altro filtro non accetti. Per altre informazioni, vedere Modifiche al formato dinamico.