benny5609的专栏

人生,到世上走一遭,只不过是单纯的体验与学习认识,当我们在临死的时候,可以光荣地对自己说:"我已领略过"便不枉此生。...

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指明想将该标志设置成什么值
 
待续........
 
阅读更多
个人分类: Windows
上一篇WINDOWS核心编程之什么是内核对象(二)
下一篇WINDOWS核心编程之进程(一)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