win32相关(句柄表)
句柄表
什么是内核对象
常见的内核对象类型
对象类型 | Windows示例 | Linux对应概念 |
---|---|---|
进程对象 | EPROCESS | task_struct |
线程对象 | ETHREAD | task_struct |
文件对象 | FILE_OBJECT | file结构体 |
事件对象 | KEVENT | eventfd |
互斥体 | KMUTEX | mutex |
信号量 | KSEMAPHORE | semaphore |
共享内存 | SECTION_OBJECT | shm相关结构 |
每创建一个内核对象,都会在内核层创建一个对应的内核结构体
如何管理内核对象
由于我们是在内核层创建的内核结构体,当我们需要使用到内核结构体中的数据时,操作系统是不允许我们直接访问内核地址空间的
通过句柄表来解决问题
只要想对内核对象进行操作,都必须要通过句柄来进行访问
多个进程共享一个内核对象
通过OpenProcess可以打开一个别人已经创建好的对象
注:有一个内核结构体是特殊的,那就是线程结构体对象,如果要把线程内核结构体杀死,首先需要关闭这个线程,然后对应的线程内核记数器为0
句柄是否可以被继承
这种方式同样也可以实现多个进程共享一个内核对象
在上面的句柄表中,还有一个参数,表示该内核结构体是否可以被继承,设置为可被继承后,继承的内核对象也可以访问它的内核结构体
子进程继承父进程的句柄表的关系
只有当父进程中创建的内核对象设置为可被继承时,子进程再去继承父进程时,才能看到被设置为可被继承的内核结构体
总结:两种共享内核的解决方案(1.OpenProcess打开一个进程,2.父进程中创建子进程,并设置为允许继承)