API

프로세스 경로 구할 때 OpenProcess flag 팁

디버그정 2012. 10. 19. 16:13

어떤 프로세스들은 이를테면 svchost.exe 같은 시스템 프로세스들은

OpenProcess에서 PROCESS_ALL_ACCESS를 옵션으로 주면 프로세스 풀패스를 제대로 구하지 못한다.

다음과 같이 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ 플래그를 줘야 제대로 구해졌다.

여기서 PROCESS_VM_READ를 빠트려도 안구해진다.

PROCESS_VM_READ는 프로세스 접근해서 메모리를 읽고자 할 때 주는 플래그인데, 뭔가 좀 이상하긴 하지만,,,;;;

 

아래는 예제이다.

 

 

#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

#include <psapi.h>
#pragma comment(lib, "psapi.lib")

#include <tlhelp32.h>

#include "shlobj.h"

DWORD _stdcall FindProcessAndGetPath(LPCTSTR lpszProcessName, LPTSTR lpszProcessPath)
{
 HANDLE hSnapProcess;
 HANDLE hProc;
 BOOL bSuc = FALSE;

#if defined(_UNICODE) || defined(UNICODE)
 PROCESSENTRY32W ppe = {0};
#else
 PROCESSENTRY32 ppe = {0};
#endif

 ppe.dwSize = sizeof(ppe);
 hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
 Process32First(hSnapProcess, &ppe);

 do{
  if (0 == lstrcmpi(lpszProcessName, ppe.szExeFile)) {

   // 아래 플래그 옵션 주의. 참고로 PROCESS_VM_READ이 없으면 제대로 정보를 구하지 못한다.
   if (hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ppe.th32ProcessID)) {
    GetModuleFileNameEx(hProc, NULL, lpszProcessPath, 1023);
    CloseHandle(hProc);
    bSuc = TRUE;
   }
   break;
  }
 } while(Process32Next(hSnapProcess, &ppe));    // 다음 프로세스 검사한다.
 CloseHandle(hSnapProcess);

 if (bSuc) return ppe.th32ProcessID;
 return 0;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
 char szPath[512] = {0};
 FindProcessAndGetPath("svchost.exe", szPath);
 MessageBox(0,szPath,"Process Path",0);
 return 0;

}