Share via


겹치는 I/O 작업 처리

디바이스에서 작업을 겹치는 드라이버의 DpcForIsr 또는 CustomDpc 루틴은 StartIo 루틴에 대한 요청 입력과 IoRequestDpc 또는 KeInsertQueueDpc에 대한 ISR 호출 간의 일대일 대응을 사용할 수 없습니다. 이러한 드라이버의 DpcForIsr 또는 CustomDpc 는 IRP 및 ISR 제공 컨텍스트 또는 대상 디바이스 개체의 CurrentIrp 포인터에 대한 입력 포인터를 사용하여 해당 IRP만 완료할 수 없습니다.

지정된 순간에 동일한 DPC 개체를 두 번 큐에 대기할 수 없습니다. ISR이 해당 DpcForIsr 또는 CustomDpc가 실행되기 전에 IoRequestDpc 또는 KeInsertQueueDpc를 두 번 이상 호출하는 경우 프로세서의 IRQL이 DISPATCH_LEVEL 아래로 떨어질 때 DPC 루틴이 한 번만 실행됩니다. 반면에 해당 DpcForIsr 또는 CustomDpc가 다른 프로세서에서 실행되는 동안 ISR이 IoRequestDpc 또는 KeInsertQueueDpc를 호출하는 경우 DPC 루틴은 두 프로세서에서 동시에 실행할 수 있습니다.

따라서 디바이스에서 인터럽트 기반 I/O 작업과 겹치는 모든 드라이버에는 다음이 있어야 합니다.

  • 호출될 때마다 드라이버에서 유지 관리되는 미해결 요청 수를 완료할 수 있는 DpcForIsr 또는 CustomDpc 루틴

  • 해당 루틴이 컨텍스트 정보를 사용하고 컨텍스트 정보가 속한 IRP를 완료할 때까지 DpcForIsr 또는 CustomDpc 루틴에 전달하는 컨텍스트 정보를 덮어쓰지 않는 ISR

  • DpcForIsr 또는 CustomDpc 루틴을 대신하여 ISR의 컨텍스트 영역에 액세스하는 SynchCritSection 루틴