Windows API 와의 만남

오늘은 카테고리를 추가하여, Windows API에 대한 포스팅을 하고자합니다.


여태까지 저는 Linux와 친숙해오면서, Windows를 잘 사용하지 않고 있는 편입니다. 하지만, 학교 과제나 일반적인 업무 등을 보다보면, Windows는 피할 수 없는 존재이기 때문에 자주 사용합니다. 그렇다보니 Windows Kernel 쪽에도 관심을 갖게 되었습니다.


Windows API는 제가 C 언어를 배웠을 때만해도 아직 한창 몰랐던 시스템이였습니다. 이 Windows API를 알게 된 것은 GDB를 사용하던 Linux의 디버거가 Windows에서는 OllyDbg나 Immunity Debugger를 사용하면서부터 Unix나 Linux와 달리 Windows 에는 특별한 API 모듈이 있다는 것을 알았습니다. 


사실 Linux는 커널 소스가 공개되어 있어, 굳이 언어적으로 건들이지 않아도 사용자가 자유롭게 건드릴 수 있습니다. 하지만 Windows는 그렇지 못하기 때문에 어떻게 어떤 방법으로 Kernel에 접근해야할지 몰라 고민하다 Windows API라는 것을 알게 된 것도 한 계기였습니다.



API....?

API라는 용어를 처음 들으신 분들이 계실 것입니다. API는 Application Programming Interface의 약자로, 라이브러리와 비슷하하게 사용되지만, 개념은 전혀 다릅니다. 집합으로 보자면, API ⊂ Library 이렇게 됩니다. API는 라이브러리를 이용해서 어떤 규칙을 만들고, 그것을 개발자에게 제공합니다. OS와 사용자 사이에 의사소통을 위해 Shell이 존재한다면, 운영체제와 응용 프로그램 사이 통신에는 API가 존재하는 것이지요.



Windows API

Windows API는 Microsoft의 Windows에서 제공하는 시스템 라이브러리입니다. Windows 응용 프로그램 개발할 때, 사용할 수 있도록 Windows 운영체제에서 제공하는 라이브러리 생각하면 쉽습니다. API는 위에서 말했다시피 라이브러리와 그 개념이 다릅니다. API는 라이브러리를 사용하기 위한 한 수단으로, 라이브러리를 사용을 위해 정해놓은 규칙이라고 할 수 있습니다. 배우다보면 알겠지만, Windows API를 사용하여 Keyboard, Mouse 등 입력 장치 제어 뿐만 아니라, OS 내에 커널 부분, 프로세스 부분 등의 시스템 제어를 담당하는 부분의 API도 만날 수 있을 것입니다. 


Windows API는 Windows Kernel에서 핵심 모듈이라 할 수 있습니다. 흔히 운영체제의 커널은 크게 두 가지로 나뉩니다. Micro-Kernel과 Monolithic kernel로 나뉘는데, Windows가 사용하는 커널은 Micro-Kernel에 가깝고, UNIX에서 사용하는 커널은 Monolitic-Kernel에 가깝습니다. 그에 반한, Linux는 Micro-Kernel과 Monolithic kernel의 중간 위치에 있습니다. Micro-kernel과 Monolithic kernel에 대해서 알아보도록 하겠습니다.




위에 보이는 구조가 바로, 모놀리틱 커널의 구조입니다.. 운영체제에는 사용자 모드와 커널 모드의 두 가지 모드로 나뉘는데, 모놀리틱 커널에서는 사용자가 오직 프로그램으로만 커널에 접근하는 방식으로. 커널이 하드웨어와 파일 시스템, 프로세스, 드라이버, System Call 까지 모두 관장하는 구조가 바로 모놀리틱 커널입니다. 대표적인 운영체제로 UNIX 운영체제가 이런 커널 구조를 지니고 있습니다. 따라서 운영체제 기능 업데이트를 위해서 Kernel 전부를 교체해야합니다.




