미니 드라이버 동기화

스트리밍 미니드라이버 개발자는 클래스 드라이버가 동기화를 처리할 수 있도록 허용할 수 있습니다. 미니드라이버가 클래스 드라이버에 등록하는 경우 HW_INITIALIZATION_DATA TurnOffSynchronization 멤버를 FALSE로 설정하여 클래스 드라이버 제공 동기화를 선택할 수 있습니다.

클래스 드라이버가 동기화를 처리할 때 미니 드라이버 코드의 두 부분이 동시에 실행되지 않도록 합니다. 클래스 드라이버는 모든 스트림 요청을 큐에 대기시키고 미니드라이버에 한 번에 하나씩 전달합니다.

이 동기화의 한 가지 목적은 미니 드라이버 작성기가 멀티태스킹, 재진입, 다중 프로세서 환경에서 드라이버 동기화 및 요청 큐의 모든 세부 정보를 처리할 필요가 없도록 하는 것입니다. 그러나 일부 미니 드라이버는 사용하지 않아야 합니다. 동기화 예제 항목에는 동기화와 관련하여 미니드라이버가 수행해야 하는 작업을 보여 주는 두 가지 예제가 나와 있습니다.

스트림 클래스 동기화를 해제하면 모든 요청이 즉시 비동기적으로 PASSIVE_LEVEL 제출 스레드의 컨텍스트에서 미니드라이버로 호출됩니다. 이전 규칙의 예외는 HwCancelPacket, TimeoutHandler 및 타이머 루틴입니다. 이러한 항목은 DISPATCH_LEVEL 호출됩니다. 마지막 예외는 DIRQL에서 호출되는 인터럽트 처리기입니다.

동기화가 꺼져 있으면 미니드라이버가 WDM 모델을 준수하여 동기화를 수행합니다. 미니 드라이버가 PASSIVE_LEVEL 다시 호출되는 경우 DPC 또는 인터럽트 같은 더 높은 IRQL 이벤트에 의해 선점될 수 있습니다. 마찬가지로 미니드라이버가 DISPATCH_LEVEL 호출되면 이후에 인터럽트로 선점될 수 있습니다. 공유 리소스를 조작하는 미니드라이버 함수는 액세스를 동기화해야 합니다.

스트림 클래스 동기화가 해제된 경우 여러 요청을 동일하거나 다른 스트림에 동시에 발급할 수 있습니다. 미니 드라이버는 자체 요청을 큐에 대기하고 다른 스레드 및 ISR과의 하드웨어 동기화를 처리해야 합니다. 스핀 잠금, 뮤텍스 및 KeSynchronizeExecution 은 스트림 클래스 동기화 없이 실행되는 미니드라이버를 스트리밍하는 데 사용할 수 있는 동기화 개체 중 일부입니다.