《Windows核心编程》笔记

0x00 进程:

日期:2019年11月13日

一个进程是一个“内核对象”,Windows编程实际上是一种面向对象的编程,总共有三种对象,内核对象(进程对象,线程对象,文件内存映射对象等)、用户对象(菜单,窗口等)、GDI对象(字体,光标等)(图形设备接口对象)。内核对象归操作系统内核所有。对于每一个内核对象,操作系统内核都会对其有一个“使用计数”。同一个内核对象,被不同进程使用一次,就增加一次使用计数。当一个内核对象的使用计数为0时,这个内核对象就会被操作系统内核销毁。

通俗地说,进程只具有内核对象的"使用权",他可以为内核创建一个内核对象,然后拥有这个内核对象的使用权,也可以选择调用CloseHandle(句柄),来停止使用某一个内核对象,也就是将一个内核对象从自己的句柄表中删除。内核对象的使用计数减一。句柄表中多出来一个空白项。

每一个进程中都会有一个"句柄表",进程中每创建一个内核对象,就会为内核对象分配一块内存,然后将内存块的地址记录到句柄表的空白位置。然后将空白位置的索引号返回(第几条记录)。这个索引号就是内核对象的句柄。因为每个进程都有自己的“句柄表”,所以,同一个内核对象在不同的进程中,不一定在句柄表中存储的位置相同,所以句柄不一定相同。但是ID一定相同的。相同的ID说明他们其实是同一个内核对象。(本质上是因为他们存在于同一个内存段)

不同的进程中怎么会有同一个内核对象呢?举个例子,比如说你在一个进程中又创建了一个子进程,并且这个子进程继承了父进程的某一个内核对象,父进程中该内核对象的句柄为3(句柄表第三条记录),而子进程中将该内核对象的内存地址记录到句柄表的第一条记录,那么在子进程中该内核对象的句柄号就为1。

进程不仅仅是一个内核对象,更通俗的讲,进程只是开了一段内存将程序代码生成的可执行文件 映射到了该内存段(文件内存映射)。但是进程是惰性的,他什么事都不会做。一个进程中必须至少有一个线程,线程从可执行文件的内存映射的某一个位置开始来执行这个可执行文件。
所谓应用程序实例句柄hInstance 就是进程实例句柄,就是操作系统给进程开的这段内存的首地址。

内核对象使用计数 其实等于记录了该内核对象的句柄表的数量。

如何区分内核对象 和 其他对象(用户对象、GDI对象),Createxxx函数中有安全属性参数的函数 创建的一定是一个内核对象,否则一定是 其他对象。

关于继承:

父进程有权决定子进程是否可以继承自己的内核对象,如果不能继承,那么全部不能继承。如果可以继承,那么只能继承父进程标记的允许继承的内核对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值