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 ํ์ผ ๋ํ ์ปดํจํฐ์์ ์์ํ ํด์ง ์กฐ๊ฐ์ด ๋๋ ๊ฒ์ ๋๋ค.
๋ด์ฉ์ ์ด๋ ต์ง ์์ง๋ง ์ดํดํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ด ๋ด์ฉ์ด๋ฏ๋ก ๋ฐ๋์ ํ๋ก์ธ์ค์ ํ์ผ์ ๋ํ ๊ณต๋ถ๋ฅผ ์ถฉ๋ถํ ์ตํ์ ํ ๋ณด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
'Programming > WinAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Windows API๋ก ์์ํด๋ณด๋ ์์ผ ํ๋ก๊ทธ๋๋ฐ (0) | 2017.04.10 |
---|---|
HANDLE ๊ตฌ์กฐ์ฒด์ Kernel Object (0) | 2016.08.29 |
SBCS, MBCS์ WBCS / ์ ๋์ฝ๋ ํ๋ก๊ทธ๋๋ฐ์ด ์ค์ํ ์ด์ (3) | 2016.07.19 |
Win32 API์ ์๋ฃํ (0) | 2016.06.14 |
Windows API ์์ ๋ง๋จ (0) | 2016.06.12 |