天天看点

《解读window核心编程》 之 内核对象

1.         简单区分内核对象和其他对象的​​方法​​​:创建需要​​安全​​信息的多半是内核对象。

2.         每个进程有一个内核对象表,表的每一项是一个简单结构,包括真实内核对象地址和​​访问权限​​​等。​​用户​​​代码持有的内核对象句柄其实是对象表中对应项的​​索引​​​。因此如果Cl​​os​​​eHandle关闭一个对象后没有清空变量,且在对象表的同样位置恰好又创建了一个新的内核对象,对之前没清空的无效变量的​​访问​​会造成bug。(比如对同一个句柄多调用了一次CloseHandle导致另一个内核对象被关闭。)

3.         进程退出时,会释放各种​​内存​​、内核对象、GDI对象等。

4.         跨进程使用内核对象的理由:跨进程传输:用文件映像对象实现​​共享​​​内存、邮件槽和命名管道实现​​数据​​​​通信​​​、信号量和互斥量进行​​同步​​等。

5.         跨进程使用内核对象的三种方式:对象句柄继承、命名内核对象、复制对象句柄。

6.         对象句柄继承:创建内核对象的时候​​可以​​​指定​​SEC​​​UR​​IT​​​Y_ATTRIBUTES. bInheritHandle表示可继承(​​任何​​​时候可以使用SetHandleInformation​​修改​​​可继承性等属性),创建子进程时指定Create​​Pr​​​ocess的参数bInheritHandles为TRUE,则子进程从父进程的对象表中拷贝所有可继承的对象到自己的对象表的相同表位置中(并增加引用计数),因为表项结构被完全拷贝且内核对象实际地址在地址​​空间​​​后​​2G​​的内核地址段中,所以拷贝过来的表项完全有效,进而父子进程的可继承内核对象的句柄值完全相同,于是只要以任何方式将要继承的对象的句柄值跨进程交给子进程(创建子进程时的命令行参数、环境变量、共享内存、消息等手段),则后者可以使用。

继续阅读