对内核对象的理解。
何为内核对象:
访问令牌对象,事件对象,文件对象,文件映射对象,I/O 完成端口对象,作业对象,邮件槽(mailslot)对象,互斥量对象(mutex),管道(pipe)对象,进程对象,信 号量(semaphore)对象,线程对象,可等待的计时器(waitable timer)对象,以及线程池工厂(thread pool worker factory)对象等。
我们可以利用 WinObj工具可以查看内核对像类型的类表。
内核对象用于管理进程线程和文件。
每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员维护者与对象相关的信息。
对于进程对象有一个进程ID,一个基本的优先级和一个退出代码;而文件对象有一个字节偏移量,一个共享模式和一个打开模式。
因为内核对象的数据结构只能有操作系统内核来访问,所以应用程序不能在内存中定位这些数据结构并直接更改内容。
为了让操作系统知道我们要对哪个内核对象进行操作,我们需要将这个句柄传给各种Windows函数。
介绍3中机制,来实现多个进程成功共享同一个内核对象。
1.使用计数.: 操作系统内核知道当前有多少个进程正在使用一个特定的内核对象。
2.内核对象的安全性
内核对象可以用一个安全描述符(Security descriptor, SD)来保护。 安全描述符描述了谁拥有对象; 哪些组和用户被允许访问或使用此对象。
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
如果想对我们创建的内核对象加以访问限制,就必须创建一个安全描述符。
初始化它
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof sa;
sa.lpSecurityDescriptor = &sd_wideopen;
sa.bInheritHable = FALSE;
HANDLE m_hMutexHandle = ::CreateMutex(& sa, FALSE, "7k7k_LH_FlashTips_2010-10-26");