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)

那么我们如何判断一个对象是否为内核对象呢?

可以通过查看创建该对象的函数,是否有限定安全的函数,毕竟是内核对象嘛

猜你喜欢

转载自www.cnblogs.com/pppyyyzzz/p/12891235.html