内核对象的数据结构只能被操作系统内核访问, 用户在编写Win32应用程序的不时的需要创建,打开和操纵内核对象. 内核对象有以下几种:
Event objects 事件对象
File-mapping objects 文件映射对象
File objects 文件对象
Mailslot objects 邮件槽对象
Mutex objects 互斥对象
Pipe objects 管道对象
Process objects 进程对象
Semaphore objects 信号量对象
Thread objects 线程对象
这些内核对象都可以有函数HANDLE Creat*(....)实现. 由于内核对象只能由内核控制,因此内核对象的释放工作由内核来完成. 内核对象都拥有一个数据成员----计数器. 在内核对象被创建时,计数器被设置为1,每增加一次引用计数器加1,每减少一次引用,计数器减1.当该计数器为0时, 将由系统释放该内核对象.
住:关闭内核对象的方法为: BOOL CloseHandle(HANDLE hObj)
内核对象能被一个安全描述来保护. 安全描述确定该内核对象的使用权利. 在创建内核对象的时候可以传入安全面熟参数. 安全描述的结构如下:
typedef struct _SECURITY_ATTRIBUTES{
DWORD nLENGTH;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
}
成员变量lpSecurityDescriptor用于安全miaoshu, 成员变量bInheritHandle控制对象句柄的继承.
有如下:
HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ,FALSE,"MyFileMapping");
这个函数的最后一个参数是内核对象名(命名内核对象). 在返回有效的句柄前,将检查该命名内核对象的安全描述.如果没有读权限,将返回错误代码5ERROR_ACCESS_DENIED.
进程内核对象句柄表: 每个进程创建的时候都分配一个句柄表,记录内核对象. 进程内部各线程共享内核对象,他们之间传递参数即是该句柄表的索引. 特别注意创建内核对象失败的时候,将返回NULL, 除了CreatFile之外. 只有CreatFile创建失败的时候会返回-1(INVALID_HANDLE_VALUE).
进程间共享内核对象有三种方式:
1.对象句柄继承
2.命名对象.
3.复制对象句柄.
具体请参考进程间共享内核对象...