Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。
7年前关闭。
Improve this question
我的磁盘上有一个用FAT32格式化的单独分区。当我休眠Windows时,我希望能够加载另一个OS,创建/修改该分区上的文件,然后使Windows退出休眠状态并能够查看所做的更改。
我知道您要输入的内容是:“嗯,您不应该这样做!”然后将我链接到一些有关我试图做的事情的规范是错误的/不可能的/要破坏一切的。但是,我敢肯定,有一些方法可以解决这个问题。 :)
我不需要Windows中的FAT32分区,除非要读取在那里写的文件,然后就可以了-因此,无论解决方案是什么,在一段时间内完全无法访问磁盘是可以接受的。不幸的是,我无法使整个物理磁盘脱机,因为它只是Windows安装所在的同一物理设备的一个分区-只是该分区。
这些是我到目前为止尝试过的东西...
Google吧。我至少得到一个“这将永远不会发生”的答案。不能接受! :) 休眠之前先卸载磁盘。退出休眠状态后挂载。这似乎没有效果。 Windows仍然认为FAT与以前相同,因此我写入磁盘的所有数据都会丢失,并且我调整大小的所有文件都会损坏。如果有任何文件被缓存,那就更糟了。 使用DeviceIoControl调用IOCTL_DISK_UPDATE_PROPERTIES尝试刷新磁盘(但分区表未更改,因此实际上没有任何作用)。
有什么方法可以使磁盘/卷读取缓存无效,从而迫使Windows返回到磁盘吗?
我考虑过使用libfat打开分区并直接进行读/写操作,并绕过缓存,否则有些过头了。
OnResume>
希望这可以帮助将来的其他人:)
想改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。
7年前关闭。
Improve this question
我的磁盘上有一个用FAT32格式化的单独分区。当我休眠Windows时,我希望能够加载另一个OS,创建/修改该分区上的文件,然后使Windows退出休眠状态并能够查看所做的更改。
我知道您要输入的内容是:“嗯,您不应该这样做!”然后将我链接到一些有关我试图做的事情的规范是错误的/不可能的/要破坏一切的。但是,我敢肯定,有一些方法可以解决这个问题。 :)
我不需要Windows中的FAT32分区,除非要读取在那里写的文件,然后就可以了-因此,无论解决方案是什么,在一段时间内完全无法访问磁盘是可以接受的。不幸的是,我无法使整个物理磁盘脱机,因为它只是Windows安装所在的同一物理设备的一个分区-只是该分区。
这些是我到目前为止尝试过的东西...
有什么方法可以使磁盘/卷读取缓存无效,从而迫使Windows返回到磁盘吗?
我考虑过使用libfat打开分区并直接进行读/写操作,并绕过缓存,否则有些过头了。
最佳答案
所以我终于找到了解决我问题的方法。在我看来,我将Mount Point与Mount关联了。这些不是一回事。删除所有卷安装点并不会卸载该卷。它仍然已安装,但从某种意义上说您没有可以在资源管理器中访问的路径。
This is the article开始了这一切。
它还表明,搜索实际问题而不是感知到的问题可以有很大帮助!
因此,有两种解决方案,一种是在紧密的循环中不断调用NtSetSystemInformation(),以在系统进入休眠状态时将“SYSTEMCACHEINFORMATION”属性设置为实质上为空/清除缓存。然后,当您出来时停止循环。在我看来,这似乎会影响系统性能。所以我丢弃了它。
但是,更好的是,此MSDN文章中提出的针对稍有不同的问题的推荐解决方案,该解决方案为解决该问题提供了更好的指导:Dismounting Volumes in a Hibernate Once/Resume Many Configuration
现在,我有了一项服务,该服务将刷新写缓存,然后在系统进入休眠/ sleep 状态时锁定并卸载该卷,并在卷出来后立即释放该卷的锁定。
这是一些代码。
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)
希望这可以帮助将来的其他人:)
关于windows - 强制窗口刷新磁盘FAT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/231870/