2019. 10. 17. 14:57ㆍIT-개발/winapi 및 MFC
(펌 : https://iam-hs.com/161 )
예제 내용이 너무 좋아서 그냥 복사해놓아요~
개인적으로 툴 하나 만들면서~ 이것저것 찾아보다가~ 그냥 정리차원에서 한번 올려봅니다.
1. GetModuleFileNameEx - [ PSAPI ]
DWORD WINAPI GetModuleFileNameEx(
__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
);
- WindowsXP 이상에서 사용가능.
- NtQueryInformationProcess 를 사용 : ProcessInformationClass = 27 [ProcessImageFileName]
3. QueryFullProcessImageName - [ KERNEL32 ]
BOOL WINAPI QueryFullProcessImageName(
__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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <windows.h> #include <psapi.h> #include <tchar.h> #include <stdio.h>
#pragma comment(lib, "PSAPI.LIB")
int _tmain(void) { DWORD dwLen = 0; TCHAR szImagePath[MAX_PATH] = { 0, };
// 1. GetModuleFileNameEx (PSAPI) ZeroMemory(szImagePath, sizeof(szImagePath)); GetModuleFileNameEx(GetCurrentProcess(), NULL, szImagePath, (sizeof(szImagePath)/sizeof(TCHAR))); _tprintf("# GetModuleFileNameEx\n\r - %s\n\n\r", szImagePath);
// 2. GetProcessImageFileName (PSAPI) ZeroMemory(szImagePath, sizeof(szImagePath)); GetProcessImageFileName(GetCurrentProcess(), szImagePath, (sizeof(szImagePath)/sizeof(TCHAR))); _tprintf("# GetProcessImageFileName\n\r - %s\n\n\r", szImagePath);
// 3-1. QueryFullProcessImageName [Flags - 0] (KERNEL32) ZeroMemory(szImagePath, sizeof(szImagePath)); dwLen = sizeof(szImagePath)/sizeof(TCHAR); QueryFullProcessImageName(GetCurrentProcess(), 0, szImagePath, &dwLen); _tprintf("# QueryFullProcessImageName [Flags - 0]\n\r - %s\n\n\r", szImagePath);
// 3-2. QueryFullProcessImageName [Flags - 1] (KERNEL32) ZeroMemory(szImagePath, sizeof(szImagePath)); dwLen = sizeof(szImagePath)/sizeof(TCHAR); QueryFullProcessImageName(GetCurrentProcess(), 1, szImagePath, &dwLen); _tprintf("# QueryFullProcessImageName [Flags - 1]\n\r - %s\n\n\r", szImagePath);
return 0; } |
그리고 예제코드 실행결과~ : )
< 그림.01 > 예제코드 실행결과
각각의 장단점이 있으니~ 경우에 따라서 필요한 함수를 사용하면 될듯합니다.
개인적으로는 QueryFullProcessImageName 함수가 제일 괜찮았습니다만...
비스타 이상에서만 사용가능한게 흠이네요~ ^^;;
출처: https://iam-hs.com/161 [XeroNic(HS) BLOG]
'IT-개발 > winapi 및 MFC' 카테고리의 다른 글
[windows] SDDL / DACL (0) | 2019.10.18 |
---|---|
System Call Table (0) | 2019.10.17 |
[pipe] CreateProcess와 CreatePipe를 이용한 콘솔프로그램 입출력 제어 (펌) (0) | 2019.10.08 |
CEdit - 한글기본으로 입력되게 처리 (0) | 2018.11.30 |
process 실행 및 종료까지 대기 sample (0) | 2018.10.29 |