Meh*_*dad 20 winapi hard-drive
你如何要求Windows以编程方式关闭硬盘?我可以调用任何用户模式函数(或调用内核模式函数或发送IRP)以实现此目的吗?
我已经尝试制作一个程序将ATA STANDBY命令直接发送到硬盘,但问题是这个方法没有通知系统,因此每当系统需要刷新缓存时,它就会唤醒再次硬盘.我如何告诉系统为我这样做?(如果系统这样做,它将保存缓存并在数据变得过大时"突然"发送数据,而不是以较小的增量写入.)
(这里的全部内容是直接执行此操作,而不是将系统范围的降速超时更改为1秒的时间并等待磁盘降速.我需要一个我可以在特定时刻调用的函数当我使用我的笔记本电脑时,不是通用的,不适合95%的情况.)
到目前为止我走了多远:
我觉得PoCallDriver和IRP_MJ_POWER可能对此有用,但我的内核模式编程经验非常有限(并且几乎没有驱动程序经验)所以我真的不知道.
更新:
人们似乎一再提到我已经提到的解决方案不起作用.就像我上面说的,我已经尝试过 "哈克"的解决方案,更改超时值或直接发出驱动命令,以及整个原因我已经在这里问这个问题的是,那些没有没有做什么,我需要.请仔细阅读整个问题(尤其是第2和第3段),然后再重复我在答案中所说的内容 - 这就是问题的全部难点.
更多信息:
我发现这个关于磁盘空闲检测的文档很有用,但我的答案不在那里.它声明Power Manager将IRP发送到磁盘驱动程序(因此我怀疑IRP_MJ_POWER它有用),但我不知道如何使用这些信息.
我希望这有帮助:
这:http://msdn.microsoft.com/en-us/library/aa394173%28VS.85%29.aspx
导致这一点:http: //msdn.microsoft.com/en-us/library/aa394132%28VS.85%29.aspx#properties
然后,您可以浏览到这个:http: //msdn.microsoft.com/en-us/library/aa393485(v = VS.85).aspx
本文档似乎概述了您的想法.
PS只是想帮助,不要射击消息.
虽然没有明显的方法来执行您所要求的操作(即告诉电源管理“就像用于旋转磁盘的计时器已过期一样”),但可能有几种方法可以模拟它:
在驱动器上调用FlushFileBuffers(您需要提升到 open \\.\C),然后STANDBY向驱动器发出命令。
进行 API 调用,将磁盘旋转超时设置为 1 秒,然后在 1 秒后将其恢复到之前的值。请注意,您可能需要增加到之前的值,而不是立即跳转到该值。
| 归档时间: | 
 | 
| 查看次数: | 12188 次 | 
| 最近记录: |