对象的分类:
对象分为三种:用户对象、图形设备接口(GDI)对象、内核对象
三种对象的职责:
用户对象:为窗口管理提供支持
GDI图像设备接口对象:为图形展示提供支持
(!)内核对象:内存管理,进程执行,进程间通讯 三个主要用途
如果不做MFC相关编程,我们只需要关心内核对象。
所有细分的对象列表:
https://docs.microsoft.com/en-us/windows/win32/sysinfo/object-categories
对象管理:
windows 对象(内核对象、用户对象、GDI对象) 有标准的头部结构和与之类型对应的属性构成。正是因为有着较为统一的结构,故而windows系统可以很方便地统一管理这些对象。
头部中包含了当前对象的名称,正是有这个名称的存在,才让windows对象可以任意地在游离于各个进程间。
windows对象管理器有如下职责:
1)创建对象
2)验证某个进程是否可以访问某个对象
3)创建对象句柄,并反馈给调用者
4)维护引用计数器
5)提供复制句柄的能力
6)关闭句柄
windows提供如下操作对象的接口:
1)创建对象
2)获取一个指向对象的handle
3)获取对象的信息
4)设置对象的信息
5)关闭句柄
6)摧毁对象 (确定有直接摧毁对象的接口?不是通过指向对象的句柄引用计数管理的么?)
注:有些时候,当指向对象的所有handle都被关闭后(对象的引用计数为0),对象依旧可以存在于内存中。知道下一次被捕获时,系统告知用户当前对象已经被销毁,这个时候内核才会释放相应的内存。
- 句柄 和 内核对象都会消耗内存。因此句柄泄露就是内存泄露。句柄泄露的最常见现象就是系统占用内存居高不下。
- 进程退出时会释放所有的句柄和内核对象。但是线程退出时不会。
- 内核对象销毁时,所有绑定在其上的handle也会一并销毁。但是我们往往是通过closehandle让引用计数为0而销毁对象。而不是通过销毁对象来反过来关闭句柄。
- 有些对象只能存在一个句柄指向它,有些对象可能有多个句柄指向它。
对象操作:
Closes an open object handle. | |
Compares two object handles to determine if they refer to the same underlying kernel object. | |
Duplicates an object handle. | |
Retrieves certain properties of an object handle. | |
Sets certain properties of an object handle. |
区分内核对象的小窍门:
但凡需要指定 安全权限
工具:
https://docs.microsoft.com/zh-cn/sysinternals/downloads/winobj