2010년 2월 17일 수요일

프로세스 강제 종료

OpenProcess 디버그권한 문제 발생

해결은 아래쪽 검토

 

bool ProcessKill(CString strProcessName)

{

    HANDLE         hProcessSnap = NULL;

    BOOL           bRet      = FALSE;

    PROCESSENTRY32 pe32      = {0};

 

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

 

    if (hProcessSnap == (HANDLE)-1)

        return false;

 

    pe32.dwSize = sizeof(PROCESSENTRY32);

   

    //프로세스가 메모리상에 있으면 첫번째 프로세스를 얻는다

    if (Process32First(hProcessSnap, &pe32))

    {

        BOOL          bCurrent = FALSE;

        MODULEENTRY32 me32       = {0};

 

        do

        {

           bCurrent = GetProcessModule(pe32.th32ProcessID,strProcessName);

 

           if(bCurrent)

           {

              HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

 

              if(hProcess)

              {

                 if(TerminateProcess(hProcess, 0))

                 {

                    unsigned long nCode; //프로세스 종료 상태

                    GetExitCodeProcess(hProcess, &nCode);

                 }

                 CloseHandle(hProcess);

              }

           }

        }

        while (Process32Next(hProcessSnap, &pe32)); //다음 프로세스의 정보를 구하여 있으면 루프를 돈다.

    }

 

    CloseHandle (hProcessSnap);

 

    return true;

}

 

bool GetProcessModule(DWORD dwPID,CString sProcessName)

{

    HANDLE        hModuleSnap = NULL;

    MODULEENTRY32 me32        = {0};

 

    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);

    if (hModuleSnap == (HANDLE)-1)

        return (FALSE);

 

    me32.dwSize = sizeof(MODULEENTRY32);

   

    //해당 프로세스의 모듈리스트를 루프로 돌려서 프로세스이름과 동일하면

    //true를 리턴한다.

    if(Module32First(hModuleSnap, &me32))

    {

       do

       {

          if(me32.szModule == sProcessName)

          {

             CloseHandle (hModuleSnap);

             return true;

          }

       }

       while(Module32Next(hModuleSnap, &me32));

    }

 

    CloseHandle (hModuleSnap);

 

    return false;

}

 

여기에 디버그권한 에서는 실행되고 .exe를 바로 실행 했을 때는 프로세스를 못가져 오는 현상이 있다 ㅡ.ㅡ 프로세스 권한 문제라는데..

 

OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);

이내용을 PROCESS_ALL_ACCESS=>MAXIMUM_ALLOWED 이걸로 변경해 사용하면 된다.

 

 

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7057

댓글 없음:

댓글 쓰기