Delen via


Gegevensverwerking

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

mediagegevens parseren

Als uw filter mediagegevens parseert, vertrouwt u geen headers of andere zelfbeschrijfde gegevens in de inhoud. Vertrouw bijvoorbeeld geen groottewaarden die worden weergegeven in AVI RIFF-segmenten of MPEG-pakketten. Veelvoorkomende voorbeelden van dit soort fouten zijn:

  • Het lezen van N bytes aan gegevens, waarbij de waarde van N afkomstig is van de inhoud, zonder N te controleren op de werkelijke grootte van uw buffer.
  • Springen naar een byte-offset binnen een buffer, zonder te controleren of de offset binnen de buffer valt.

Een andere veelvoorkomende klasse fouten omvat het niet valideren van indelingsbeschrijvingen die in de inhoud worden gevonden. Bijvoorbeeld:

  • Een BITMAPINFOHEADER structuur kan worden gevolgd door een kleurentabel. De BITMAPINFO structuur wordt gedefinieerd als een BITMAPINFOHEADER structuur gevolgd door een matrix met RGBQUAD- waarden waaruit de kleurentabel bestaat. De grootte van de matrix wordt bepaald door de waarde van biClrUsed. Kopieer nooit een kleurentabel naar een BITMAPINFO zonder eerst de grootte van de buffer te controleren die is toegewezen voor de BITMAPINFO structuur.
  • Een WAVEFORMATEX structuur bevat mogelijk extra opmaakgegevens die aan de structuur zijn toegevoegd. De cbSize lid specificeert de grootte van de extra informatie.

Tijdens de pennenverbinding moet een filter controleren of alle formaatstructuren goed zijn gevormd en redelijke waarden bevatten. Als dat niet het geval is, weigert u de verbinding. In de code die de indelingsstructuur valideert, moet u vooral voorzichtig zijn met rekenkundige overloop. In een BITMAPINFOHEADERzijn de breedte en hoogte bijvoorbeeld 32-bits lange waarden, maar de grootte van de afbeelding (een functie van het product van de twee) is slechts een DWORD- waarde.

Als de opmaak van gegevens uit de bron groter is dan de toegewezen buffer, kapt u de brongegevens niet af om deze naar uw buffer te kopiëren. Hierdoor kan een structuur worden gemaakt waarvan de impliciete grootte groter is dan de werkelijke grootte. Een bitmapkoptekst kan bijvoorbeeld een palettabel opgeven die niet meer bestaat. In plaats daarvan kunt u de buffer opnieuw toewijzen of gewoon de verbinding laten mislukken.

fouten tijdens het streamen

Wanneer de grafiek wordt uitgevoerd en uw filter onjuiste inhoud ontvangt, moet het streamen worden beëindigd. Ga als volgt te werk:

Opmaakwijzigingen

Er bestaan verschillende mechanismen voor filters om indelingen mid-stream te wijzigen. Elk van deze omvat meer dan één stap, waardoor het potentieel voor valse acceptaties ontstaat. Als uw filter een aanvraag voor een dynamische indelingswijziging krijgt, moet het de aanvraag afwijzen of de nieuwe indeling respecteren wanneer het binnenkomt. Schakel op dezelfde manier nooit tussen indelingen, tenzij het andere filter akkoord gaat. Zie Dynamische opmaakwijzigingenvoor meer informatie.