1. 什么是内核对象?
像进程,线程,文件,互斥体,事件等在内核都有一个对应的结构体,这些结构体由内核负责管理。我们管这样的对象叫做内核对象。
2. 如何管理内核对象?
通过一个叫 "句柄" 的东西
3. 每个进程都有一个句柄表
不是每个内核对象都有句柄表,只有进程内核对象才有句柄表,即句柄表是进程内核对象中的一个成员
4. 多进程共享一个内核对象
句柄表是一个私有的值,句柄只有在本进程中才有意义
CloseHandle 使内核对象的引用计数 - 1,一般情况下引用计数为0了,没有任何指针指向它,这个内核对象就会被移除
但是 进程内核对象和线程内核对象是特例,只有关闭所有的线程句柄和终止掉线程两个条件同时满足的时候,这个线程内核对象才会被移除
5. 句柄是否可以被继承
在创建一个内核对象的时候,一定会有一个参数
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle; //该内核对象是否可以被继承
} SECURITY_ATTRIBUTES,
6. 进程是否能够继承父进程的句柄
当用CreateProcess创建进程的时候,第5个参数bInheritHandles如果设置为TRUE,那么父进程句柄表中可以被继承的内核对象句柄就会被继承过去,具体继承方式如上图所示,就是将整个句柄表复制过去,不能继承的填充0,这样的话,在子进程中的句柄值可以与父进程一模一样