개인적으로 툴 하나 만들면서~ 이것저것 찾아보다가~ 그냥 정리차원에서 한번 올려봅니다.
1. GetModuleFileNameEx - [ PSAPI ]
DWORD WINAPI GetModuleFileNameEx(
__in HANDLE hProcess,
__in HMODULE hModule,
__out LPTSTR LpFilename,
__in DWORD nSize
);
__in HANDLE hProcess,
__in HMODULE hModule,
__out LPTSTR LpFilename,
__in DWORD nSize
);
- Windows2000 / WinNT 4.0 이상에서 사용가능.
- 프로세스뿐만 아니라 로딩된 모듈의 경로까지 지원하는 범용 함수.
- 프로세스 PEB 의 PEB_LDR_DATA 의 리스트를 돌면서 LDR_DATA_TABLE_ENTRY 에 저장된 이름을 가져옴.
( 내부적으로 NtQueryInformationProcess 사용 : ProcessInformationClass = 0 [ProcessBasicInformation] )
2. GetProcessImageFileName - [ PSAPI ]
DWORD WINAPI GetProcessImageFileName(
__in HANDLE hProcess,
__out LPTSTR LpImageFileName,
__in DWORD nSize
);
__in HANDLE hProcess,
__out LPTSTR LpImageFileName,
__in DWORD nSize
);
- WindowsXP 이상에서 사용가능.
- NtQueryInformationProcess 를 사용 : ProcessInformationClass = 27 [ProcessImageFileName]
3. QueryFullProcessImageName - [ KERNEL32 ]
BOOL WINAPI QueryFullProcessImageName(
__in HANDLE hProcess,
__in DWORD dwFlags,
__out LPTSTR LpExeName,
__in_out PDWORD LpdwSize
);
__in HANDLE hProcess,
__in DWORD dwFlags,
__out LPTSTR LpExeName,
__in_out PDWORD LpdwSize
);
- Windows Vista 이상에서 사용가능
- NtQueryInformationProcess 를 사용.
=> dwFlags 가 0 이면, ProcessInformationClass = 43 [Unknown]
dwFlags 가 1 이면, ProcessInformationClass = 27 [ProcessImageFileName]
다음은 각 함수를 사용한 예제코드 입니다~ : )
1 #include <windows.h>
2 #include <psapi.h>
3 #include <tchar.h>
4 #include <stdio.h>
5
6 #pragma comment(lib, "PSAPI.LIB")
7
8 int _tmain(void)
9 {
10 DWORD dwLen = 0;
11 TCHAR szImagePath[MAX_PATH] = { 0, };
12
13 // 1. GetModuleFileNameEx (PSAPI)
14 ZeroMemory(szImagePath, sizeof(szImagePath));
15 GetModuleFileNameEx(GetCurrentProcess(), NULL,
16 szImagePath, (sizeof(szImagePath)/sizeof(TCHAR)));
17 _tprintf("# GetModuleFileNameEx\n\r - %s\n\n\r", szImagePath);
18
19 // 2. GetProcessImageFileName (PSAPI)
20 ZeroMemory(szImagePath, sizeof(szImagePath));
21 GetProcessImageFileName(GetCurrentProcess(),
22 szImagePath, (sizeof(szImagePath)/sizeof(TCHAR)));
23 _tprintf("# GetProcessImageFileName\n\r - %s\n\n\r", szImagePath);
24
25 // 3-1. QueryFullProcessImageName [Flags - 0] (KERNEL32)
26 ZeroMemory(szImagePath, sizeof(szImagePath));
27 dwLen = sizeof(szImagePath)/sizeof(TCHAR);
28 QueryFullProcessImageName(GetCurrentProcess(), 0, szImagePath, &dwLen);
29 _tprintf("# QueryFullProcessImageName [Flags - 0]\n\r - %s\n\n\r", szImagePath);
30
31 // 3-2. QueryFullProcessImageName [Flags - 1] (KERNEL32)
32 ZeroMemory(szImagePath, sizeof(szImagePath));
33 dwLen = sizeof(szImagePath)/sizeof(TCHAR);
34 QueryFullProcessImageName(GetCurrentProcess(), 1, szImagePath, &dwLen);
35 _tprintf("# QueryFullProcessImageName [Flags - 1]\n\r - %s\n\n\r", szImagePath);
36
37 return 0;
38 }
그리고 예제코드 실행결과~ : )
각각의 장단점이 있으니~ 경우에 따라서 필요한 함수를 사용하면 될듯합니다.
개인적으로는 QueryFullProcessImageName 함수가 제일 괜찮았습니다만...
비스타 이상에서만 사용가능한게 흠이네요~ ^^;;
'Programming' 카테고리의 다른 글
| [LIB] Hooking 라이브러리 - Detour 3.0 (0) | 2011/11/25 |
|---|---|
| [C/C++] 프로세스의 파일 전체 경로 구하기~ (2) | 2010/04/18 |
| Visual Studio 2010 출시... (4) | 2010/04/13 |
| [C/C++] RichEdit 컨트롤과 IMF_AUTOFONT 옵션 (0) | 2010/03/19 |
| [C/C++] 인라인 어셈블리 "FS:[0]" 관련 팁~! (4) | 2008/11/03 |
| [C/C++] 투명창 만들기~ ( SetLayeredWindowAttributes 사용 ) (3) | 2008/08/01 |
C/C++,
GetModuleFileNameEx,
GetProcessImageFileName,
Programming,
QueryFullProcessImageName,
Win32 API,
프로그래밍,
프로세스,
프로세스 전체경로

