HANDLE ๊ตฌ์กฐ์ฒด์™€ Kernel Object๋ฅผ ์ด์šฉํ•œ ์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŒ…์— ์ด์–ด ์ด์ œ ๋ณธ๊ฒฉ์ ์ธ ์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.



HANDLE ๊ตฌ์กฐ์ฒด 

HANDLE ๊ตฌ์กฐ์ฒด๋Š” ์ „ ํฌ์ŠคํŠธ์—์„œ ์ ํ˜€์žˆ์—ˆ๋‹ค์‹œํ”ผ Kernel object๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋งŒ์•ฝ, ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ฝ๊ฑฐ๋‚˜, ์“ฐ๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐ๋Š” ๋ฐ˜๋“œ์‹œ HANDLE ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ๊ฐœ์ฒด๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ณ  ์‹ถ์€์ง€๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


#include <windows.h>
int _tmain(int argc, TCHAR* argv[])
{
	HANDLE hFile = CreateFile();
}

์˜ˆ๋ฅผ ๋“ค์–ด ํŒŒ์ผ์„ ๊ฑด๋“œ๋ฆฌ๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ, CreateFile API๋ฅผ ์ด์šฉํ•ด์„œ ๊ธฐ์กด์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ฝ๋˜์ง€, ์•„๋‹ˆ๋ฉด ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ WriteFile API๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


#include <windows.h>
int _tmain(int argc, TCHAR* argv[])
{
	PROCESS_INFORMATION pi;
}


ํ”„๋กœ์„ธ์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ํŒŒ์ผ์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•˜๊ฒŒ HANDLE ๊ตฌ์กฐ์ฒด ํ•˜๋‚˜๋งŒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ์•„๋ž˜์—๋Š” ์“ฐ๋ ˆ๋“œ๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— PROCESS_INFORMATION ๊ตฌ์กฐ์ฒด๊ฐ€ HANDLE ๊ตฌ์กฐ์ฒด๋ฅผ ์—ฌ๋Ÿฟ์ด ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค HANDLE ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;
    HANDLE hThread;
    DWORD dwProcessId;
    DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;


PROCESS_INFORMATION ๊ตฌ์กฐ์ฒด์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. PID๋Š” String ํ˜•ํƒœ, ๊ฐ€์žฅ ์œ„์— ์กด์žฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค์ž…๋‹ˆ๋‹ค.




๋ณธ๊ฒฉ์ ์ธ ์ฝ”๋”ฉ 

์ž ์ด์ œ HANDLE ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์จ์•ผํ•˜๋Š”์ง€ ์•Œ์•˜์œผ๋‹ˆ ์ด์ œ ๊ตฌ์ฒด์ ์ธ ์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ€๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์ €๋Š” ์ด๋ ‡๊ฒŒ ์ฝ”๋”ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 


1. ๋จผ์ € ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ฉ๋‹ˆ๋‹ค.


2. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


3. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” File์„ ์ƒ์„ฑํ•˜๊ณ , ์ฝ์–ด์„œ ์–ด๋–ค ๋ฌธ์žฅ์„ ํ…์ŠคํŠธ ๋ฌธ์„œ๋กœ ์ž‘์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.


๋Œ€์ถฉ ์ด๋Ÿฐ์‹์œผ๋กœ ์ฝ”๋”ฉํ•  ๊ฒƒ์ธ๋ฐ, ์™œ ์ด๋ ‡๊ฒŒ ๊ณ„ํš์„ ํ–ˆ๋ƒ๋ฉด, ๋จผ์ € ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฑด๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด HANDLE๋กœ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜๋Š”์ง€๋ฅผ ์ดํ•ดํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์œ„ํ•ด ์šด์˜์ฒด์ œ ์ค‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๋จผ์ € ์ˆ™์ง€ํ•˜๊ณ  ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


