다음을 통해 공유


커널 개체

커널 개체 핸들은 프로세스별로 다릅니다. 즉, 프로세스는 개체를 만들거나 기존 개체를 열어 커널 개체 핸들을 가져와야 합니다. 커널 핸들의 프로세스당 제한은 2^24입니다. 그러나 핸들은 페이징 풀에 저장되므로 만들 수 있는 실제 핸들 수는 사용 가능한 메모리를 기반으로 합니다. 32비트 Windows에서 만들 수 있는 핸들 수는 2^24보다 훨씬 낮습니다.

프로세스가 개체의 이름을 알고 개체에 대한 보안 액세스 권한이 있는 경우 모든 프로세스는 기존 커널 개체(다른 프로세스에서 만든 커널 개체)에 대한 새 핸들을 만들 수 있습니다. 커널 개체 핸들에는 프로세스에 부여하거나 거부할 수 있는 작업을 나타내는 액세스 권한이 포함됩니다. 애플리케이션은 개체를 만들거나 기존 개체 핸들을 가져올 때 액세스 권한을 지정합니다. 각 유형의 커널 개체는 고유한 액세스 권한 집합을 지원합니다. 예를 들어 이벤트 핸들은 설정 또는 대기 액세스(또는 둘 다)를 가질 수 있고, 파일 핸들은 읽기 또는 쓰기 액세스(또는 둘 다)를 가질 수 있습니다. 자세한 내용은 보안 개체를 참조하세요.

다음 그림에서 애플리케이션은 이벤트 개체를 만듭니다. CreateEvent 함수는 이벤트 개체를 만들고 개체 핸들을 반환합니다.

이벤트 개체를 만드는 애플리케이션

이벤트 개체를 만든 후 애플리케이션은 이벤트 핸들을 사용하여 이벤트를 설정하거나 대기할 수 있습니다. 핸들은 애플리케이션이 핸들을 닫거나 종료할 때까지 유효한 상태로 유지됩니다.

대부분의 커널 개체는 단일 개체에 대한 여러 핸들을 지원합니다. 예를 들어 이전 그림의 애플리케이션은 다음 그림과 같이 OpenEvent 함수를 사용하여 추가 이벤트 개체 핸들을 가져올 수 있습니다.

여러 핸들을 사용하여 이벤트 개체를 만드는 애플리케이션

이 메서드를 사용하면 애플리케이션에 다른 액세스 권한이 있는 핸들이 있을 수 있습니다. 예를 들어 핸들 1은 이벤트에 대한 액세스를 설정하고 대기했을 수 있으며 핸들 2에는 대기 액세스만 있을 수 있습니다.

다른 프로세스에서 이벤트 이름을 알고 있고 개체에 대한 보안 액세스 권한이 있는 경우 OpenEvent를 사용하여 자체 이벤트 개체 핸들을 만들 수 있습니다. 또한 만드는 애플리케이션은 DuplicateHandle 함수를 사용하여 핸들 중 하나를 동일한 프로세스 또는 다른 프로세스로 복제할 수도 있습니다.

개체 핸들이 하나 이상 있는 한 개체는 메모리에 남아 있습니다. 다음 그림에서 애플리케이션은 CloseHandle 함수를 사용하여 이벤트 개체 핸들을 닫습니다. 이벤트 핸들이 없으면 시스템은 다음 그림과 같이 메모리에서 개체를 제거합니다.

메모리에서 개체를 제거하는 애플리케이션 닫기 이벤트 개체 핸들

시스템은 파일 개체를 다른 커널 개체와 약간 다르게 관리합니다. 파일 개체에는 파일 포인터(파일에서 읽거나 쓸 다음 바이트에 대한 포인터)가 포함됩니다. 애플리케이션이 새 파일 핸들을 만들 때마다 시스템은 새 파일 개체를 만듭니다. 따라서 다음 그림과 같이 둘 이상의 파일 개체가 디스크의 단일 파일을 참조할 수 있습니다.

디스크의 파일을 참조하는 여러 파일 개체

다음 그림과 같이 중복 또는 상속을 통해서만 둘 이상의 파일 핸들이 동일한 파일 개체를 참조할 수 있습니다.

두 개의 파일 핸들이 동일한 파일 개체를 참조합니다.

다음 표에는 각 개체의 작성자 및 구축자 함수와 함께 각 커널 개체가 나열되어 있습니다. 작성자 함수는 개체와 개체 핸들을 만들거나 새 기존 개체 핸들을 만듭니다. 구축함 함수는 개체 핸들을 닫습니다. 애플리케이션이 커널 개체에 대한 마지막 핸들을 닫으면 시스템에서 메모리에서 개체를 제거합니다.

커널 개체 작성자 함수 Destroyer 함수
액세스 토큰 CreateRestrictedToken, DuplicateToken, DuplicateTokenEx, OpenProcessToken, OpenThreadToken CloseHandle
변경 알림 FindFirstChangeNotification FindCloseChangeNotification
통신 디바이스 CreateFile CloseHandle
콘솔 입력 CREATEFile, CONIN$ CloseHandle
콘솔 화면 버퍼 CREATEFile, CONOUT$ CloseHandle
데스크톱 GetThreadDesktop 애플리케이션에서 이 개체를 삭제할 수 없습니다.
이벤트 CreateEvent, CreateEventEx, OpenEvent CloseHandle
이벤트 로그 OpenEventLog, RegisterEventSource, OpenBackupEventLog CloseEventLog
파일 CreateFile CloseHandle, DeleteFile
파일 매핑 CreateFileMapping, OpenFileMapping CloseHandle
파일 찾기 FindFirstFile FindClose
HeapCreate HeapDestroy
I/O 완료 포트 CreateIoCompletionPort CloseHandle
작업 CreateJobObject CloseHandle
Mailslot CreateMailslot CloseHandle
메모리 리소스 알림 CreateMemoryResourceNotification CloseHandle
모듈 LoadLibrary, GetModuleHandle FreeLibrary
Mutex CreateMutex, CreateMutexEx, OpenMutex CloseHandle
파이프 CreateNamedPipe, CreatePipe CloseHandle, DisconnectNamedPipe
Process CreateProcess, OpenProcess, GetCurrentProcess CloseHandle, TerminateProcess
세마포 CreateSemaphore, CreateSemaphoreEx, OpenSemaphore CloseHandle
소켓 socket, accept closesocket
스레드 CreateThread, CreateRemoteThread, GetCurrentThread CloseHandle, TerminateThread
타이머 CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer CloseHandle
리소스 업데이트 BeginUpdateResource EndUpdateResource
창 스테이션 GetProcessWindowStation 애플리케이션에서 이 개체를 삭제할 수 없습니다.

 

커널 개체 네임스페이스