我的磁盘上有一个单独的分区,格式化为FAT32.当我休眠窗口时,我希望能够加载另一个操作系统,创建/修改该分区上的文件,然后使Windows退出休眠状态,并能够看到我所做的更改.
我知道你要打字的是什么,"好吧,你不应该这样做!" 然后把我链接到一些关于我正在尝试做什么是错误/不可能/打破一切的规范.但是,我确信有一些方法可以解决这个问题.:)
我不需要在Windows中使用FAT32分区,除了读取那里写的文件,然后我就完成了 - 所以不管解决方案是什么,磁盘在一段时间内完全无法访问是可以接受的.不幸的是,我无法使整个物理磁盘脱机,因为它只是安装Windows的同一物理设备的分区 - 只是分区.
这些是我到目前为止尝试过的东西......
谷歌一下.我得到了至少一个"这永远不会发生"的答案.不能的!:)
在休眠之前卸载磁盘.从冬眠中出来后装载.这似乎没有效果.Windows仍然认为FAT与以前一样,所以我写入磁盘的任何数据都会丢失,而且我调整大小的文件都已损坏.如果任何文件被缓存,那就更糟了.
使用DeviceIoControl来调用IOCTL_DISK_UPDATE_PROPERTIES来尝试刷新磁盘(但是分区表没有改变,所以这并没有真正做任何事情).
有没有办法使磁盘/卷读取缓存无效以强制窗口返回磁盘?
我想通过使用libfat直接打开分区和读/写并绕过缓存或者某些东西是矫枉过正的.
所以我终于找到了解决问题的方法.在我看来,我将Mount Point与Mount相关联.这些不是一回事.删除所有卷装入点不会使卷卸载.它仍然安装但不是你有一个可以在资源管理器中访问的路径.
这是开始这一切的文章.它还表明,搜索您的确切问题,而不是感知问题可以帮助很多!
所以有几个解决方案,一个是在紧密循环中不断调用NtSetSystemInformation()来设置"SYSTEMCACHEINFORMATION"属性,以便在系统进入休眠状态时基本上清空/清除缓存.然后在你出来时停止循环.对我来说,这似乎可能会影响系统性能.所以我放弃了它.
更好的是,这是MSDN文章中提出的稍微不同的问题的推荐解决方案,它提供了更好的解决问题的方法:在Hibernate中卸载卷一次/恢复许多配置
现在我有一个服务,它将刷新写缓存,然后在系统进入休眠/休眠状态时锁定和卸载卷,并在它出现时立即释放卷上的锁.
这是一些代码.OnHibernate>
volumeHandle = CreateFile(volumePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); FlushFileBuffers( volumeHandle ); DeviceIoControl( volumeHandle, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, &cbReturned, NULL ) ; DeviceIoControl( volumeHandle, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &cbReturned, NULL ); //Keep the handle open here. //System hibernates.
的onResume>
DeviceIoControl( volumeHandle, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &cbReturned, NULL ) CloseHandle(volumeHandle)
希望这有助于其他人在将来:)