Windows Kernel Objects


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 objectCreator functionDestroyer function
Access tokenCreateRestrictedTokenDuplicateTokenDuplicateTokenEx,OpenProcessTokenOpenThreadTokenCloseHandle
Change notificationFindFirstChangeNotificationFindCloseChangeNotification
Communications deviceCreateFileCloseHandle
Console inputCreateFile, with CONIN$CloseHandle
Console screen bufferCreateFile, with CONOUT$CloseHandle
DesktopGetThreadDesktopApplications cannot delete this object.
EventCreateEventCreateEventExOpenEventCloseHandle
Event logOpenEventLogRegisterEventSourceOpenBackupEventLogCloseEventLog
FileCreateFileCloseHandleDeleteFile
File mappingCreateFileMappingOpenFileMappingCloseHandle
Find fileFindFirstFileFindClose
HeapHeapCreateHeapDestroy
I/O completion portCreateIoCompletionPortCloseHandle
JobCreateJobObjectCloseHandle
MailslotCreateMailslotCloseHandle
Memory resource notificationCreateMemoryResourceNotificationCloseHandle
ModuleLoadLibraryGetModuleHandleFreeLibrary
MutexCreateMutexCreateMutexExOpenMutexCloseHandle
PipeCreateNamedPipeCreatePipeCloseHandle,DisconnectNamedPipe
ProcessCreateProcessOpenProcessGetCurrentProcessCloseHandle,TerminateProcess
SemaphoreCreateSemaphoreCreateSemaphoreExOpenSemaphoreCloseHandle
Socketsocketacceptclosesocket
ThreadCreateThreadCreateRemoteThreadGetCurrentThreadCloseHandle,TerminateThread
TimerCreateWaitableTimerCreateWaitableTimerExOpenWaitableTimerCloseHandle
Update resourceBeginUpdateResourceEndUpdateResource
Window stationGetProcessWindowStationApplications cannot delete this object.
翻译自:windows 官网 kernel Objects




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值