다음을 통해 공유


디스패치 루틴에서 IRP를 완료하는 방법

입력 IRP를 즉시 완료할 수 있는 경우 디스패치 루틴은 다음을 수행합니다.

  1. 일반적으로 IRP I/O 상태 블록의 상태정보 멤버를 적절한 값으로 설정합니다.

    • 디스패치 루틴은 상태를 STATUS_SUCCESS 또는 적절한 오류(STATUS_XXX)로 설정합니다. 이 값은 지원 루틴에 대한 호출 또는 특정 동기 요청에 대해 낮은 드라이버에서 반환되는 값일 수 있습니다.

      하위 수준 드라이버가 STATUS_PENDING 반환하는 경우 상위 수준 드라이버는 IRP에 대해 IoCompleteRequest 를 호출해서는 안 됩니다. 한 가지 예외가 있습니다. 상위 수준 드라이버는 이벤트를 사용하여 IoCompletion 루틴과 디스패치 루틴 간에 동기화할 수 있습니다. 이 경우 IoCompletion 루틴은 이벤트를 알리고 STATUS_MORE_PROCESSING_REQUIRED 반환합니다. 디스패치 루틴은 이벤트를 기다린 다음 IoCompleteRequest 를 호출하여 IRP를 완료합니다.

    • 읽기 또는 쓰기 요청과 같은 데이터 전송 요청이 충족된 경우 정보를 성공적으로 전송된 바이트 수로 설정합니다.

    • 정보를 STATUS_SUCCESS 사용하여 완료하는 다른 IRP에 대한 특정 요청에 따라 달라지는 값으로 설정합니다.

    • 정보를경고 STATUS_XXX로 완료하는 IRP에 대한 특정 요청에 따라 달라지는 값으로 설정합니다. 예를 들어 정보를 STATUS_BUFFER_OVERFLOW 같은 경고에 대해 전송된 바이트 수로 설정합니다.

    • 일반적으로 오류 STATUS_XXX로 완료되는 요청에 대해 정보를 0으로 설정합니다.

  2. IRP 및 PriorityBoost = IO_NO_INCREMENT 사용하여 IoCompleteRequest를 호출합니다.

  3. I/O 상태 블록에 이미 설정된 적절한 STATUS_XXX를 반환합니다. IoCompleteRequest를 호출하면 호출자가 지정된 IRP에 액세스할 수 없으므로 이미 완료된 IRP의 I/O 상태 블록에서 디스패치 루틴의 반환 값을 설정할 수 없습니다.

IRP를 사용하여 IoCompleteRequest를 호출하려면 다음 구현 지침을 따릅니다.

IoCompleteRequest를 호출하기 전에 드라이버가 보유하고 있는 모든 스핀 잠금을 항상 해제합니다.

특히 계층화된 드라이버 체인에서 IRP를 완료하는 데는 확정되지 않은 시간이 걸립니다. 또한 상위 수준 드라이버의 IoCompletion 루틴이 스핀 잠금을 보유하고 있는 하위 드라이버로 IRP를 다시 보내는 경우 교착 상태가 발생할 수 있습니다.