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.Information와 irp->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에서는 드라이버에서 복사한 내용을 확인 할 수 없다)
'Windows Programming > 드라이버' 카테고리의 다른 글
메모리를 할당한 후 반드시 리턴값을 확인 할 것 (0) | 2009.04.14 |
---|---|
DRIVER_POWER_STATE_FAILURE (9f) (0) | 2009.04.14 |
FileObject->RelatedFileObject가 유효한 경우 (1) | 2009.01.19 |
File System의 로드와 볼륨마운트 과정 (1) | 2009.01.16 |
WDK Header의 계층관계 (0) | 2009.01.09 |