선 밖에 선 자유인

오브젝트 핸들(HANDLE)을 이용한 커널 오브젝트 조작 함수 본문

IT/System & Network

오브젝트 핸들(HANDLE)을 이용한 커널 오브젝트 조작 함수

Hotman 2011. 8. 10. 00:43
커널 오브젝트(Kernel Object) : Windows 운영체제가 프로세스, 스레드, 파일과 같은 리소스들을 원활히 관리하기 위해 필요한 정보가 저장된 메모리 블록. 오브젝트 핸들(HANDLE)을 이용한 커널 오브젝트 조작 - 프로세스 우선 순위 변경
BOOL SetPriorityClass(
	HANDLE hProcess,		// 우선 순위를 변경할 프로세스의 핸들 전달
	DWORD dwpriorityClass	// 새롭게 적용할 우선순위 정보 전달
);

// if the function fails, the return value is zero.
// if the function fails, the return value is zero.



- 프로세스의 핸들 정보 알아내기
HANDLE GetCurrentProcess( VOID );


- 해당 프로세스의 핸들을 얻어 Priority 값을 다음과 같이 변경 시킨다.
 SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS


- PROCESS_INFORMATION 구조체
 typedef struct _PROCESS_INFORMATION
 {
	HANDLE 	hProcess;			// 프로세스 핸들
	HANDLE 	hThread;			// 스레드 핸들
	DWORD 	dwProcessId;		// 프로세스 ID
	DWORD 	dwThreadId;		// 스레드 ID
 } PROCESS_INFORMATION;
새로운 프로세스 생성시 PROCESS_INFORMATION 구조체의 변수의 주소값을 인자로 전달하면서 PROCESS_ INFORMATION 구조체의 첫 번재 멤버 hProcess는 새로 생성된 프로세스의 핸들 정보로 채워진다. ** 프로세스 핸들은 프로세스의 커널 오브젝트를 가리키기 위한 것이고, 프로세스 ID는 커널 오브젝트가 아니 라 프로세스 자체를 구분짓기 위한 것이다.



- CloseHandle 함수
 BOOL CloseHandle(
        HANDLE hObject
 );
 
If the funciotn succeeds the return value is nonzero.

ex)
#include 
#include 
#include 

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si={0,};
	PROCESS_INFORMATION pi;
	si.cb = sizeof(si);
	
	TCHAR command = _T("calc.exe");
	CreateProcess(
		NULL, command, NULL, NULL, TRUE,
		0, NULL, NULL, &si, &pi
	);
	
	CloseHandle(pi.hProcess);
	
	return 0;
} 

** CloseHandle() 함수는 핸들을 닫는 기능(반환하는 기능)을 하는 역할을 한다.
    커널 오브젝트 소멸이 아님.
Comments