Freigeben über


Verarbeiten von Daten

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Analysieren von Mediendaten

Wenn Ihr Filter Mediendaten analysiert, sollten Sie Headern oder anderen selbstbeschreibenden Daten im Inhalt nicht vertrauen. Vertrauen Sie beispielsweise keine Größenwerte, die in AVI RIFF-Blöcken oder MPEG-Paketen angezeigt werden. Häufige Beispiele für diese Art von Fehler sind:

  • Lesen von N Byte von Daten, wobei der Wert von N aus dem Inhalt stammt, ohne N mit der tatsächlichen Größe Ihres Puffers zu überprüfen.
  • Springen zu einem Byteoffset innerhalb eines Puffers, ohne zu überprüfen, ob der Offset in den Puffer fällt.

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 , die die Farbtabelle bilden. 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 der BITMAPINFO-Struktur zugeordnet wurde.
  • Eine WAVEFORMATEX-Struktur kann zusätzliche Formatinformationen an die Struktur angefügt haben. Das cbSize-Element gibt die Größe der zusätzlichen Informationen an.

Während der Pinverbindung sollte ein Filter überprüfen, ob alle Formatstrukturen wohlgeformt sind und vernünftige Werte enthalten. Wenn dies nicht der Falle ist, lehnen Sie die Verbindung ab. Achten Sie im Code, der die Formatstruktur überprüft, besonders vorsichtig mit dem arithmetischen Überlauf. In einem BITMAPINFOHEADER sind die Breite und Höhe beispielsweise 32 Bit lang , aber die Bildgröße (die eine Funktion des Produkts der beiden ist) ist nur ein DWORD-Wert .

Wenn Formatdaten aus der Quelle größer als der zugeordnete Puffer sind, schneiden Sie die Quelldaten nicht ab, um sie in Ihren Puffer zu kopieren. Dadurch kann eine Struktur erstellt werden, deren implizite Größe größer als ihre tatsächliche Größe ist. Beispielsweise kann ein Bitmapheader eine Palettentabelle angeben, die nicht mehr vorhanden ist. Stellen 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 formatierten Inhalt empfängt, sollte er das Streaming beenden. Gehen Sie folgendermaßen vor:

Formatänderungen

Es gibt mehrere Mechanismen für Filter, um formate mid-stream zu ändern. Jeder von ihnen umfasst mehr als einen Schritt, was das Potenzial für falsche Annahmen schafft. Wenn der Filter eine Anforderung für eine dynamische Formatänderung erhält, muss er entweder die Anforderung ablehnen oder das neue Format berücksichtigen, wenn er eintrifft. Ebenso sollten Sie niemals formate wechseln, es sei denn, der andere Filter stimmt zu. Weitere Informationen finden Sie unter Dynamische Formatänderungen.