반응형
/* 1. 윈도우를 만들때 시스템 입장에서는 메모리에 잡힌 윈도우 구조체이다. 2. 펜이 필요해 만들때에도 팬은 시스템 입장에서는 하나의 구조체이다. 3. 파일을 읽거나 쓸때에도 하나의 구조체이다. 윈도우와 관련된 객채를 User Object이다. - 핸들이 전형적이다. 펜과 같이 그래픽관련 객체를 GDI Object이다. -핸들이 지역적이다. 파일과 같이 시스템적으로 관련된 객체를 Kernel Object라 한다. -한정적 핸들 or 상대적 핸들 1. OS가 만드는3가지 객체의 종류 ↑ 2. 핸들의 특징 ↑ 3. 모든 커널객체의 공통적인 특징 (KO - Kernel Object) 1. 보안이라는 속성을 갖는다. 2. 시그널이라는 속성을 같는다. 3. 참조개수가 있다. 4. 이름이 있다. 5. 소유자는 OS이다. 4. 한정적 / 한정적 핸들이란? a.exe를 실행하면 OS는 가상주소를 만들어 준다. -> 프로세스 프로세스를 관리하기 위해 OS는 객체 하나를 만들어준다. -> 프로세스 관리 객체(Kernel) ->PKO ※리눅스에서는 프로세스 하나를 관리하기 위해 만드는 객체를TASK_STRUCT라고 부른다. EProcess의 크기는 큰데 그중에서 ○를 가리키는 해들이 있다.○를 커널 오브젝트 핸들테이블이라 한다.(KOHT) 파일 객체가 만들어 졌다면 KOHT에가서 파일 객체의 정보를 a.exe의 테이블에 추가한다. 몇번째인지, 타입이 먼지, 접근은? 번지는 어디인지 알려준다. ※모든 핸들은 커널의 인덱스이다. SendMessage를 통해서 a프로그램의 파일 객체의 핸들을 다른 프로그램에 보내면 그 프로그램은 사용할 수 없다. 한정적 핸들-> 이유는 그 다른 프로그램의 KOHT에 파일 객체의 정보가 없기 때문이기도 하지만, 같은 핸들에 다른 객체가 있을수 있기 때문. 하지만 a프로그램의 KOHT항목을 다른 프로그램에 복사할수 있다면 다른 프로그램도 a의 객체의 핸들을 사용할 수 있다. DuplicateHandle(); <~이것을 사용 그러나 핸들의 번호는 바뀐다. 다른 객체가 사용할 수 있기 때문이다. 싱대적 핸들-> 그러나 다른 핸들을 사용한다. 파일의 소유자는 특정 프로세스가 될 수 없고 시스템이 된다. 파일에는 참조개수가있다. 하나의 프로세스가 사라지면 참조의 개수가 줄뿐 파일이 파괴되지는 않는다. 참조개수가 0이면 파일이 사라진다. 파일을 사용하지 않으려면 참조의 파일의 참조의 개수를 줄이고, 테이블에서 지우면된다. -> CloseHandle(); // 자기자신의 커널 테이블의 핸들을 지우고 만약 파일의 참조개수가 0이면 커널 객체를 지운다. 프로세스가 4기가 있면 물리 공간의 2기가와 프로세스 2기가 그리고 커널 영역의 2기가는 같은 공간에 맵핑된다. 그래서 커널의 공간이나 프로세스의 공간의 같은주소는 같은 곳에 매핑된다. */ #include<stdio.h> #include<windows.h> void main() { HANDLE hFile = CreateFile("a.txt",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, // 보안 CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); printf("생성된 파일 핸들(Table index) : %x\n",hFile); //================================================================ HWND hwnd = FindWindow(0,"B"); //B에게 핸들을 바로 전달한다. // SendMessage(hwnd, WM_USER+100,0,(LPARAM)hFile); //================================================================ //hwnd을 만든 프로세스의 ID를 구한다. DWORD pid; DWORD tid = GetWindowThreadProcessId(hwnd, &pid); //프로세스 ID를 가지고 PROCESS의 핸들을 얻는다. HANDLE h; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0 , pid); //A의 Table의 내용을 B의 Table에 복사해준다. DuplicateHandle(GetCurrentProcess(),hFile, //source hProcess, &h, //target 0,0,DUPLICATE_SAME_ACCESS); printf("B에 복사한 핸들 ((Table index) : %x\n",h); SendMessage(hwnd, WM_USER+100,0,(LPARAM)h);//???체워 보세요 //================================================================ CloseHandle(hFile); // 1. KOHT에서 항목 삭제 // 2. if(--(hFile,참조개수 ) == 0)delete 파일 }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."