/*
윈도우, 프로세스, 모듈
- 핸들, 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()
*/
#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 |