반응형

IRP_MJ_DEVICE_CONTROL Irp의 완료처리

 

irp->IoStatus.Information = outbuf_len;

irp->IoStatus.Status = status;

IoCompleteRequest( irp, IO_NO_INCREMENT );

 

IRP_MJ_DEVICE_CONTROL IRP의 처리를 완료할 때 사용하는 일반적인(?) 코드이다.

 

irp->IoStatus.Informationirp->IoStatus. Status 는 정확히 어떠한 용도로 사용되는가?

드라이버 입문서적을 자세히 읽어 본 사람이라면 잘 알고 있겠지만, 드라이버 개발 초기 많이 실수를 하기도 했던 부분이라 정리해 본다.

 

n  irp->IoStatus.Status

ü  IRP의 처리 결과를 설정한다. 여기에 설정한 Status값에 따라 User-mode에서 DeviceIoControl()함수를 호출한 후, 이어서 호출하는 GetLastError()의 에러값이 설정된다.

n  irp->IoStatus.Information

ü  Buffered-Methord방식으로 버퍼를 관리하는 DeviceIoCotrol의 경우, 시스템 버퍼에서 user-buffer로 복사되는 사이즈를 기술한다. 예를 들어 irp->AssociatedIrp.SystemBuffer 10Byte를 복사했더라도 irp->IoStatus.Information 0을 대입한 후 리턴해 주면, user-buffer에는 어떠한 데이터도 복사되지 않는다.( user-mode에서는 드라이버에서 복사한 내용을 확인 할 수 없다)

 

반응형

+ Recent posts