[C/C++] 프로세스의 파일 전체 경로 구하기~ (펌)

2019. 10. 17. 14:57IT-개발/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]