Verarbeiten von Daten
Analysieren von Mediendaten
Wenn Ihr Filter Mediendaten analysiert, sollten Sie Headern oder anderen selbstbeschreibenden Daten im Inhalt nicht vertrauen. Vertrauen Sie z. B. nicht den Größenwerten, die in AVI CSV-Blöcken oder MPEG-Paketen angezeigt werden. Häufige Beispiele für diese Art von Fehler sind:
- Lesen von N Bytes von Daten, wobei der Wert von N aus dem Inhalt stammt, ohne N anhand der tatsächlichen Größe des Puffers zu überprüfen.
- Springen zu einem Byteoffset innerhalb eines Puffers, ohne zu überprüfen, ob der Offset innerhalb des Puffers liegt.
Eine weitere häufige Fehlerklasse besteht darin, formatbeschreibungen, die im Inhalt gefunden werden, nicht zu überprüfen. Beispiel:
- Auf eine BITMAPINFOHEADER-Struktur kann eine Farbtabelle folgen. Die BITMAPINFO-Struktur ist als BITMAPINFOHEADER-Struktur definiert, gefolgt von einem Array von RGBQUAD-Werten, aus denen die Farbtabelle besteht. Die Größe des Arrays wird durch den Wert von biClrUsed bestimmt. Kopieren Sie niemals eine Farbtabelle in eine BITMAPINFO, ohne zuerst die Größe des Puffers zu überprüfen, der für die BITMAPINFO-Struktur zugeordnet wurde.
- An eine WAVEFORMATEX-Struktur werden möglicherweise zusätzliche Formatinformationen angefügt. Der cbSize-Member gibt die Größe der zusätzlichen Informationen an.
Während der Stecknadelverbindung sollte ein Filter überprüfen, ob alle Formatstrukturen wohlgeformt sind und sinnvolle Werte enthalten. Falls nicht, weisen Sie die Verbindung zurück. Achten Sie im Code, der die Formatstruktur überprüft, besonders auf arithmetische Überläufe. In einem BITMAPINFOHEADER sind z. B. die Breite und Höhe 32-Bit-Werte, aber die Bildgröße (die eine Funktion des Produkts der beiden ist) ist nur ein DWORD-Wert.
Wenn die Formatdaten aus der Quelle größer als der zugeordnete Puffer sind, sollten Sie die Quelldaten nicht abschneiden, um sie in Ihren Puffer zu kopieren. Auf diese Weise kann eine -Struktur erstellt werden, deren implizite Größe größer als die tatsächliche Größe ist. Beispielsweise kann ein Bitmapheader eine Palettentabelle angeben, die nicht mehr vorhanden ist. Geben Sie stattdessen den Puffer neu zu, oder schlagen Sie einfach die Verbindung fehl.
Fehler während des Streamings
Wenn das Diagramm ausgeführt wird und Ihr Filter falsch formatierte Inhalte empfängt, sollte das Streaming beendet werden. Gehen Sie folgendermaßen vor:
- Gibt einen Fehlercode von Empfangen zurück.
- Rufen Sie IPin::EndOfStream für den Downstreamfilter auf.
- Rufen Sie CBaseFilter::NotifyEvent auf, um ein EC _ ERRORABORT-Ereignis zu veröffentlichen.
Formatänderungen
Es gibt mehrere Mechanismen für Filter, um Formate während des Streams zu ändern. Jeder dieser Schritte umfasst mehr als einen Schritt, wodurch das Potenzial für falsche Akzeptanz entsteht. Wenn Ihr Filter eine Anforderung für eine dynamische Formatänderung erhält, muss er die Anforderung entweder ablehnen oder das neue Format beim Eintreffen berücksichtigen. Wechseln Sie auf ähnliche Weise niemals zwischen Formaten, es sei denn, der andere Filter stimmt zu. Weitere Informationen finden Sie unter Dynamische Formatänderungen.