'[PROGRAMMING]/▶Window System Programming'에 해당되는 글 3건

  1. 2012.07.26 GetModuleHandle 과 Loadlibrary 대하여..
  2. 2012.06.13 win32 base code 기본 코드
  3. 2011.12.08 Cmd 프로세스 리스트와 프로세스 종료 구현하기

<GetModuleHandle = LoadLibrary>

HMODULE GetModuleHandle ( LPCSTSTR lpModuleName );

HMODUEL LoadLibrary(LPCTSTR lpFileName);

GetModuleHandle은 그리 접할일이 많지 않은 함수이다.  우선 모듈이라는 말은
간 단히 함수들의 집합이다.  특정일을 처리한다는 객체의 개념으로 해석할 수도 있다. 다른 공학에서는 모듈이 있지만 역시 기능을 모아 놓았다는 비슷한 뜻이다.  함수들의 집합이라고 해도 아직 좀 막연한데 윈도우 내에서는 구체적인 예로 DLL이나 EXE 파일이 있다


MSDN 에 의하면 GetModuleHandlle은 모듈의엔트리 포인트를 넘겨주는 함수이다.


엔트리 포인트Base Adress이다 C 프로그램의 엔트리 포인트는  main 이요, 윈도우 프로그래밍의 엔트리 포인트는 WinMain  이 아닌가. 물론 관점에 따라 스타트업 코드를 엔트리 포인트라고 할수도 있다.

lpModuleName 에 dll 이나 exe 파일 이름을 넘겨주면 모듈에 대한 핸들 을 리턴하는 것이 아니라 실제 리턴값은 베이스 주소 값을 넘겨준다. 결국 GetModuleHandledllexe베이스 주소를 리턴하는 함수이다. 


 LoadLibrary  역시 같은 기능을 하지만 레퍼런스 카운팅 ( referencing counting ) 을 하느냐 안하냐의 차이점이 있다.

 LoadLibrary  의 경우 레퍼런스 카운트를 올리지만   GetModuleHandle 은 올리지 않는다 그러므로

단순한 값만 참조할때는 GetModuleHandle 을 실제 지속적으로 사용하기 위해서는 LoadLibrary 를 사용한다.

<GetProcAddress>

FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);

DLL에서 Export한 함수의 번지를 찾아서 그 함수를 사용할 수 있도록 그 함수의 포인터를 리턴해 주는 API

 

[출처 및 참고]

http://blog.naver.com/pwk0810?Redirect=Log&logNo=40131525623|작성자 분발하자

http://blog.naver.com/hsshee?Redirect=Log&logNo=70037637328

http://blog.naver.com/sorkelf?Redirect=Log&logNo=40133647878 GetmMoudleHandle 과 Loadlibrary GetprocAddress 사용법

http://blog.naver.com/shw20319?Redirect=Log&logNo=20138056582    어셈연산자

http://www.reversecore.com/54    실행파일이 커널에서 실행방법

http://marcof.tistory.com/22 윈도우 커널구조 그림

posted by 미스터리 DKL

