커널 개체
커널 개체 핸들은 프로세스별로 다릅니다. 즉, 프로세스는 개체를 만들거나 기존 개체를 열어 커널 개체 핸들을 가져와야 합니다. 커널 핸들의 프로세스당 제한은 2^24입니다. 그러나 핸들은 페이징된 풀에 저장되므로 만들 수 있는 실제 핸들 수는 사용 가능한 메모리를 기반으로 합니다. 32비트 Windows에서 만들 수 있는 핸들 수는 2^24보다 훨씬 낮습니다.
프로세스가 개체의 이름을 알고 개체에 대한 보안 액세스 권한이 있는 경우 모든 프로세스는 기존 커널 개체(다른 프로세스에서 만든 커널 개체)에 대한 새 핸들을 만들 수 있습니다. 커널 개체 핸들에는 프로세스에 부여되거나 거부될 수 있는 작업을 나타내는 액세스 권한이 포함됩니다. 애플리케이션은 개체를 만들거나 기존 개체 핸들을 가져올 때 액세스 권한을 지정합니다. 커널 개체의 각 형식은 자체 액세스 권한 집합을 지원합니다. 예를 들어 이벤트 핸들에는 설정 또는 대기 액세스(또는 둘 다), 파일 핸들에는 읽기 또는 쓰기 액세스(또는 둘 다)가 있을 수 있습니다. 자세한 내용은 보안 개체참조하세요.
다음 그림에서 애플리케이션은 이벤트 개체를 만듭니다. CreateEvent 함수는 이벤트 개체를 만들고 개체 핸들을 반환합니다.
이벤트 개체애플리케이션
이벤트 개체를 만든 후 애플리케이션은 이벤트 핸들을 사용하여 이벤트를 설정하거나 대기할 수 있습니다. 애플리케이션이 핸들을 닫거나 종료할 때까지 핸들은 유효한 상태로 유지됩니다.
대부분의 커널 개체는 단일 개체에 대한 여러 핸들을 지원합니다. 예를 들어 이전 그림의 애플리케이션은 다음 그림과 같이 OpenEvent 함수를 사용하여 추가 이벤트 개체 핸들을 가져올 수 있습니다.
여러 핸들이애플리케이션
이 메서드를 사용하면 애플리케이션이 서로 다른 액세스 권한을 가진 핸들을 가질 수 있습니다. 예를 들어 핸들 1은 이벤트에 대한 액세스를 설정하고 대기할 수 있으며 핸들 2에는 대기 액세스만 있을 수 있습니다.
다른 프로세스에서 이벤트 이름을 알고 개체에 대한 보안 액세스 권한이 있는 경우 OpenEvent사용하여 자체 이벤트 개체 핸들을 만들 수 있습니다. 또한 만드는 애플리케이션은 DuplicateHandle 함수를 사용하여 핸들 중 하나를 동일한 프로세스 또는 다른 프로세스로 복제할 수 있습니다.
하나 이상의 개체 핸들이 있는 한 개체는 메모리에 남아 있습니다. 다음 그림에서 애플리케이션은 CloseHandle 함수를 사용하여 이벤트 개체 핸들을 닫습니다. 이벤트 핸들이 없으면 시스템은 다음 그림과 같이 메모리에서 개체를 제거합니다.
메모리
시스템은 파일 개체를 다른 커널 개체와 약간 다르게 관리합니다. 파일 개체에는 파일 포인터( 파일에서 읽거나 쓸 다음 바이트에 대한 포인터)가 포함됩니다. 애플리케이션에서 새 파일 핸들을 만들 때마다 시스템은 새 파일 개체를 만듭니다. 따라서 다음 그림과 같이 둘 이상의 파일 개체가 디스크의 단일 파일을 참조할 수 있습니다.
디스크
다음 그림과 같이 중복 또는 상속을 통해서만 둘 이상의 파일 핸들이 동일한 파일 개체를 참조할 수 있습니다.
두 개의 파일 핸들을
다음 표에서는 각 개체의 작성자 및 구축자 함수와 함께 각 커널 개체를 나열합니다. 작성자 함수는 개체와 개체 핸들을 만들거나 새 기존 개체 핸들을 만듭니다. 구축함 함수는 개체 핸들을 닫습니다. 애플리케이션이 커널 개체에 대한 마지막 핸들을 닫으면 시스템에서 메모리에서 개체를 제거합니다.
커널 개체 | Creator 함수 | Destroyer 함수 |
---|---|---|
액세스 토큰 | CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessTokenOpenThreadToken | CloseHandle |
변경 알림 | FindFirstChangeNotification | FindCloseChangeNotification |
통신 디바이스 | CreateFile | CloseHandle |
콘솔 입력 | CreateFile, CONIN$ | CloseHandle |
콘솔 화면 버퍼 | CreateFile, CONOUT$ | CloseHandle |
바탕 화면 | GetThreadDesktop | 애플리케이션에서 이 개체를 삭제할 수 없습니다. |
이벤트 | CreateEvent, CreateEventExOpenEvent | CloseHandle |
이벤트 로그 | OpenEventLog, RegisterEventSource, OpenBackupEventLog | CloseEventLog |
파일 | CreateFile | CloseHandleDeleteFile |
파일 매핑 | CreateFileMappingOpenFileMapping | CloseHandle |
파일 찾기 | FindFirstFile | FindClose |
힙 | HeapCreate | HeapDestroy |
I/O 완료 포트 | CreateIoCompletionPort | CloseHandle |
직업 | CreateJobObject | CloseHandle |
Mailslot | CreateMailslot | CloseHandle |
메모리 리소스 알림 | CreateMemoryResourceNotification | CloseHandle |
모듈 | LoadLibraryGetModuleHandle | freeLibrary |
뮤텍스 (뮤텍스) | CreateMutexCreateMutexExOpenMutex | CloseHandle |
파이프 | CreateNamedPipeCreatePipe | CloseHandleDisconnectNamedPipe |
프로세스 | CreateProcessOpenProcessGetCurrentProcess | CloseHandle, TerminateProcess |
세마포 | CreateSemaphore, CreateSemaphoreEx, OpenSemaphore | CloseHandle |
소켓 | 소켓 수락 | closesocket |
스레드 | CreateThreadCreateRemoteThreadGetCurrentThread | CloseHandle, TerminateThread |
타이머 | CreateWaitableTimerCreateWaitableTimerExOpenWaitableTimer | CloseHandle |
리소스 업데이트 | BeginUpdateResource | endUpdateResource |
창 스테이션 | GetProcessWindowStation | 애플리케이션에서 이 개체를 삭제할 수 없습니다. |
관련 항목