본문 바로가기

이전글

GetProcessImageFileName (psapi)

GetProcessImageFileName 원형을 보면 다음과 같다.

DWORD GetProcessImageFileName(
  HANDLE hProcess,
  LPTSTR lpImageFileName,
  DWORD nSize
);

특정 프로세스의 실행 exe 파일명을 얻어오는 함수이다. 하지만 이 함수를 사용하면 파일명만 얻어오는 것이 아니고 전체 절대 경로를 가지고 온다.

사용자 삽입 이미지


그래서 해당 파일명만 얻어 올수 있도록 문자열을 분리해야할 필요가 있다. 간단한 Sample 코드로 설명을 대신 한다.

   
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procInfo.dwProcessId);

    if(hProc == NULL)

    {

        sprintf_s(pResult, max, "handle=%p PID=%u (exited)", procInfo.hProcess, procInfo.dwProcessId);

        return S_OK;

    }

 

    // attempt to query the filename of the process

    char exeName[MAX_PATH+1] = {0};

    if(GetProcessImageFileName(hProc, exeName, MAX_PATH))

    {

        char *filePart = strrchr(exeName, '\\');

        if(filePart) // strip off the leading device\path information

            slen += sprintf_s(pResult+slen, max-slen, "\"%s\"", filePart+1);

        else

            slen += sprintf_s(pResult+slen, max-slen, "\"%s\"", exeName);

    }

    else

    {

        // couldn't get the filename, so display the handle value instead

        slen += sprintf_s(pResult+slen, max-slen, "handle=%p", procInfo.hProcess);

    }



추가로 3번째 인자로 2번째 인수의 길이를 넘겨주는데 가지고 올 파일명보다 적은 사이즈로 설정되면 파일명을 얻어오는데 실패한다. 그래서 해당 파일명을 저장할 곳을 충분히 크게 설정해 줘야 한다.

참조
http://blogs.msdn.com/joshpoley/archive/2008/01/24/custom-debugger-auto-expansion-tips.aspx