다음을 통해 공유


데이터 처리

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

미디어 데이터 구문 분석

필터가 미디어 데이터를 구문 분석하는 경우 콘텐츠의 헤더 또는 기타 자체 설명 데이터를 신뢰하지 마세요. 예를 들어 AVI RIFF 청크 또는 MPEG 패킷에 표시되는 크기 값을 신뢰하지 마세요. 이러한 종류의 오류의 일반적인 예는 다음과 같습니다.

  • 퍼의 실제 크기에 대해 N을 확인하지 않고 N의 값이 콘텐츠에서 나온 데이터의 N바이트를 읽습니다.
  • 오프셋이 버퍼 내에 있는지 확인하지 않고 버퍼 내에서 바이트 오프셋으로 점프합니다.

또 다른 일반적인 오류 클래스에는 콘텐츠에 있는 형식 설명의 유효성을 검사하지 않는 작업이 포함됩니다. 예를 들면 다음과 같습니다.

  • BITMAPINFOHEADER 구조 뒤에 색 테이블이 있을 수 있습니다. BITMAPINFO 구조체는 BITMAPINFOHEADER 구조체로 정의되고 그 다음에는 색 테이블을 구성하는 RGBQUAD 값 배열로 정의됩니다. 배열의 크기는 biClrUsed 값에 따라 결정됩니다. 먼저 BITMAPINFO 구조에 할당된 버퍼의 크기를 확인하지 않고도 색 테이블을 BITMAPINFO 에 복사하지 마세요.
  • WAVEFORMATEX 구조체에는 구조체에 추가 형식 정보가 추가될 수 있습니다. cbSize 멤버는 추가 정보의 크기를 지정합니다.

핀 연결 중에 필터는 모든 형식 구조가 올바른 형식이고 적절한 값을 포함하는지 확인해야 합니다. 그렇지 않은 경우 연결을 거부합니다. 형식 구조의 유효성을 검사하는 코드에서는 산술 오버플로에 특히 주의해야 합니다. 예를 들어 BITMAPINFOHEADER에서 너비와 높이는 32비트 길이 값이지만 이미지 크기(둘의 곱 함수)는 DWORD 값일 뿐입니다.

원본의 서식 데이터가 할당된 버퍼보다 큰 경우 버퍼에 복사하기 위해 원본 데이터를 자르지 마세요. 이렇게 하면 암시적 크기가 실제 크기보다 큰 구조를 만들 수 있습니다. 예를 들어 비트맵 헤더는 더 이상 존재하지 않는 색상표 테이블을 지정할 수 있습니다. 대신 버퍼를 다시 할당하거나 연결에 실패합니다.

스트리밍 중 오류

그래프가 실행 중일 때 필터가 잘못된 형식의 콘텐츠를 수신하는 경우 스트리밍을 종료해야 합니다. 다음을 수행합니다.

변경 내용 서식 지정

필터가 스트림 중간에 형식을 변경하기 위한 몇 가지 메커니즘이 있습니다. 그들 각각은 거짓 수용의 잠재력을 만드는 두 개 이상의 단계를 포함한다. 필터가 동적 형식 변경 요청을 받는 경우 요청을 거부하거나 새 형식이 도착하면 적용해야 합니다. 마찬가지로 다른 필터가 동의하지 않는 한 형식을 전환하지 마세요. 자세한 내용은 동적 서식 변경을 참조하세요.