어떤 프로세스들은 이를테면 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;
}
'API' 카테고리의 다른 글
네트워크 사용량 구하는 예제 (0) | 2012.10.25 |
---|---|
정보: 성능 카운터 및 인스턴스 열거 PDH 샘플 코드 (1) | 2012.10.25 |
커스텀 프로그레스바 만들어 보기 (0) | 2012.10.19 |
비정상적인 explorer 다운 상황 후 발생하는 메시지 및 트레이 아이콘 되살리기 (0) | 2012.10.16 |
비주얼 스튜디오 리소스 편집기에서 에디트 박스 높이가 줄어들지 않을 때 팁 (0) | 2012.03.22 |
WaitForSingleObject의 첫 인수가 스레드 핸들인 경우 유의점 (0) | 2012.03.17 |
뮤텍스와 세마포어,,, WAIT_ABANDONED 발생 여부 (0) | 2012.03.06 |