Windows Vista IE 7保护模式开发者生存指南
2008-08-22 17:24:11 来源:WEB开发网这样,EXE就可在命令行中接收到IPC对象名,它接着会调用OpenFileMapping()来访问这个对象,另外,这个方法中,最重要的一点是要非常留意对象生命期。以下是使用句柄继承的步骤:
1、插件创建IPC对象,并置引用计数为1。
2、插件启动新进程,其继承了句柄。这个操作把对象引用计数增加为2。
3、插件能立即关闭它的句柄,因为它不再需要此对象。引用计数降为1。
4、新进程可通过IPC对象来进行所需的操作了。因为它拥有一个打开的句柄,对象直到新进程关闭句柄后才会结束。
如果依照上述步骤,且仅是把对象名传递给EXE,那么实际上是创建了一个“竞跑”状态,插件可能在EXE有机会打开句柄之前就把它关闭了(IPC对象也被删除了)。以下是修改后的步骤:
1、插件创建IPC对象,并置引用计数为1。
2、插件启动新进程,并传递给它IPC对象名。此时引用计数仍为1。
3、插件不能马上关闭它的句柄,它需要等待直到新进程已打开此对象的一个句柄。此时需要做一些同步。
4、新进程打开对象句柄并读取数据,此时,它可以发信号给插件以唤醒其线程,插件现在可以安全地关闭它的句柄了。
在示例程序中,我们让DemoApp在创建主窗口之前,先从共享内存中读取数据。插件在调用完CreateProcess()之后,接下来就可调用WaitForInputIdle(),这个函数使线程阻塞,直到DemoApp的主窗口创建并显示出来。一旦DemoApp线程处于空闲状态,它将不再使用共享内存,此时插件就可以安全地关闭其句柄了。
当点击“Run EXE 1”按钮时,程序把当前日期及时间写到共享内存中,并传递给DemoApp一个句柄,如果此时处于保护模式,这个方法将会失败,DemoApp会返回一个非法句柄错误;而点击“Run EXE 2”按钮时,将传递文件映射对象名给DemoApp,程序此时就会显示读取自共享内存的数据了。
更多精彩
赞助商链接