Window学习——内核对象(一)
使用计数
Windows的内核对象所拥有者是操作系统,而非进程。进程被销毁的时候,内核对象不一定会销毁。所以内核对象的生命周期可能长于创建它的那个进程。
操作系统内核知道当前有多少个进程正在使用一个特定的内核对象,因为每个对象都包含一个使用计数。使用计数是所有内核对象类型都有的一个数据成员。
内核对象的安全性
这个还挺重要的,看到后面很多函数都需要这个数据结构的接口。
内核对象可以用一个安全喵师傅(SID)来保护。
安全描述符描述了谁拥有对;哪些组合用户被允许访问或使用此对象;哪些组合用户被拒绝访问此对象。其通常在编写服务器应用程序的时候使用。
创建内核对象的所有函数几乎都有执行一个SECURITY_ATTRIBUTES结构的指针作为参数,例如:
//创建文件映射(其实从字面上的意思来说应该是在内存中创建一个文件对象)
HANDLE CreateFileMapping(
HANDLE hFile,
PSECURITY_ATTRIBUTES psa,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
PCTSTR pszName);
大多数应用程序把这个SID的参数设为NULL,这样内核对象就是默认的安全性,具体包括哪些安全性,要取决于进程的安全令牌(讲进程的时候,这个把我讲得很蒙蔽,其实就是权限的限制)
SID数据结构如下
typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle;//是否能继承 }SECURITY_ATTRIBUTES;
如果想访问一个现有的内核对象,就必须制定打算对此对象执行哪些操作,例如访问一个文件映射内核对象
OpenfileMapping( DWORD dwFlag,//访问的权限 bInheritHandle Long,//如这个函数返回的句柄能由当前进程启动的新进程继承,则这个参数为TRUE。
lpName String//指定要打开的文件映射对象名称。
该函数会返回一个有效句柄值,但如果被拒接访问就会返回NULL(可以通过GetLastError来获取错误原因)
假如一个应用程序在启动时要从一个注册表子项中读取一些数据。正确做法是调用RegOpenKeyEx,向其传入KEY_QUERY_VALUE,从而制定查询子项数据的权限(尽量不要用KEY_ALL_ACCESS)
那么我们如何判断一个对象是否为内核对象呢?
可以通过查看创建该对象的函数,是否有限定安全的函数,毕竟是内核对象嘛