위에 있는 사진은 마이크로 커널의 구조이자 Windows NT(New Technology, 2000) 커널의 구조입니다. 모놀리틱 커널과 마찬가지로, 사용자 모드와 커널 모드가 존재하지만, 사용자 모드에서 하드웨어 드라이버 관리 등을 직접 사용자 모드에서도 할 수 있습니다. 파일 시스템 등도 사용자 모드에서 갖춰져 있어 프로그램 설치 하나만으로, 여러 파일 시스템을 읽을 수도 있습니다. 마이크로 커널에서는 IPC 등 중요한 부분을 제외한 나머지를 전부 커널에서 떼어낸 것을 마이크로 커널 구조라 합니다. 


이런 커널 구조를 보통 모듈식 커널의 구조라고도 얘기합니다. Windows는 UNIX와 다르게, 기능 업데이트 등도 모듈처럼 프로그램의 설치/삭제 만으로 자유롭게 분해/조립이 가능한 구조입니다. 대표적인 것으로 Windows 보안 업데이트가 있습니다. 


Windows 운영체제를 구성하는 모듈에서 가장 핵심적인 모듈은 User, GDI, Kernel 입니다. 위 사진에서 보는 것처럼 Executive 내부에는 GDI 모듈과 Window Manager (User) 모듈이 있고, 나머지는 Kernel 모듈입니다. 사실 사진은 Windows 2000 모습이라, 어떻게 보면 지금은 많이 달라졌을 수 있습니다. 최근 나온 Windows 10 Kernel에는 Subsystem에 기존에 있는 OS/2와 함께 Ubuntu Linux를 추가하기도 했습니다.



프로그래밍 언어

Windows API를 사용할 수 있는 언어에는 Visual C / C++, Visual C#, Visual Basic.NET이 있습니다. 아직까지 저는 Visual C++만을 가지고, API에 접근하고 있지만, 더 많은 API를 사용하려면 C#이나 VB.NET을 추천한다고 합니다. VB.NET언어는 기존 VB 6.0에서 .NET Framework가 개발된 2003~2004년 경에 VB.NET이라는 이름으로 바뀐 언어입니다. 


#include <Windows.h>
INT APIENTRY WinMain(HINSTANCE hins, HINSTANCE hPrev, LPSTR cmd, INT nShow)
{
	MessageBoxA(NULL, "Hello WinAPI ~!", "Hello !", MB_DEFBUTTON1);
	return 0;
}



위 코드와 화면은 Windows API를 Visual C++ 언어를 사용하여 작성한 프로그램입니다. C언어에서 처음에 printf를 써서 Hello World를 쓴다는 느낌으로 작성하였습니다.


C언어나 C++ 언어로, Windows API할 때, 프로그래밍 언어에서 제공되는 형식과 동일하게 사용할 수 있습니다. 똑같이 함수를 사용하고, 인자를 사용하며 매크로를 사용하여 정의하는 것도 동일합니다.


기본적인 Windows API를 이용할 때는 아래의 파일을 포함해야 합니다.


#include <Windows.h>


Windows.h 파일에 있는 대부분의 형식에는 표준 C나 C++ 언어에 없는 많은 자료형식들이 있습니다. 앞으로 차차 제가 이 블로그를 통해서 포스팅할 것이지만, 맛보기를 위해서 궁금하신 분들이 있으시다면, minwindef.h 헤더 파일을 살펴보시면 됩니다. (Visual Studio 2015 Update 2 기준)


여기까지, Windows API에 대한 전반적인 부분을 살펴봤습니다. 저처럼 Linux를 사용하신 분들이라면, Windows API 프로그래밍이 어찌보면, 시스템 프로그래밍 같아 보일 수도 있습니다. 물론 그 부분도 포함은 되지만,. Windows는 그보다 더 많은 것을 프로그래밍을 통해 더 접근할 수 있습니다.

comments powered by Disqus

Tistory Comments 0