注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

从C开始

 
 
 

日志

 
 

《Windows核心编程》学习笔记(3)– 内核对象  

2010-10-10 13:05:07|  分类: 《Windows核心编 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3.1 什么是内核对象

 内核对象是内核分配的一段空间,如文件对象和进程对象等。可以用Windows提供的函数来创建相应的内核对象。创建成功后返回一个对象句柄,并且对象句柄值是进程相关的。程序不能直接操作内核对象,只能通过Windows提供的函数来控制。

3.1.1内核对象的使用计数

     内核对象可以被多个进程同时使用,句柄值通常会不一样,但是引用的内容是同一块。因此内核对象的存在时间通常会比进程的存在时间长。内核对象中有一个值用来保存当前使用该内核对象的进程数,这就是使用计数。这样可以确保在没有进程引用该对象时系统中不保留任何内核对象。

3.1.2安全性

     内核对象提供了安全描述符来限制操作权限,如文件映射内核对象的函数

     HANDLE CreateFileMapping(

        HANDLE hFile,

        PSECURITY_ATTRIBUTES psa,

        DWORD flProtect,

        DWORD dwMaximumSizeHigh,

        DWORD dwMaximumSizeLow,

        PCTSTR pszName);

   参数psa就是来控制访问权限的。当访问一个现有的文件映射内核对象时需要设定要对对象执行什么操作,如: HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ, FALSE, "MyFileMapping"),其中FILE_MAP_READ说明是对内核对象执行读操作,"MyFileMapping"是内核对象的名字。

   注:我们可以通过对象的创建函数中是否有安全描述符来区分是内核对象还是一般的用户对象。

3.2 进程的内核对象句柄表

3.2.1创建内核对象

   当进程创建时,它会创建一个句柄表,用于存储内核对象的信息。当生成一个内核对象时,系统会将内核对象的地址以及其他信息存入句柄表,并返回一个句柄。这个句柄是和内存相关的,即不同的进程访问同一个内核对象时,返回的句柄值是不同的。当访问内核对象时,可以通过句柄到句柄表中查找对应的内核地址。

注:当查看创建内核对象的函数返回值时,必须格外小心。特别要注意的是,当调用CreateFile函数失败时,返回值为INVALID_HANDLE_VALUE(值为-1)。其他的内核函数返回值为NULL。

3.2.2关闭内核对象

关闭内核对象可以调用函数BOOL CloseHandle(HANDLE hobj)。系统会先判断句柄是否有效,如果有效,再判断技术是否为0,如果是的话,就将从内存中撤销该内核对象。不管成功与否,都将从句柄表中删除该对象信息,该进程将不能再访问。如果忘记调用CloseHandle函数,进程运行时将有可能引起资源泄漏。但是内存终止时,系统浏览句柄表,并释放所有资源。

  评论这张
 
阅读(330)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018