Share via


스트림 포인터 및 IRP 취소

프레임에 이를 참조하는 잠긴 스트림 포인터가 있는 경우 이 프레임에 해당하는 IRP를 취소할 수 없습니다. 스트림 포인터 잠금 및 잠금 해제를 참조하세요.

다음 표에서는 미니드라이버가 IRP 취소를 지원하는 데 사용할 수 있는 기술을 나열합니다. 취소 전략은 맨 왼쪽 열에 설명된 대로 미니드라이버의 스트림 액세스 요구 사항을 기반으로 해야 합니다.

필요한 경우. 단계 의견

단일 액세스 지점에서 데이터 스트리밍에 대한 간략한 액세스

State 매개 변수가 KSSTREAM_POINTER_STATE_LOCKED 설정된 상태에서 KsPinGetLeadingEdgeStreamPointer를 호출합니다. 그런 다음, 처리 가 완료된 직후 KsStreamPointerUnlock 또는 KsStreamPointerAdvanceOffsetsAndUnlock 을 호출합니다.

스레드가 포인터를 획득하고 잠금을 해제하는 사이에 차단되지 않는 한 취소에 대한 빠른 응답성을 제공합니다.

액세스 시간의 무기한 길이이지만 취소 콜백의 컨텍스트에서 클레임을 포기할 수 있음

KsStreamPointerClone을 호출하여 잠긴 스트림 포인터(일반적으로 선행 에지)를 복제하고 잠금을 해제하고 CancelCallback에 응답합니다. 콜백은 큐의 스핀 잠금이 유지되어 DISPATCH_LEVEL 발생합니다. 따라서 공급업체에서 제공하는 CancelCallback 루틴은 큐 조작을 수행하거나 뮤텍스를 획득하는 함수를 호출할 수 없습니다. 대신 콜백 루틴에서 미니드라이버가 연결된 데이터에 나중에 액세스하지 않는지 확인한 다음 KsStreamPointerDelete를 호출합니다.

구현하기가 더 어려울 수 있지만 효율적인 액세스와 취소에 대한 빠른 응답 간에 최상의 균형을 제공하는 경우가 많습니다.

프레임에 정기적으로 액세스하고 액세스 간의 프레임 누락을 허용할 수 있습니다.

잠금 해제된 클론을 유지하고 KsStreamPointerLock 을 호출하여 액세스 시 잠급니다. 프레임이 취소되면 스트림 포인터를 잠그려는 다음 시도가 실패하고 미니드라이버가 KsStreamPointerDelete를 호출할 수 있습니다.

첫 번째 옵션과 마찬가지로 취소에 대한 응답성은 스트림 포인터가 잠기는 기간의 함수입니다.

액세스 시간의 무기한 길이이며 콜백에 대한 응답으로 클레임을 포기할 수 없습니다.

취소를 방지하기 위해 일정 시간 동안 잠긴 복제 스트림 포인터를 유지 관리합니다. 복제 스트림 포인터를 만들려면 KsStreamPointerClone을 호출합니다. 그런 다음 KsStreamPointerLockKsStreamPointerUnlock 을 호출하여 클론을 잠그거나 잠금을 해제합니다.

취소에 대한 응답성이 저하될 수 있습니다. 이 기술을 사용하여 스트림 포인터 시간 제한을 사용하는 것이 좋습니다.

프레임에 이를 참조하는 스트림 포인터가 있는 경우 미니 드라이버는 KsStreamPointerGetIrp 을 호출하여 이 프레임에 해당하는 IRP에 액세스할 수 있습니다. 프레임과 연결된 MDL(메모리 설명자 목록)을 검색하려면 KsStreamPointerGetMdl을 호출합니다.