관리 메뉴

kisoo

VISTA&WIN7 잘못된 프로세스 경로일때 본문

01.About Programming /9..VC++

VISTA&WIN7 잘못된 프로세스 경로일때

JamesK78 2012. 8. 14. 17:20

 한 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;

     }

이 글은 스프링노트에서 작성되었습니다.

Comments