Windows Vista RTM BUG?
今天同事反映,我们内部开发的自动化测试平台的一个案例驱动模块在 Windows Vista RTM 机器上发生了一个奇怪的现象,同样的代码在其他的Windows 2000、XP、Server 2003、Vista SP1 上面均工作正常,但是在 Vista RTM 系统上面没法工作。
问题现象是:
- 我们首先使用 CreateDirectory API 创建一个目录
- 然后对这个目录使用 FSCTL_GET_COMPRESSION 控制码设置NTFS压缩属性
- 然后在这个目录下面建立子目录
- 由于父目录已经设置了压缩属性,因此子目录也继承了压缩属性
- 对子目录使用 FSCTL_GET_COMPRESSION 控制码取消NTFS压缩属性
- 结果发现在 Windows Vista RTM 机器上面取消子目录 NTFS 压缩属性的时候 DeviceIoControl API 返回成功,但是实际结果是没有被解除压缩属性。
我把这段代码抠出来写了一个小程序,在下面的操作系统上均进行了试验:
- Windows 2000 SP4
- Windows XP SP1
- Windows XP SP2
- Windows XP SP3
- Windows Server 2003 SP1
- Windows Server 2003 SP2
- Windows Vista RTM
- Windows Vista SP1
发现只有 Windows Vista RTM 系统有这个现象,其他系统均是正常的。而且发现,如果设置压缩属性完成以后,把进程退出,然后再启动一个新的进程用于取消压缩属性,也可以达到预期的效果。但是如果操作是在同一个进程里面,那么问题就肯定出现。
鉴于只有Windows Vista RTM 有这个现象,难道是 Windows Vista RTM 的 BUG?
备注:
- Windows Vista 已经关闭了UAC
- 系统是一个干净系统,没有安装任何的第三方软件
- 登录帐户隶属于 Administrators 组,且机器没有加入域
- 使用资源管理器做同样操作没有这个现象
由于 Microsoft 没有公布非常详细的 Windows Vista SP1 Changes Log,因此我只能猜测是 Windows 的 BUG 了。但是为啥资源管理器不受影响呢?抽空debug一下看看,也许就知道具体原因了。
最后,还是强烈建议升级到 Windows Vista SP1,不仅仅是改善了性能,在兼容性方面也有很多修正和改善。