ํŒŒ์ผ์˜ ์ƒ์„ฑ์€ fopen๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•˜์ง€๋งŒ ์ด๋Š” ํ‘œ์ค€ ํ•จ์ˆ˜์ด๊ณ , Windows API์—์„œ ์‚ฌ์šฉํ•˜๋Š” CreateFile์€ ํ•ธ๋“ค์ด ๋‹ซํ˜“์„ ๋•Œ๋ฅผ ํฌํ•จํ•˜์—ฌ ํŒŒ์ผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.


๋จผ์ € ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฝ”๋”ฉํ•ด๋ด…์‹œ๋‹ค.


#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	// Windows์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ผ ์ƒ์„ฑ API
	HANDLE hFile = CreateFile(_T("neonkid.txt"), GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
	DWORD result;
	TCHAR str[30];
	LARGE_INTEGER curPtr;

	_tprintf(_T("ํŒŒ์ผ ์ƒ์„ฑ/์ฝ๊ธฐ ์™„๋ฃŒ! \n\n"));

	WriteFile(hFile, _T("Created by. neonkid"), sizeof(TCHAR) * 21, &result, NULL);
	_tprintf(_T("ํŒŒ์ผ ๊ธฐ๋ก ์„ฑ๊ณต! \n\n"));

	curPtr.QuadPart = 0;
	SetFilePointerEx(hFile, curPtr, NULL, FILE_BEGIN);

	ReadFile(hFile, str, sizeof(TCHAR) * 20, &result, NULL);
	_tprintf(_T("ํŒŒ์ผ ๋‚ด์šฉ: %s\n\n"), str);

	_tprintf(_T("์•„๋ฌด ํ‚ค๋‚˜ ๋ˆ„๋ฅด๋ฉด HANDLE์ด ๋‹ซํž™๋‹ˆ๋‹ค. \n"));
	_gettch();

	// HANDLE์„ ๋‹ค ์‚ฌ์šฉํ•˜๊ณ  ๋‚œ ๋’ค์—๋Š” ๋ฐ˜๋“œ์‹œ ์†Œ๋ฉธ,,
	CloseHandle(hFile);

	return 0;
}


์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์ฝ”๋”ฉํ•˜๋Š” ์ด์œ ๋Š” ์ฐจํ›„์— ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฆ„์„ ๋„ฃ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ง์ ‘ ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ํ•˜๋Š” PID๋ฅผ ๊ณ ์ •ํ•˜์—ฌ ๋ถ€์—ฌํ•  ์ˆ˜๋Š” ์—†์œผ๋ฏ€๋กœ Visual Studio ๋“ฑ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์‚ฌ์šฉํ•œ ์ด๋ฆ„์œผ๋กœ ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


ํŒŒ์ผ์„ ๋‹ค๋ฃฐ ๋–„๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์†์„ฑ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฃผ์–ด์ง„ ํŒŒ์ผ์„ ์˜ค์ง ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ด๋ƒ, ์“ฐ๊ธฐ๋„ ํฌํ•จํ•  ๊ฒƒ์ด๋ƒ๋ฅผ ์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. CreateFile API์—์„œ GENERIC_READ๋Š” ์ฝ๊ธฐ ์†์„ฑ ๋ถ€์—ฌ, GENERIC_WRITE๋Š” ์“ฐ๊ธฐ ์†์„ฑ์„ ๋ถ€์—ฌํ•ด์ค๋‹ˆ๋‹ค.


OPEN_ALWAYS๋Š” ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ๊ทธ ํŒŒ์ผ์„ ์—ด๊ณ , ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋ผ๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์ž์œ ์ž…๋‹ˆ๋‹ค.

FILE_FLAG_DELETE_ON_CLOSE๋Š” ํ•ด๋‹น ํ•ธ๋“ค์ด ๋‹ซํžˆ๊ฑฐ๋‚˜ ์†Œ๋ฉธ๋  ๊ฒฝ์šฐ, ํŒŒ์ผ๋„ ๊ฐ™์ด ์†Œ๋ฉธํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰์œผ๋กœ CloseHandle์„ ๋„ฃ์–ด์คฌ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋” ์ด์ƒ ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผ์„ ํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์•ฝ์†์ž…๋‹ˆ๋‹ค. ์ด ์ปค๋งจ๋“œ ์ดํ›„์—๋Š” ๋” ์ด์ƒ ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŒŒ์ผ์„ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. 


