WINDOWS核心编程之什么是内核对象(二)

原创 2004年07月06日 20:48:00

2004年7月6日   20点20分

 

书接上回

 

1.进程的内核对象句柄表

当一个进程被初始化时,系统要为它分配一个句柄表.该句柄表只用于内核对象不用于用户对象或GDI对象.句柄表它只是个数据结构的数组,每个结构都包含一个指向内核对象的指针,一个访问屏蔽和一些标志.

 

句柄表如图如示

索引

内核对象内存块的指针

访问屏蔽(标志位的DWORD)

标志

1

0x????????

0x????????

0x????????

2

0x????????

0x????????

0x????????

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

当进程第一次被初始化时,它的句柄表是空的,当进程中的线程调用创建内核对象的函数时,内核就为该对象分配一个内存块,并对它初始化。初始化的过程是,内核对进程的句柄表扫描,找一个空项。然后初始化内核对象内存块的指针,访问屏蔽,标志。

 

2.创建内核对象

创建内核对象的函数例如

HANDLE CreateThread(…..)

HANDLE CreateFile(……)

HANDLE CreateFileMapping(……)

HANDLE CreateSemaphore(…….)

这些创建内核对象返回的句柄是放入进程的句柄表中的索引,其用于标识内核对象的信息存入的位置., win2000中返回的值用于标识放入进程的句柄表的该对象的字节数,而不是索引号.

 

3.关闭内核对象

BOOL CloseHandle(HANDLE hobj)

此函数首先检查调用进程的句柄表,以确保传递给经的索引用标识一个进程,如果该索引是有效的,那么系统就可以获得内核对象的数据结构的地址,计数等,它会清除进程的句柄表中的项,此时该句柄对你的进程就无效了。如果计数为0,该内核便从内存中撤消该内核对象,如果不为0,也会执行closeahandle操作,计数减1,标识着系统中还有别的进程对此对象进行访问,当其它进程停止使用该对象时(也就是也执行了closehandle操作),该对象将被撤消。

 

Q:如果没有调用CloseHandle函数, 会不会出现内存泄漏呢?

A:这是可能的,当进程终止运行了,系统会自动扫描进程的句柄表,如果在终止进程运行前没有关闭对象,系统将关闭这些对象句柄,如果对象的使用计数为0, 内核便撤消该对象,但如果不为0, 那么就会出现内存泄漏。

 

4.跨越进程边界共享内核对象

这就是说,在不同进程中运行的线程需要共享内核对象.

比如

1:文件映射  在同一台机器上运行的两个进程之间共享数据块

2.管道使得应用程序能够在连风的不同机器上运行的进程之间发送数据块

3.互斥对象,事件使得不同进程中的线程能够同步它们的连续运行,就像一个程序在完成某项任务时需要将情况通知另一个应用程序的情况相同.

 

前一断时间由于工作比较忙,没有来得及更新,请大家见谅

上面只简单的介绍的一些进程的相关知识,后续将详细介绍.(待续)

Windows核心编程之线程内幕

1.线程内核对象(操作系统接口CreateThread内部实现) 2.线程数据块_tiddata(C/C++运行时库的实现 _beginthreadex与_beginthread) 3.线程结束_...
  • supreme_24
  • supreme_24
  • 2016年04月27日 21:21
  • 298

[转载]Windows Hook 易核心编程<2>远程线程注入 下

现在主程序已经完成了它的任务,现在来看看我们执行的核心,HookDLL.dll的代码: .版本 2 .全局变量 TheNodeP, 整数型 .全局变量 hhook, 整数型, 公开 ...
  • ywbhnay
  • ywbhnay
  • 2016年04月27日 17:42
  • 205

Windows核心编程:(一)内核对象

一:何为内核对象       每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员维护着与对象相关的信息。 二:使用计数 ...
  • Windows_and_Linux
  • Windows_and_Linux
  • 2015年03月11日 11:13
  • 426

Windows核心编程之3 内核对象

3 内核对象 3.1 哪些是Windows的内核对象 3.1.1 使用计数 3.1.2 内核对象的安全性 3.2 进程内核对象句柄表 3.3 跨进程边界共享内核对象...
  • woleiwei
  • woleiwei
  • 2013年08月09日 15:58
  • 790

java编程之美(一)

实践编程已经有足足6年多时间,也算是有一定经验,经常在工作中遇到各种让人不爽的代码编写方式,今天忍不住要来唠叨下。 为什么叫编程之美? 在我看来,代码有丑陋难看和赏心悦目两类,当然还有介于两者之...
  • tang9140
  • tang9140
  • 2015年11月01日 18:28
  • 1028

windows编程之多线程总结

用于线程互斥的方法有:原子锁,关键区域(CriticalSection)。 用于线程同步的方法有:事件(Event),互斥量(Mutex),信号量(Semaphore),定时器(这里我们不谈)。   ...
  • keep_moving_cqu
  • keep_moving_cqu
  • 2013年08月25日 02:19
  • 1247

编程之美之扩展问题

参考链接:http://blog.csdn.net/wuyuegb2312/article/details/9896831 1.1 让CPU占用率曲线听你指挥 参考: http://blog.csd...
  • jerryzcx
  • jerryzcx
  • 2014年03月06日 23:33
  • 2515

[编程之美-10]面试当中的智力题(不定期更新)

[版权说明]  编程之美系列算法题集参考:  左程云 著《程序员代码面试指南IT名企算法与数据结构题目最优解》  July 著《编程之法面试和算法心得》  何海涛 著《剑指offer》  微软编程之美...
  • caicaiatnbu
  • caicaiatnbu
  • 2017年06月07日 23:44
  • 382

2014-04-19编程之美初赛题目及答案解析

第一题: 描述 一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。 在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距...
  • kunlong0909
  • kunlong0909
  • 2014年04月19日 16:44
  • 4453

Java实现昵图网摄影图片爬虫

使用Java编程,利用Java的爬虫技术获取爬去昵图网上的图片,并按目录储存下来。...
  • Birldlee
  • Birldlee
  • 2017年12月26日 19:33
  • 80
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WINDOWS核心编程之什么是内核对象(二)
举报原因:
原因补充:

(最多只允许输入30个字)