kernel对象句柄是进程相关的。就是说,一个进程要么创建一个对象,要么打开一个已经存在的对象去获得kernel对象句柄。每个进程的kernel句柄数限制为2^24。但是,句柄是存储在paged pool里的,所以真实的可以创建的句柄数是基于可用内存。在32位windows上可以创建的句柄数是要少于2^24的。
任何进程都可以创建一个新的句柄,来指向一个已经存在的kernel对象,即使这个kernel对象是被另外一个进程创建的。创建新句柄只需要这个进程知道kernel对象的名称,并且有访问这个对象的权限。kernel对象句柄可以表明一个动作能否授予给某个进程。应用可以在创建kernel对象时明确它的访问权利,或者在获得一个已经存在的对象句柄时明确访问权利。每种类型的kernel对象都支持它自身的访问权利的集合。例如,每个句柄都有set或者wait权限,文件句柄有读或者写权限,等等。更多信息,看securable object。
接下来将通过示例证明一个application创建一个event object。CreateEvent 函数创建event对象并返回一个对象句柄。
在event object创建完成之后,应用可以使用event句柄对event使用set或者wait权限。句柄会一直保持有效,直到应用关闭句柄或者应用停止。
大多数kernel对象支持一个对象上有多个句柄。例如,在下面的示例中,应用通过OpenEvent函数获得另外一个event对象句柄。
这个方法允许一个应用在不同的句柄上有不同的权限。例如,Handle 1可以有set和wait权限,而Handle 2只有wait权限。
如果另一个进程知道event对象的名字并且有访问这个event对象的权利,它可以通过OpenEvent函数创建它自己的event对象句柄。应用也可以使用Duplicate方法把一个进程的句柄复制到另外一个进程。
只要有至少一个的kernel对象句柄存活,这个kernel对象就可以继续保存在内存中。在下面的示例中,每个应用都使用CloseHandle函数关闭它的event对象句柄。当没有对象句柄存在时,系统会把这个kernel对象从内存中移除掉。
系统管理文件对象的方式与其它kernel对象不同。文件对象包含文件指针——指针指向文件中下一个将被读或者将被写的字节。当应用创建一个新的文件句柄时,系统总会创建一个新的文件对象。因此,至少超过一个的文件对象可以同时指向磁盘中的一个文件,如下面的示例所示。
只有通过复制或者继承,才能使两个或者两个以上的文件句柄指向同一个文件对象,如下面的示例所示。
下表列出了每一个kernel对象,以及每个对象的创建函数和销毁函数。创建函数要么创建一个新的kernel对象和它的对象句柄,要么创建一个已经存在的对象的对象句柄。销毁函数关闭对象句柄。当一个应用关闭了一个kernel对象上的最后一个对象句柄时,系统会把这个kernel对象从内存中移除掉。
Kernel object | Creator function | Destroyer function |
---|
Access token | CreateRestrictedToken, DuplicateToken, DuplicateTokenEx,OpenProcessToken, OpenThreadToken | CloseHandle |
Change notification | FindFirstChangeNotification | FindCloseChangeNotification |
Communications device | CreateFile | CloseHandle |
Console input | CreateFile, with CONIN$ | CloseHandle |
Console screen buffer | CreateFile, with CONOUT$ | CloseHandle |
Desktop | GetThreadDesktop | Applications cannot delete this object. |
Event | CreateEvent, CreateEventEx, OpenEvent | CloseHandle |
Event log | OpenEventLog, RegisterEventSource, OpenBackupEventLog | CloseEventLog |
File | CreateFile | CloseHandle, DeleteFile |
File mapping | CreateFileMapping, OpenFileMapping | CloseHandle |
Find file | FindFirstFile | FindClose |
Heap | HeapCreate | HeapDestroy |
I/O completion port | CreateIoCompletionPort | CloseHandle |
Job | CreateJobObject | CloseHandle |
Mailslot | CreateMailslot | CloseHandle |
Memory resource notification | CreateMemoryResourceNotification | CloseHandle |
Module | LoadLibrary, GetModuleHandle | FreeLibrary |
Mutex | CreateMutex, CreateMutexEx, OpenMutex | CloseHandle |
Pipe | CreateNamedPipe, CreatePipe | CloseHandle,DisconnectNamedPipe |
Process | CreateProcess, OpenProcess, GetCurrentProcess | CloseHandle,TerminateProcess |
Semaphore | CreateSemaphore, CreateSemaphoreEx, OpenSemaphore | CloseHandle |
Socket | socket, accept | closesocket |
Thread | CreateThread, CreateRemoteThread, GetCurrentThread | CloseHandle,TerminateThread |
Timer | CreateWaitableTimer, CreateWaitableTimerEx, OpenWaitableTimer | CloseHandle |
Update resource | BeginUpdateResource | EndUpdateResource |
Window station | GetProcessWindowStation | Applications cannot delete this object. |
翻译自:windows 官网 kernel Objects