VISTA&WIN7 잘못된 프로세스 경로일때
한 2일 정도 삽질한 경우를 설명 하겠다.
상황 : 네트워크로 패킷을 보내는 프로세스의 정보를 구한다. ProcessName , ProcessId 를 얻어서 ProcessPath 를 구하려고 했다.
그러나 , 프로세스 경로가 c:\windows\system32\svchost.exe 로 나오는 것이다.
그런데 여기서 나를 햇갈리게 하는 경우가 있었으니...그것은 바로
네트워크 소켓 연결을 하지 않은 상태에서는 정상적인 경로를 구할 수 있었다.
이런경우가 다있나...? 구글링을 아무리 해도 이런 경우가 없었다.
나를 더 황당하게 했던 것은 우리가 일반적으로 쓰고 있는 ProcessMonitor 와 TcpView 에서도 동일하게 이런 경우가 발생 했다.
나를 합리화 하기 시작했다. 아 .. sysinternals 프로그램도 이렇게 되니까...내가 잘못 한 것은 아닐꺼구...버그 인가???
이렇게 합리화를 하던 찰나에 혹시나 하는 마음에 Process Explorer 실행하고 해봤더니....둘다 정상이었다. 통신 일때나 아닐때나...
이때부터 나의 구글링은 다시 시작 되었다.
그러나... 이런 경우는 없었다. MSDN 을 자세히 살펴보니 VISTA 이상에서는 GetModuleFileNameEx 보다는 QueryFullProcessImageName 를 권장한다고 한다.
http://msdn.microsoft.com/en-us/library/ms684919(v=vs.85).aspx
그래서 저 함수를 쓰려고 했더니...저런 함수가 없다고 나온다. sdk 를 깔아야 하나... 어쨋든 저 함수가 KERNEL.DLL 에서 익스포트 하고 있으니 재정의 해서 사용해 봤다.
아래와 같이 사용하니 되는군. 어쨌든 글쓰기도 힘들다. 2일을 이것때문에 고생했다. 어쨌든 뿌듯하네 ^^
선언부
typedef WINBASEAPI BOOL (*LPQueryFullProcessImageName)( __in HANDLE hProcess, __in DWORD dwFlags, __out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName, __inout PDWORD lpdwSize );
typedef BOOL (WINAPI *fpQueryFullProcessImageName)(HANDLE,DWORD,LPSTR,PDWORD);
사용시
DWORD dwLen = sizeof(szFilePath)/sizeof(TCHAR);
if ( !IsVista() )
{
GetModuleFileNameEx(hProcess,hMod[0], szFilePath, MAX_PATH );
strBuffer = szFilePath;
}
else
{
//VISTA 이상
HMODULE hDLL = LoadLibrary("kernel32.dll");
fpQueryFullProcessImageName pQueryFullProcessImageName ;
if (!hDLL) return(0); //Now use pointer to get access to functions defined in DLL
pQueryFullProcessImageName = (fpQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version
if (!pQueryFullProcessImageName)
return false;
ZeroMemory(szFilePath, sizeof(szFilePath));
dwLen = sizeof(szFilePath)/sizeof(TCHAR);
pQueryFullProcessImageName(hProcess, 0, szFilePath, &dwLen);
strBuffer = szFilePath;
}
if(!strBuffer.IsEmpty())
{
//프로세스 전체경로
strProcessPath = strBuffer;
TerminateProcess(hProcess,0);
return TRUE;
}
이 글은 스프링노트에서 작성되었습니다.