内核对象

来源:互联网 发布:淘宝搜索优化 编辑:程序博客网 时间:2024/04/30 05:14

       内核对象的数据结构只能被操作系统内核访问, 用户在编写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.复制对象句柄.

具体请参考进程间共享内核对象...

原创粉丝点击