- 프로세스 핸들 관련 설명

------------------------------------------------------------------------------
프로세스의 핸들을 얻어올 때 사용하는 함수

HANDLE WINAPI OpenProcess(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ DWORD dwProcessId
);

성공시 지정한 프로세스의 핸들이 리턴
실패시 NULL 리턴

- dwDesiredAccess : 핸들을 얻어 접근 하고자 하는 프로세스의 접근 권한을 설정 한다.
(함수를 호출한 프로세스가 아닌 다른 프로세스의 전체 접근 권한을 지닌 핸들을 구하고자 할 때는 
SeDebugPrivilege 특권을 활성화 시켜야 한다.)

- bInheritHandle : 핸들의 상속 여부를 지정 (TRUE : 상속, FLASE : 비상속)

- dwProcessId : 핸들을 얻고자 하는 프로세스의 ID를 지정
(함수를 호출한 프로세스 자신의 PID를 얻고자 할 때는 
GetCurrentProcessId 함수를 사용한다.)

------------------------------------------------------------------------------------------------------------------------------------------------------------
http://choiwoo.tistory.com/5
출처

다른 프로세스의 가상메모리를 확보할때 사용

LPVOID VirtualAllocEx(
HANDLE hProcess, 
LPVOID lpAddress, 
DWORD dwSize, 
DWORD FlAllocationType, 
DWORD FlProtect
);

- hProcess : 대상 핸들
- lpAddress : 할당받을 주소 (NULL 입력시 자동으로 비어있는 주소 할당)
- dwSize : 할당받을 메모리의 크기 (NULL 입력시 하나의 페이지 크기를 할당)
- FlAllocationType : 메모리를 Reserve 아니면 Commit -> MEM_RESERVE, MEM_COMMIT

----------------------------------------------------------------------------------------------------------------

할당받은 메모리에 쓰기를 할때 사용

BOOL WINAPI WriteProcessMemory(
HANDLE hProcess,
LPVOID ipBaseAddress,
LPVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
)
- hProcess : 프로세스 핸들정보
- ipBaseAddress : VirtualAllocEx ()를 통해 얻은 메모리 주소위치
- lpBuffer : DLL 경로 
- nSize : DLL 경로 문자열 길이 + NULL
- *lpNumberOfBytesWritten : 대상 프로세스 전달된 문자열 길이(? 무슨말인지)

----------------------------------------------------------------------------------------------------------------

모듈의 핸들 얻을때 사용하는 함수

HMODULE WINAPI GetModuleHandle( _In_opt_ LPCTSTR lpModuleName)

- lpModuleName : 얻고자 하는 핸들의 이름

----------------------------------------------------------------------------------------------------------------

함수의 주소를 얻어 올때 사용하는 함수
성공시 함수의 주소 리턴 실패시 ?

FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);

- hModule : 찾고자 하는 함수를 가진 모듈의 핸들값 
- lpProcName : 찾고자 하는 함수 이름

----------------------------------------------------------------------------------------------------------------

다른 프로세스에 스레드를 생성할때 사용하는 함수

HANDLE WINAPI CreateRemoteThread (
__in HANDLE hProcess,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress, 
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadID
);

- hProcess : 스레드가 생성될 프로세스의 핸들
- lpThreadAttributes : 스레드핸들을 자식 프로세스에게 상속할수있는지 여부(NULL 설정시 상속되지않음)
- dwStackSize : 스레드의 스택크기
- lpStartAddress : 스레드 함수 주소
- lpParameter : 스레드 파라미터 주소
- dwCreationFlags : 스레드가 시작되는 방식 지정 (0 : 바로 실행, 0x00000004 : 잠시 중지)
- lpThreadID : 생성될 스레드의 아이디 전달

----------------------------------------------------------------------------------------------------------------
http://artisticbit.tistory.com/…/WaitForSingleObject-%ED%95…
커널 오브젝트의 Signaled, Non-Signaled 상태 설명
https://www.joinc.co.kr/w/man/4100/WaitForsingleObject
함수에 관한 자세한 설명

지정된 객체가 시그널상태가 될때까지 혹은 비시그널 상태로 제한시간 까지 기다릴때사용하는 함수

성공시 
WAIT_ABANDONED ( 지정된 객체가 파기된 뮤텍스 객체다. 
뮤텍스를 소유한 쓰레드가 뮤텍스 객체의 소유권을 되돌려주지 않고 종료했다. 
그래서 뮤텍스 객체의 소유권이 호출한 쓰레드로 옮겨졌으며, 뮤텍스는 비시그널 상태가 되었다.)

WAIT_OBJECT_0 ( 지정한 객체에 시그널 상태다.) 
WAIT_TIMEOUT 리턴 ( 제한시간이 지날 때 까지 시그널 상태가 되지 않았다.)

DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);

- hHandle : 기다릴 객체의 핸들
- dwMilliseconds : 제한시간을 밀리초 단위로 지정(0 : 객체의 상태를 확인하고 바로 반환, INFINITE : 시그널이 도착할때 까지 기다린다.)


+ Recent posts