/*
윈도우, 프로세스, 모듈
    - 핸들, ID, 파일이름

    파일이름 만으로 전체 경로 얻기 GetFullPathName(  sFileName,   _MAX_PATH,  sFullFull,  0);
                                        -> 문제 : 현재 경로에 파일름만 붙인다.
                        GetFullPath()(만듬) : 파일일 현재 실행된 파일의 경로에 있는 검사해서 붙인다.

* 윈도우

    윈도 Instance : (SDK) GetWindowLong(hWndCur, GWL_HINSTANCE),   (MFC)HINSTANCE AfxGetInstanceHandle();
    현재 Window Handle    : GetCurrentWindowHandle(만듬)   
    Process Handle (ID) -> Window Handle : HWND GetWindowHandleFromProcessId(DWORD dwProcId) (만듬)   

* 프로세스

    현재 Process Handle : HANDLE GetCurrentProcess(VOID);
    현재 Process ID        : DWORD GetCurrentProcessId(VOID);
    프로세스(모듈) 파일 이름  : GetModuleBaseName(hProc, 0, sNameOnly, _MAX_PATH);//이름만
                      GetModuleFileName(0, sFullPath, _MAX_PATH);//전체경로
    Win Handle -> Process Handle : GetWindowThreadProcessId
    파일이름 -> Process ID : GetProcessIdFromName(만듬)
    파일이름 -> Process Handle : GetProcessHandle(만듬), 2가지 방식, OpenProcess, CreateProcess
    Process ID -> Process Handle : GetProcessId() , API인데 MSDN 설명이 안나옴

    GetCurrentProcessorNumber() ??
    GetCurrentActCtx()??

* 모듈

    현재 Module Handle    : GetCurrentModule(만듬)
    파일이름 -> 모듈핸들 : GetModuleHandle();//현재 프로세스에서만 작동
                        특정프로세스 안에 있는 모듈 핸들 GetModuleHandle()(만듬), 외부 프로세스에서 작동
    모듈ID -> 모듈 핸들 :

* 쓰레드

    현재 쓰레드 핸들    : GetCurrentThread()
    현재 쓰레드 ID        : GetCurrentThreadId()


   
*/




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

    //===============================================================================
    static HWND shWndCurWnd;

    BOOL CALLBACK cbfEnumWindowsProc(  HWND hWnd, LPARAM lParam )
    {
        shWndCurWnd =0;
        DWORD PID=0, TID=0;
        TID = ::GetWindowThreadProcessId (hWnd, &PID);
       
        if( (DWORD)lParam == PID){
            shWndCurWnd=hWnd;
            return FALSE;
        }

        return TRUE;
    }

    //프로세스 ID로 윈도우 핸들 얻기
    //현재 한개의 외부함수(cbfEnumWindowsProc)와 외부 변수(shWndCurWnd) 사용
    //차후 프로세스정보를 이용한 한개의 함수로 개선
    HWND GetWindowHandleFromProcessId(DWORD dwProcId)
    {
        shWndCurWnd=0;

        BOOL b = EnumWindows( cbfEnumWindowsProc,  dwProcId );

        if( (b==FALSE) &&(shWndCurWnd!=0)){
            return shWndCurWnd;
        }

        return 0;
    }
    //===============================================================================

    //현재 윈도우 핸들 얻기
    HWND GetCurrentWindowHandle()
    {   
        return GetWindowHandleFromProcessId(GetCurrentProcessId());
    }


    //현재 모듈 핸들 얻기
    HMODULE GetCurrentModuleHandle()
    {
        MEMORY_BASIC_INFORMATION   mbi;  
        static   int   dummy;  
        VirtualQuery(   &dummy,   &mbi,   sizeof(mbi)   );  
       
        return   reinterpret_cast<HMODULE>(mbi.AllocationBase);  
    }

    //파일이름 -> Process ID : GetProcessId(만듬)
    DWORD GetProcessIdFromName(TCHAR *sProcName)
    {
        DWORD dwFlags = TH32CS_SNAPPROCESS;
        DWORD dwProcessID = 0;
        BOOL fOk;
        int i=0;

        HANDLE hSnapshot = CreateToolhelp32Snapshot(dwFlags, dwProcessID);
        PROCESSENTRY32 pe = { sizeof(pe) };

        fOk = Process32First(hSnapshot, &pe);
        int    nLen = _tcslen(sProcName);
       
        do
        {           
            if(_tcsnicmp(pe.szExeFile, sProcName, nLen) == 0)
            {
                return pe.th32ProcessID ;
            }       
        }
        while( (fOk=Process32Next(hSnapshot, &pe)) != false );

        return 0;
    }


    //프로세스 안의 모듈 핸들을 찾는다.
    //모듈 ID보다 이름을 찾는데는 핸들이 용이
    //OpenProcess를 이용하는 방법도 있지만. 프로세스를 열기 않고 실행하기 위해 CreateToolhelp32Snapshot, ?? 차후 테스트
    HANDLE GetModuleHandle( DWORD dwProcessId, TCHAR *sModuleName)
    {
        BOOL            bRet;
        bool            bFound      = false;
        HANDLE            hModuleSnap = NULL;
        MODULEENTRY32    me32        = {0};
        int                nLen = _tcslen(sModuleName);

        hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
        if (hModuleSnap == INVALID_HANDLE_VALUE)    
            return false;   

        me32.dwSize = sizeof(MODULEENTRY32);

        bRet = Module32First(hModuleSnap, &me32);
        while (bRet && !bFound)
        {   
            if(_tcsnicmp(me32.szModule, sModuleName, nLen) == 0)
            {           
                //bFound = true;
                //return me32.th32ModuleID;
                return me32.hModule;
            }
            bRet = Module32Next(hModuleSnap, &me32);
        }
        CloseHandle (hModuleSnap);

        return 0;
    }

    //Process Handle 구하기
    //OpenProcess 이용
    //ID->HANDLE
    HANDLE GetProcessHandleFromOP(DWORD dwProcId)
    {   
        HANDLE hProcess = 0;

        hProcess = ::OpenProcess(
            PROCESS_ALL_ACCESS, // Specifies all possible access flags
            FALSE,
            dwProcId//pProcess->Get_ProcessId()
            );
        if( !hProcess )
            return 0;
        else
            return hProcess;
    }

    //Process Handle 구하기
    //OpenProcess 이용
    //파일이름 -> Process Handle
    HANDLE GetProcessHandleFromOP(TCHAR *sFileName)
    {
        DWORD dwProcId = 0;
        HANDLE hProcess = 0;
       
        dwProcId = GetProcessIdFromName(sFileName);
        return GetProcessHandleFromOP(dwProcId);
    }

    /*
        파일이름 만으로 전체 경로 얻기 GetFullPathName(  sFileName,   _MAX_PATH,  sFullFull,  0);
                                            -> 문제 : 현재 경로에 파일름만 붙인다.
                            GetFullPath()(만듬) : 파일일 현재 실행된 파일의 경로에 있는 검사해서 붙인다.
    */
    BOOL GetFullPath(TCHAR* sFullPath, int nMax, TCHAR *sFileName)
    {
        HMODULE hMod = GetCurrentModuleHandle();
        DWORD sSize = GetModuleFileName(hMod, sFullPath, nMax);
        if(sSize >0){
            strcpy( strrchr(sFullPath,_T('\\'))+1, sFileName);
            return TRUE;
        }
        return FALSE;
    }




반응형

'Code' 카테고리의 다른 글

_ERROR Log  (0) 2012.08.19
윈도우,비주얼 스튜디오 버전, WINVER, _MSC_VER  (0) 2012.08.19
Window, Process, Module, Thread 정보  (1) 2012.08.19
Time  (0) 2012.08.19
OEP 찾는 방법들  (0) 2012.08.19
UNICODE in Console  (0) 2012.08.19
Posted by codens codens

댓글을 달아 주세요

  1. 준희아벙 2017.03.06 15:57  댓글주소  수정/삭제  댓글쓰기

    * 현재 프로세스의 ID: GetCurrentProcessId()
    * 현재 프로세스의 HANDLE: GetCurrentProcess();