#include <tchar,h>
#include <windows.h>

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0, };
	PROCESS_INFORMATION pi;		// TargetProcess.exe HANDLE
	si.cb = sizeof(si);
	BOOL state;

	// Move directory path
	SetCurrentDirectory(_T("D:\\Users\\ubase\\Documents\\Visual Studio 2015\\Projects\\CreateFileProcessSample\\Debug\\"));

	TCHAR command[] = _T("CreateFileProcessSample.exe");	// Run Process Command,,

	state = CreateProcess(NULL, command, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

	if (state != 0)
	{
		_fputts(_T("Create Success !! \n"), stdout);
		return 0;
	}

	else
	{
		_fputts(_T("Create Failed....."), stdout);
		return -1;
	}

	return 0;
}

๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„ํ˜ธ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค์ด์ฃ .


ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ •๋ณด ์ค‘ ๊ฐ€์žฅ ํ•„์ˆ˜๋กœ ์žˆ์–ด์•ผํ•  ๊ฒƒ์€ ๋ฐ”๋กœ STARTUPINFO์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์‹œ์ž‘ ์ •๋ณด์ธ๋ฐ์š”. ์‹œ์ž‘ ์ •๋ณด๋ผ๊ณ  ํ•˜๋ฉด, ์œˆ๋„์šฐ์—์„œ ํ”„๋กœ์„ธ์Šค ์ฐฝ์˜ ํฌ๊ธฐ, ํ˜น์€ ์œ„์น˜ ๋“ฑ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๊ฒƒ ์™ธ์—๋„ ์ค‘์š”ํ•œ ๊ฒƒ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.


๊ทธ ๋‹ค์Œ์— ์ƒ์„ฑํ•  ๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋กœ์„ธ์Šค ํ•ธ๋“ค์ž…๋‹ˆ๋‹ค. PROCESS_INFORMATION ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•ด ์ƒ์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 


์ œ๊ฐ€ ๋ณ„๋„๋กœ SetCurrentDirectory๋ผ๋Š” API๋ฅผ ์ฃผ์—ˆ๋Š”๋ฐ ์ด ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค๋„ ์•„๋งˆ Visual Studio๋ฅผ ์ด์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡๋‹ค๋ณด๋ฉด ์‹คํ–‰ ํŒŒ์ผ์ด ๋‘ ํ”„๋กœ์ ํŠธ๋กœ ๊ฐˆ๋ฆฌ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•ด ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. (๋ฒˆ๊ฑฐ๋กญ๋‹ค๋ฉด ์•„์˜ˆ command ๋ณ€์ˆ˜์— ๋ชฝ๋•… ๊ฒฝ๋กœ๊นŒ์ง€ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•๋„ ใ…Žใ…Ž)




์‹คํ–‰์„ ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ์ด ์„ฑ๊ณต๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์–ด์ง‘๋‹ˆ๋‹ค.


์•„ ๊ทธ๋ฆฌ๊ณ , ์ œ๊ฐ€ ์ผ๋ถ€๋Ÿฌ HANDLE ๋‹ซํž˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ getch() ํ•จ์ˆ˜๋ฅผ ์ค€ ๊ฒƒ์€ ์ œ๊ฐ€ CreateFile API ์˜ต์…˜์— FILE_FLAG_DELETE_ON_CLOSE์„ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ๋งŒ์•ฝ ํŒŒ์ผ์ด ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์‹œ๋ ค๋ฉด, ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† ์‹คํ–‰๋œ ์ƒํƒœ์—์„œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€๋ณด์‹œ๊ฒŒ ๋˜๋ฉด ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋”๋ถˆ์–ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋ฉด ๋‹น์—ฐํžˆ ํ•ธ๋“ค์ด ์†Œ๋ฉธ๋˜๋ฏ€๋กœ ์ƒ์„ฑ๋œ txt ํŒŒ์ผ์€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค ^^;


ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์—๋Š” ํ•ด๋‹น ํŒŒ์ผ์—๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ˜น์‹œ ๋ณธ์ธ์ด ์ง์ ‘ ํ•ด๋‹น ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์˜ต์…˜์„ ๋ฐ”๊พธ์–ด์„œ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•ด๋ณด๊ณ  ์‹คํ–‰ํ•ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.




