对象的分类:

对象分为三种:用户对象、图形设备接口(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而销毁对象。而不是通过销毁对象来反过来关闭句柄。
  • 有些对象只能存在一个句柄指向它,有些对象可能有多个句柄指向它。

 

对象操作:

 

CloseHandle

Closes an open object handle.

CompareObjectHandles

Compares two object handles to determine if they refer to the same underlying kernel object.

DuplicateHandle


Duplicates an object handle.

GetHandleInformation

Retrieves certain properties of an object handle.

SetHandleInformation

Sets certain properties of an object handle.

 

区分内核对象的小窍门:

但凡需要指定 安全权限

 

工具:

​https://docs.microsoft.com/zh-cn/sysinternals/downloads/winobj​