:: 세상의 중심 ::

OVERLAPPED 구조체

2008. 2. 11. 09:26 : Computer/MFC
typedef struct _OVERLAPPED {
  ULONG_PTR Internal;
  ULONG_PTR InternalHigh;
  DWORD Offset;
  DWORD OffsetHigh;
  HANDLE hEvent;
} OVERLAPPED;


[Offset & OffsetHigh]
Offset은 파일내부에서의 전송이 시작되어야 할 위치.
이 위치는 파일의 시작점으로부터의 바이트 단위 Offset 이다. OVERLAPPED 구조체를 사용하는 프로세스가 ReadFile 이나 WriteFile 을 호출하기 전에 이 값을 설정한다.
named 파이프와 커뮤케이션 디바이스와 읽고쓰기 할때는 무시된다.
64비트 파일 옵셋. 파일이 아닌 디바이스에 대해서도 체크되므로 이 경우는 0 으로 반드시 초기화 해 주어야 한다. 그렇지 않으면 GetLastError()에서 ERROR_INVALID_PARAMETER 가 리턴된다


[hEvent]
전송이 완료(I/O completion notification)된 후 시그널될 이벤트 핸들.
이것을 호출하는 프로세스가 ReadFile, WriteFile, ConnectNamedPipe, or TransactNamedPipe() 를 호출하기전에 이 값을 설정한다.
비동기 I/O 연산이 완료되었는지를 확인하기위해 HasOverlappedIoCompleted 매크로를 사용할수 있다.
비동가 I/O 연산을 취소하기위해 CancelIo() 함수를 사용할수 있다.


[Internal]
에러코드 혹은 I/O request 처리 상태가 기록된다. 아직 처리시작하지 않은 초기값은 STATUS_PENDING 이다.
시스템 의존적인 상태를 기술하는 이것은 GetOverlappedResult() 가 ERROR_IO_PENDING 의 정보에 추가적인 에러를 세팅하지 않고 리턴되었을때 유효하다.

[InternalHigh]
I/O request가 완료되면 전송된 바이트가 기록되며, GetOverlappedResult() 가 true 를 반환하면 유효하다.

-I/O request가 완료되면 lpOverlapped 의 포인터를 통보받게 된다.
-만약 더 많은 context 정보 (예를 들어 hFile)를 이 구조체에 넣고 싶다면 방법이 있다. OVERLAPPED를 상속한 구조체를 하나 만들어, lpOverlapped 를 받았을 때 새 구조체로 casting 하면 된다. 즉, 그(파일) 포인터는 유지된다. (소켓에서는 socket 핸들을 사용)

Posted by bsh