다음을 통해 공유


특정 할당자 필터링

온보드 메모리 또는 기타 디바이스 종속 스토리지 메서드에 할당자가 필요한 필터는 할당자 속성메서드를 지원하여 특정 할당자를 제공할 수 있습니다. 자세한 내용은 KSPROPERTY_STREAM_ALLOCATOR 참조하세요.

필터는 할당자에 대한 프레이밍 옵션을 지정하는 KSCREATE_REQUEST_ALLOCATOR 형식의 IRP_MJ_CREATE 받습니다. 미니드라이버의 할당자 만들기 루틴은 KsValidateAllocatorCreateRequest를 호출하여 만들기 요청의 유효성을 검사합니다. 호출이 성공하면 이 루틴은 관련 KSALLOCATOR_FRAMING 구조에 대한 포인터를 반환합니다.

필터가 프레이밍 요구 사항을 충족할 수 없는 경우 IRP에 대한 응답으로 오류 코드를 반환합니다. 그렇지 않으면 필터는 구조체에 대한 포인터를 파일 개체의 FsContext 멤버에 연결하고 결과 할당자 요청을 처리합니다.

스트리밍 인터페이스에 전달된 버퍼를 필터에 의해 현재 위치에서 수정해야 하는 경우 사용자 모드 클라이언트는 관련 KSALLOCATOR_FRAMING 구조에서 KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER 플래그를 설정합니다.

할당자가 사용할 수 있는 두 가지 인터페이스가 있습니다. 첫째, 모든 할당자는 IRP 기반 KSMETHODSETID_StreamAllocator 지원해야 합니다. 이 메커니즘을 사용하는 할당자는 최대 할당된 프레임 수로 제한됩니다. 이 제한을 초과하는 프레임 할당 요청은 보류 중으로 표시됩니다.

둘째, 할당 풀 유형을 DISPATCH_LEVEL 서비스할 수 있는 경우 미니드라이버에서 함수 테이블 액세스를 지원할 수 있습니다. 함수 테이블 액세스를 제공하는 것은 선택 사항입니다. KSPROPSETID_StreamAllocator 속성을 지원하여 이 작업을 수행합니다.

DISPATCH_LEVEL 인터페이스는 다음과 같이 작동합니다.

할당자에 할당 요청이 제출되면 할당자는 사용할 수 있는 경우 프레임에 대한 포인터를 반환합니다. 그렇지 않은 경우 즉시 NULL을 반환합니다.

할당자에 무료 요청이 제출되면 할당자는 스트림 할당자 "자유 프레임" 이벤트에 대해 클라이언트에 사용 가능한 프레임을 사용할 수 있음을 알립니다. 또한 할당 요청 IRP가 완료되기를 기다리는 경우 할당자는 작업자 항목(현재 IRQL이 PASSIVE_LEVEL 않은 경우)을 예약하고 자유 프레임으로 요청을 완료해야 합니다.

DISPATCH_LEVEL 인터페이스와 IRP 기반 인터페이스 모두 자유 프레임에 대해 경합할 수 있습니다. KS는 취소 스핀 잠금을 사용하여 이 큐를 동기화합니다.