9X处理文件时不要试图切换到其他RING3进程/线程
 

作者:陆麟
转载请征得作者同意.
2002.2.4



尽管我在51.不可能同步的RING0->RING3调用 经典之作 2001.6.29中告诉大家在FILE IO中等待其他RING3进程/线程是不行的. 但是仍然有人发出疑问. 我感到很意外. 那么多人认为自己懂得APC/BlockOnId就可以处理十分复杂的文件操作...
IFSMgr_Block是通过对lockOnID调用实现的. 但是IFSMgr_Block不能停止KERNEL32的死锁.
我再度详细解释几个概念. 这是可以影响到OS全局运作的东西.
首先, 有个叫作Win16Mutex的互斥量. 它的作用是保护WIN16代码不被重入. 因为WIN9X的内核有30%以上是从WIN3.X移植来的. 而WIN3.X很多代码是不可重入的. 每当一个全局的数据会被更改前, Win16Mutex会被占有. 其他尝试占有Win16Mutex的代码将被堵在门外.
其次, 有个叫做Kernel32Mutex的互斥量. 它的作用是保护 KERNEL32的全局变量不被破坏. 在很多KERNEL32的API调用中, 能够发现尝试占有Kernel32Mutex的代码片断. 这些代码片断将阻止WIN32线程被执行起来.
现在, 当文件IO操作进行时, 这2个互斥量会被占有.  当我确认这点时. 我没有用IFSHOOK才测试. 我拦截了CREATEFILE等API. 结果只要一有EVENT触发, 几乎死机就无法避免. 这证实了即使是RING3进行此类尝试, 也会失败. 靠!