分享

Windows核心编程(第五版)笔记 第三章 内核对象(Kernel Objects)

 fssky 2011-09-06

第三章   内核对象(Kernel objects)

1.什么是内核对象

内核对象是由内核分配的一块内存,它只能被内核访问。

这块内存存储着一个保存着内核对象信息的数据结构。

2.如何访问内核对象

应用程序不能直接访问内核对象,只能通过Windows API间接访问和操作内核对象。

那些用于操作内核对象的API会返回一个标识内核对象的句柄,应用程序通过该句柄和API函数来操作和访问内核对象。

3.内核对象的数据成员

既然内核对象是数据结构,那么它一定相应的数据成员。

1     引用计数:

  它用来记录有多少个应用程序在使用该内核对象,它该值为0时系统会销毁该内核对象。

   内核对象是由内核所有,换句话说即使创建内核对象的进程已经结束了,所创建的内核对象仍可能存在。

 

2    安全:

  它用来描述谁拥有这个对象(通常是创建者),以及哪些用户和组可以访问或不可访问该对象

  在操作对象前进程必须先提交操作请求,该请求能否成功是则“安全”来控制的。

      对象的创建都可以通过“安全”来阻止那些未授权的用户访问该对象。

3.判断一个对象是否是内核对象

判断一个对象是否是内核对象的最简单方法是查看创建该对象的函数

几乎所有的内核对象的创建函数都有一个 用于描述安全属性的“安全描述符”作为参数。如下:

HANDLE CreateFileMapping(

   HANDLE hFile,

   PSECURITY_ATTRIBUTES psa,

   DWORD flProtect,

   DWORD dwMaximumSizeHigh,

   DWORD dwMaximumSizeLow,

   PCTSTR pszName);

 

 

4.进程的句柄表(A Process' Kernel Object Handle Table)

进程在初始化后,系统会为它分配一个句柄表,记录它所用到的内核对象

Index

Pointer to Kernel Object Memory Block

Access Mask

(DWORD of Flag Bits)

Flags

1

0x????????

0x????????

0x????????

2

0x????????

0x????????

0x????????

 

句柄可能理解为上图中的Index,在进程句柄表中它相当于内核对象的指针的索引。

句柄是进程相关的不同的进程不能简单的传递句柄来共享内核对象,因为句柄它只是一个索引,它的值在不同进程中所索引的内核对象不同 所以不是简单的通过传递句柄来共享内核对象。

 

5.关闭内核对象

无论你是不是你创建的内核对象,当你使用完该对象后都应该通过CloseHandle来关闭内核对象

 

BOOL CloseHandle(HANDLE hobject);

Set handle to NULL after CloseHandle().

 

  CloseHandle 会对对象的引用计数减1 然后清空进程句柄表中相应的项。

  当引用计数减到0时系统会销毁该内核对象。

6.不关闭内核对象?

如果不关闭内核对象则内核对象的引用计数不会减少,也就不会被系统销毁,从而会产生内存泄露。

幸好当程序结束后系统会保证释放程序所占用的所有资源,系统遍历当前进程的句柄表,然后对句柄表中的逐个项调用CloseHandle

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多