#include<windows.h>
#include<tchar.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 //클래스를 등록한다 ex) 인스턴스 핸들 : 메모리에 생성된 클래스의 실체 , 내방의 여러가지 물건(객체) 존재하고있는 모든 물건들이 클래스이다.
 //객체=물건 , 클래스 = 물건들, 클래스들의 집합 = 인스턴스 핸들(메모리에 실제로 올라온것)

 /************* 윈도우 클래스만들기 ****************/
 WndClass.cbClsExtra = 0;                                                                       //클래스 여분 바이트 수
 WndClass.cbWndExtra = 0;                                                                     //윈도우 여분 바이트 수
 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);      //윈도우 배경 색 
 WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);                              //프로그램에서 사용할 커서
 WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);                             //프로그램에서 사용할 아이콘
 WndClass.hInstance = hInstance;                                                          //프로그램의 인스턴스 핸들
 WndClass.lpfnWndProc = (WNDPROC)WndProc;                                      //프로시저 함수명
 WndClass.lpszClassName = lpszClass;                                                 //구조체로 만들어질 클래스명
 WndClass.lpszMenuName = NULL;                                                        //프로그램에서 사용할 메뉴
 WndClass.style = CS_HREDRAW | CS_VREDRAW;                                    //윈도우 스타일
 
 /************윈도우 클래스 등록********************/
 RegisterClass(&WndClass);

 /*************윈도우 객체 생성*********************/
 //CreateWindow로 객체를 생성하고 인트형 handle을 반환한다.
 hWnd = CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,(HMENU)NULL,hInstance,NULL);

 /************윈도우 화면을 띄운다********************/
 ShowWindow(hWnd,nCmdShow);

 /************메세지 루프(어플리케이션 큐 에서 메세지를 가저와 윈도우 프로시저로 전달)***/
 while(GetMessage(&Message,0,0,0))
 {
  TranslateMessage(&Message);  //WM_KEYDOWN,WM_CHAR,WM_KEYUP세가지 메세지 발생, GetMessage함수로 읽어드린 이벤트를 이 함수가 문자가 입력됬는지 검사하고 입력됬으면 WM_CAHR 생성하고, 문자입력이 없으면 DispatchMessage로 넘김.
  DispatchMessage(&Message);  //GetMessage함수로부터 전달된 메세지를 윈도우 프로시저로 전달하는 역할을한다.
 }
 //키보드 입력(이벤트발생) -> 운영체제(시스템큐) -> 애플리케이션큐(프로그램버퍼) -> winmain()(메세지루프) -> WndProc()(윈도우프로시저)
 //SendMessage : 위의 과정을 무시하고 윈도우 프로시저 함수로 바로전달되며 메세지 전달하는 역할은 이 함수가한다. 완전히 처리되기전까지 반환되지 않는다.
 //PostMessage : 위와 같음. 이 함수로 메시지를 보내면 곧바로 반환됨,해당 메세지를 붙인 스레드는 다른작업 가능함. 비동기적으로 처리시 유용함.
 return Message.wParam;

 //MSG message 원형
 /* typedef struct tagMSG
    {
   HWND hWnd;               이벤트가 발생한 윈도우 핸들
   UINT message;            이벤트 메시지 종류
   WPARAM wParam;       부가정보
   LPARAM lParam;         부가정보
   DWORD time;               이벤트 접수된 시각
   POINT pt;                    이벤트가 발생한 위치(좌표)
  }*/
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 switch(iMessage)
 {
 case WM_DESTROY:
  PostQuitMessage(0);

 }

 return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}

posted by 미스터리 DKL

윈도우 시스템 프로그래밍을 공부하면서 처음으로 책을 참고하지않고 순수 msdn+아이디어?(라고하긴 좀 머하긴 하지만;;;) 나름 혼자의 힘으로 간단한 커맨드 프로그램을 만들었습니다.

소스는 텍스트 파일로 첨부하였습니다.



처음 실행 했을때의 화면입니다.

help 를 입력하면 간단히 사용될 명령어 목록을 보여줍니다.

ps -l 을 입력하면 지금 실행중인 모든 프로세스에 대해서 리스트화를 해주구요 마지막엔 친절하게 지금 실행되고 있는 프로세스 갯수를 출력하도록 했습니다.

 

ps -namekill chrome 을 입력하면 chrome.exe 파일의 프로세스id를 모두 받아와서 종료를 하고 몇개의 프로세스가 종료되었는지 확인할 수 있도록 하였습니다.

gogo 명령어는 제가 c공부하고 만든 프로그램인데 업무를 마지고 퇴근할때 버스시간은 다되가고 많이 띄어저있는 프로그램들을 한꺼번에 차례씩 종료하면 사양안좋은 컴퓨터는 OTL 집에가는 시간이 길어저 버스를 놓지게되지요.
그래서 만든건데 USER권한으로 실행되는 프로세스들을 필터링해서 종료하고 10초뒤 자동으로 꺼지게 할수 있게 만들었습니다.
나름 C첫작품입니다.. 이건 따로 리뷰를 하겠습니다^^;;

그래서 저걸 왜집어 넣었느냐면요 추후에 gogo를 입력했을때 제가 만들어놓은 프로그램을 자식프로세스로 로드시키려고 만들었습니다ㅎㅎ;;
정말 허접하지만 이러면서 실력 느는거 아니겠어요?? 전 늘꺼라고 믿습니다 화이팅! ㅎㅎ

posted by 미스터리 DKL