none
ハードディスクの停止方法 RRS feed

  • 質問

  • ハードディスクの回転を停止させる方法(API?)を探しています。

    Windowsにハードディスクを指定時間アクセスがなかったら停止させる機能がありますが、

    この停止させる部分をプログラム(C++)で実現したいのです。

     

    自分で調べたら、回転しているかを確認する方法(GetDevicePowerState)はありました。

    肝心の停止させる方法はDeviceIoControlが怪しいと思ったのですが、

    IOCTL_・・・で該当するものが無かったので違うと思いました。

     

    回答よろしくお願いします^^

    2008年8月29日 9:14

回答

すべての返信

  • 電源関連ですが、これとか関係しますか?

    中身は試していないので何とも言えませんが。

    http://msdn.microsoft.com/en-us/library/aa373243(VS.85).aspx

     

    2008年8月29日 15:27
    モデレータ
  • 返事遅れてすいません。

     

    そのページにはコードが書かれているようですが、英語が読めないんで

    とりあえず実行してみることにしましたが、何も起きませんでしたorz

    DevicePowerSetDeviceStateという関数が答えに近いと思いましたが、

    説明が英語なのでどうなのかわかりませんでした^^

    説明:Modifies the specified data on the specified device.

     

    Power Management Functions(http://msdn.microsoft.com/en-us/library/aa373163(VS.85).aspx)

    も目を通しましたが、手がかりになるものは見つかりませんでした

    (英語が読めないから見落としていただけかも・・・・)。

     

    ちなみにDevicePowerSetDeviceStateはVista専用APIみたいです。

    OSのHDスリープ機能は少なくともWindows 98の頃からあったと思うので、

    もしそうだとしたら別の関数だと思います。

    2008年8月31日 12:35
  • 実現したいと思っていることが、少数派の悩みである場合、英語の文献しかないことがあります。

    「英語を読めない」として諦めるのではなく、辞書片手にでも読む努力をするべきでしょう。

     

     SOLID SNAKE さんからの引用

    ちなみにDevicePowerSetDeviceStateはVista専用APIみたいです。

    OSのHDスリープ機能は少なくともWindows 98の頃からあったと思うので、

    もしそうだとしたら別の関数だと思います。

    あったのかもしれません。

    それが公開関数なのか、非公開関数なのかは分かりません。

    (軽く調べた限りでは詳細を読み切れないと判断したため、調査していません)

     

    OSが実現しているから、アプリでもできるっていう考えはよくありません。

    ユーザ向けに公開されていないインターフェースを使って実現している可能性もあります。

    今回の場合がそうとは言いませんが、「ある」と決めつけるのは痛手を見ることもあります。

    2008年8月31日 13:46
    モデレータ
  • >「英語を読めない」として諦めるのではなく、辞書片手にでも読む努力をするべきでしょう。

    全くごもっともでございます。

    英語は読めないというより苦手というべきだったでしょうか・・・

     

    結局訳は(たぶん)分りましたが、やはり目的のものではありませんでした。

    DevicePowerSetDeviceStateは「このデバイスで、コンピュータのスタンバイ状態を解除できるようにする」

    を設定するものでした。

     

    >OSが実現しているから、アプリでもできるっていう考えはよくありません。

    >ユーザ向けに公開されていないインターフェースを使って実現している可能性もあります。

    >今回の場合がそうとは言いませんが、「ある」と決めつけるのは痛手を見ることもあります。

    そうだったんですか。肝に銘じておきます。

     

    2008年9月2日 15:57
  • 取り敢えずの思い付きなのですが、DeviceIoControl で IOCTL_ATA_PASS_THROUGH を使って、ATAコマンドの Sleep を送り込んでみる、というのは如何でしょうか?

    相手が SCSI でしたら、IOCTL_SCSI_PASS_THROUGH になるのかもしれません。

     

     

    2008年9月3日 5:12
  • こんにちは。中川俊輔 です。

     

    Azuleanさん、Takashi SAKAMOTOさん、回答ありがとうございます。

     

    SOLID SNAKEさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、

    Azuleanさん、Takashi SAKAMOTOさんの回答へ回答済みチェックをつけさせていただきました。

     

    Takashi SAKAMOTOさんの書いておられる通りに、コントローラーに直接コマンドを送ればHDDを制御できるかもしれませんが、OSの電源管理と競合したり、データー消失の可能性等があるので、私としては自作プログラムからHDDを制御するのはお勧めできません。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    SOLID SNAKEさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2008年9月25日 8:17