/*
윈도우, 프로세스, 모듈
    - 핸들, 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
Time  (0) 2012.08.19
OEP 찾는 방법들  (0) 2012.08.19
UNICODE in Console  (0) 2012.08.19
Posted by codens