본문 바로가기
정상을향해/OS·Kernel Driver·Rootkit

핸들 (Handle)

by 사이테일 2013. 11. 10.

출처 : http://www.winapi.co.kr

 


핸들(Handle)


프로그래밍에서의 핸들이란,


일종의 토큰으로, 프로그램이 라이브러리 함수 등과 같은 자원을 엑세스 할 수 있게 하는 일종의 포인터이다.


이는 구체적인 어떤 대상에 붙여진 번호이며 문법적으로는 32bit 정수값이다.




도스 프로그래밍에서는 거의 유일하게 파일 핸들만이 사용되었다. 그래서 도스에서의 핸들은 곧 파일 핸들을 의미하는 경우가 많았다.


하지만 윈도우즈에서는 여러가지 종류의 핸들이 사용되고 있다.


만들어진 윈도우에는 '윈도우 핸들(hWnd)'을 붙여 윈도우를 번호로 관리하며,


DC에 대해서도 핸들을 사용하고 논리적 펜, 브러시에도 핸들을 붙여 관리한다.


심지어 메모리를 할당할 때도 할당한 메모리의 번지를 취급하기 보다는 메모리에 번호를 붙인 '메모리 핸들'을 사용한다.




이렇게 핸들을 자주 사용하는 이유는


대상끼리의 구분을 할 때 문자열보다 정수를 사용하는 것이 훨씬 속도가 빠르기 때문이다.





핸들은 일반적으로 다음과 같은 특징을 가지고 있다.


1. 핸들은 정수값이며, 대부분의 경우 32bit 값이다.


 - 핸들을 사용하는 목적은 오로지 구분을 위한 것이므로 핸들끼리 중복되지 않아야 하며, 이런 목적으로는 정수형이 가장 적합하다.



2. 핸들은 운영체제가 발급해주며, 사용자는 쓰기만 하면 된다.


 - 예를 들어 윈도우를 만들거나 파일을 열면 운영체제는 만들어진 윈도우나 열려진 파일에 핸들을 붙여준다.


   사용자는 이 핸들을 잘 보관해 두었다가 해당 윈도우나 파일을 다시 참조할 때 핸들을 사용하면 된다.


   즉, 사용자가 직접 핸들을 만들 경우는 존재하지 않는다.



3. 같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다.


 - 만약 중복된 값을 가지게 된다면 핸들은 구분을 위해 사용될 수 없게 될 것이다.


   하지만 다른 종류의 핸들끼리는 중복된 값을 가질 수도 있다.



4. 핸들은 정수형이므로 값을 가지겠지만, 그 실제값이 무엇인지는 몰라도 상관없다.


 - 핸들은 크고 작음의 성질을 가지는 숫자가 아니라 단순한 표식일 뿐이다.


   핸들형 변수를 만들어 핸들을 대입받아 쓰고 난 후에는 버리면 된다.


   윈도우즈에서는 핸들은 예외없이 접두어 'h'로 시작되며, 핸들값을 저장하기 위해 별도의 데이터형을 정의해 두고 있다.


   HWND, HPEN, HBRUSH, HDC 등이 핸들을 담기 위한 데이터형이며, 모두 unsigned 정수형이다.