๋งˆ์น˜๋ฉฐ...

์ œ๊ฐ€ ๋ธ”๋กœ๊ทธ์—์„œ ์ž‘์„ฑํ•œ ์—ฌ๋Ÿฌ ํฌ์ŠคํŠธ ์ค‘ ๊ฐ€์žฅ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ํฌ์ŠคํŠธ ์ค‘์— ํ•˜๋‚˜์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ œ๊ฐ€ ๋‹ค์‹œ ์ด ๊ธ€์„ ์ฒœ์ฒœํžˆ ์ฝ์–ด๋ด์•ผ๊ฒ ์ง€๋งŒ ์•„๋งˆ ์ดˆ๋ณด์ž๋ถ„๋“ค์ด ์ดํ•ดํ•˜๊ธฐ๋Š” ๊ต‰์žฅํžˆ ์–ด๋ ค์šด ๋‚ด์šฉ์ด ์•„๋‹๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


์•„ ๋งˆ์น˜๋ฉด์„œ.. ํ•œ ๊ฐ€์ง€ ์ œ๊ฐ€ ๋งˆ์ € ๋ชปํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


๋ฌด์—‡์ด๋ƒ๋ฉด ์•„๊นŒ CreateFile API์—์„œ HANDLE์ด ์†Œ๋ฉธ๋จ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ž๊ฐ’์ด ์กด์žฌํ–ˆ์—ˆ๋Š”๋ฐ์š”. ์œˆ๋„์šฐ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๋Š” UC๋ผ๋Š” ๊ฒƒ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด UC๋Š” ๋ฌด์—‡์ด๋ƒ๋ฉด ํ•ด๋‹น ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ํ˜น์€ ํ•ธ๋“ค์˜ ๊ฐฏ์ˆ˜์ž…๋‹ˆ๋‹ค.


์˜ˆ๋ฅผ ๋“ค์–ด์„œ, neonkid.txt ํŒŒ์ผ์— ๋Œ€ํ•œ ํ•ธ๋“ค์„ ํ˜„์žฌ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์œ„์—์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์ฃ . ๋ฐ˜๋Œ€๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ํ•ธ๋“ค์€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— UC๊ฐ€ ๊ฐ๊ฐ 1์ž…๋‹ˆ๋‹ค. 


CloseHandle API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค์ฒ˜๋Ÿผ neonkid.txt ํŒŒ์ผ์— ๋Œ€ํ•œ ํ•ธ๋“ค ํ…Œ์ด๋ธ” ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•˜๊ฒŒ ๋˜๋ฉด ๋” ์ด์ƒ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” neonkid.txt ํŒŒ์ผ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด ์ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” neonkid.txt ํŒŒ์ผ์— ๋Œ€ํ•œ ํ•ธ๋“ค ์ •๋ณด๊ฐ€ ์•„์˜ˆ ์†Œ๋ฉธ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


์ด๊ฒƒ์ด ์†Œ๋ฉธ๋จ๊ณผ ๋™์‹œ์— UC๋Š” 0์ด ๋˜๊ณ  UC๊ฐ€ 0์ด ๋˜๋ฉด FILE_FLAG_DELETE_ON_CLOSE์— ์˜ํ•ด neonkid.txt ํŒŒ์ผ ๋˜ํ•œ ์ปดํ“จํ„ฐ์—์„œ ์˜์›ํžˆ ํœด์ง€ ์กฐ๊ฐ์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‚ด์šฉ์€ ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ๋‚ด์šฉ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํ”„๋กœ์„ธ์Šค์™€ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ์ถฉ๋ถ„ํžˆ ์ตํžˆ์‹  ํ›„ ๋ณด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments