5

Windows 内のディスクに対して raw IO を実行するプログラムがあります。

ターゲット ディスクがオンラインの場合、すべて正常に動作します。ただし、一部の Windows OS のデフォルトの動作では、新しいディスクが最初にオフラインになります。

Windows でこれを行うための正しい API を見つけるのに苦労しています。同等のコマンド ラインは次のようになります。

"select disk 2", "online disk" | diskpart

ただし、これをコードで実行できる必要があります。DeviceIoControl Win32 API (これは正しいと思います) を調べましたが、使用するコントロール コードを特定できません。見つからないという事実は、使用するより良い API を見逃しているのではないかと考えさせます。

4

4 に答える 4

4

将来の世代にとって、その答え(Win 2k3 / Vista以降)は仮想ディスクサービス(VDS)です。特に.NET内でCOMオブジェクトをあまり使用しない場合は、すべてをまとめる作業がいくつかあります。

ディスクのオンライン/オフラインは、IVdsDrive::SetStatusを使用して実行されます。少なくともそうすべきです。ディスクの読み取り専用ステータスを無効にするだけで問題を解決できることがわかりました。これは、適切なフラグ値を使用してIVdsDisk::SetFlagsで実行できました。

于 2011-09-24T11:04:09.257 に答える
2

C# についてはわかりませんが、C++ でこれを使用しています: で呼び出しDeviceIoControl()てみてくださいIOCTL_DISK_SET_DISK_ATTRIBUTES。ファイル ハンドルには、読み取りおよび書き込みアクセス権が必要です。少なくとも Windows 7 が必要だと思います。Windows 2003 x64 では動作しません。Windows 8 が正常にディスクをオフラインにすると、バックアップから書き直すことができます。

BOOL disk_offline(HANDLE h_file, bool enable){
DWORD bytes_returned = 0;
BOOL b_offline = 0;
if(get_size_volume_disk(h_file)){
    SET_DISK_ATTRIBUTES disk_attr;
    ZeroMemory(&disk_attr, sizeof(disk_attr));
    disk_attr.Version = sizeof(SET_DISK_ATTRIBUTES);
    disk_attr.Attributes = enable? DISK_ATTRIBUTE_OFFLINE: 0;
    disk_attr.AttributesMask = DISK_ATTRIBUTE_OFFLINE;
    b_offline = DeviceIoControl(h_file, IOCTL_DISK_SET_DISK_ATTRIBUTES, &disk_attr, disk_attr.Version, NULL, 0, &bytes_returned, NULL);
    // Invalidates the cached partition table and re-enumerates the device.
    if(!enable) BOOL b_update = DeviceIoControl(h_file, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &bytes_returned, NULL);
}
return b_offline;
}
于 2013-02-01T02:48:01.460 に答える
2

この質問には、DeviceIOControlメソッドを含む Windows API への便利なリンクがいくつかあります。

すべての列挙を調べた後、ディスクをオンラインにすることに関連するものは何も見つかりませんでした。また、フォーマット/パーティション以外にディスクに興味深い変更を加えることもできませんでした。これは、この機能でサポートされているのがホットスワップ可能なハード ドライブのみであるためと考えられます。ホットスワップ可能なハード ドライブの市場は非常に小さく、そのような状況の大部分では、必要な操作をサポートするドライバーが存在します。最後に、残りのユーザーは必要に応じて diskpart ツールを使用できるようになります。

要件をもう一度確認する必要があると思います。ハードディスクをオンラインにするために必要な権限を持つプロセスを実行していますが、コマンド ライン プログラムにアクセスできませんか? コマンド ライン プログラムを使用しない一般的な理由について、いくつかの提案を次に示します。

  • 黒い画面のポップアップが表示されない - オンラインで入手できるこの問題の解決策はたくさんあります
  • セキュリティ チームはそれを許可しません - あなたは既にプロセスを管理者として実行しているので、それを信頼しますが、組み込みの Windows 機能を信頼しないのはなぜですか
  • 技術的な問題により、他のプロセスを呼び出すことができません - プロセスが管理者として実行されている場合、これがどのように管理されたかに興味があります
  • 「常に API を使用する」などのコーディング ガイドライン - 必要がないため存在しない
于 2011-09-23T17:21:53.390 に答える