- 主题
- 0
- 积分
- 0
- 贝壳
- 0 个
- 来自
- 云南曲靖
- 注册时间
- 2006-11-19
- 最后登录
- 2006-11-19
|
WINDOWS核心编程之什么是内核对象(三)
1.内核对象句柄的继承性
当父进程创建内核对象时,必须向系统指明,它希望对象的句柄是个可继承的句柄。父进程可以使用一个或多个内核对象句柄,并且该父进程可以决定生成一个子进程,为子进程赋予对父进程的内核对象的访问权。
注意啦:虽然内枋对象句柄具有继承性,但是内核对象本身不具有继承性.
2.创建能继承的句柄
父进程只要指定SECURITY_ATTRIBUTES 结构中的bInheritHandle为真, 然后将该结构的地址传递给特定的Create函数(创建内核对象的函数)
在内核对象句柄表中的标志,它就是用来指明该句柄是否具有继承性的。如果bInheritHandle为1,那么标志位就置为1,否则为0;
注意:对象句柄的继承性只有在生成子进程的时候才能使用,如果父进程准备创建带有可继承句柄的新内核对象,那么已经在运行的子进程将无法继承这些新句柄。
3.如何生成子进程
用CreateProcess(….)其中参数bInheritHandles设为TRUE, 那么子进程就可以继承父进程的可继承句柄值了。此时系统为子进程创建一个新的和空的句柄表,因为设定了bInheritHandle为TRUE,那么它要遍历父进程的句柄表,对于它找到的包含有效的可继承句柄的每个项目,系统会将该项目copy到子进程的句柄表。该项目copy到子进程的句柄表中的位置将与父进程的句柄平中的位置完全相同。也就是说父进程与子进程中,标识内核对象所使用的句柄值是相同的.另外,系统还要递增内核对象的使用计数,
注意:CreateProcess函数返回后,父进程可以立即关闭对象的句柄,而不影响子进程对该对象进行操作的能力。
4.改变句柄的状态
当父进程创建了一个内核对象,然后又生成了两个子进程,父进程只想让一个子进程来继承对象的句柄。若要改变内核对句柄的继承标志,可以调用SetHandleInformation函数
BOOL SetHandleInformation(HANDLE hObject, DWORD dwMask, DWORD dwFlags);
hObject参数标识一个有效的句柄, dwMask告诉该函数想要改变哪个或哪几个标志,可选择的有HANDLE_FLAG_INHERIT HANDLE_FLAG_PROTECT_FROM_CLOSE, dwFlags指明想将该标志设置成什么值
|
|