티스토리 뷰

반응형

Windows Message Loop ?

윈도우즈 프로그램에서 메세지를 읽어들이고, "윈도우 프로시저"에 메세지를 전달하는 역할


 

Winodws Message Loop는 윈도우즈 기반 GUI 프로그램에 반드시 포함되는 루틴이다.

       (엄격하지는 않고 수정도 가능하지만 유사한 기능을하는 루틴이 반드시 있어야한다.)

기본적으로 아래 그림과 같이 구성된다. 사용자가 수정할 수 있어서 조금씩 차이가 있을 수 있다.

 

 

  • 윈도우즈 시스템은 각각 프로세스에 대해서 개별적인 메세지 큐를 할당한다.
  • 메세지 발생시 운영체제가 해당 프로세스의 메세지 큐에 메세지늘 넣는다. (스스로 추가도 가능)
  • 프로세스는 자신의 메세지 큐에서 메세지를 지속적으로 읽어들이며 대응하는 함수로 메세지를 전달한다.

 

 

위 Windows Message Loop는 기본스레드에서 분리되어 별도의 스레드로 동작하게 된다.

 

 

사용되는 함수

  • GetMessage() : 메세지 큐에서 메세지를 읽어온다. (메세지가 없으면 Blocking)
  • TranslateMessage() : 가상 키 입력을 문자열로 변환한다. (필수는 아니지만 에러 가능성)
  • DispatchMessage() : 메세지를 "윈도우 프로시저"에 전달한다. (Switch-case문으로 구성됨)

(추가로 GetMessage API 대신 PeekMessage, WaitMessage API 를 사용할 수 있다.)

 

 

 

마지막으로 디버거로 살펴보게 되면 위 그림과 같이 루틴이 구성되어 있다.

EDI, EBX, ESI에 각각 TranslateMessage API, DispatchMessageA API, GetMessage API를 저장하고,

반복해서 실행하는 루틴을 확인할 수 있다.

 

이 부분으로 EIP가 진입하게 되면 빠져나갈 수 없으니 반드시 BreakPoint를 활용해 빠져나가도록 하자.

 

 

Windows Message Loop 조금 위쪽을 살펴보면 이런 루틴이 존재한다. 여기서 CreateWindowExA는 말 그대로 GUI를 생성해주는 API이다. 그리고 그 바로위 RegisterClassA API를 보면 0x401120을 볼 수 있는데 이 주소가 윈도우 프로시저의 주소이다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함