3 内核对象
3.1
哪些是Windows的内核对象
比如:令牌对象,事件对象,文件对象,目录对象,文件映射对象,IO完成端口,互斥量,线程对象,进程对象,作业,管道,等等。
内核对象有操作系统管理,返回HANDLE 它是指针,指向一个由操作系统管理的内核对象表.
3.1.1 使用计数
操作系统知道内核对象的使用计数,当计数为0,由操作系统负责销毁内核对象.
3.1.2 内核对象的安全性
SECURITY_ATTRIBUTES 结构体来描述
3.2 进程内核对象句柄表
3.2.1 创建内核对象
创建一个内核对象,它是与进程相关的,就是说只能在创建的那个进程使用,其他进程不知道这个内核对象.
3.2.2 关闭内核对象
Closehandle 函数来关闭内核对象. 不关闭内核对象,会造成资源泄露。但是进程退出时,进程的所有资源都被操作系统收回。
3.3 跨进程边界共享内核对象
有三种不同的机制来允许进程共享内核对象:
1 使用对象句柄继承
2 为对象命名
3 复制对象
3.3.1 使用对象句柄继承
只有进程之间有父子关系时才可以使用对象句柄继承。
安全描述的结构体需要把继承的标志位置为true
然后通过CreateProcess完成
3.3.2 改变句柄的标志
SetHandleInformation来改变内核对象的继承句柄
GetHandleInformation来得到内核对象的是否继承
3.3.3 为内核对象命名
HANDLE CreateMutex(
PSECURITY_ATTRIBUTES psa,
BOOL bInitialOwner,
PCTSTR pszName);
最后一个接收“以0为终止符的字符串”所以的内核对象都使用一个名字空间,如果重名的话,内核对象创建失败.
如果有一个同名的内核对象,那么CreateXX函数返回 ERROR_INVALID_HANDLE
getlastError 返回ERROR_ALREADY_EXISTS 表示存在.
可以使用OpenXX来打开一个内核对象