10

ゴール

私はファイルシステムを Windows に移植しており、マウンターの実行可能ファイルに対してより Windows に似たインターフェイスを作成しています。このプロセスの一部は、ユーザーがパーティションを見つけてドライブ文字を選択できるようにすることです。最終的にパーティションを選択するとCreateFile()、 、open()fopen()または同様のものを使用して開くことができます。

リード

Windows は、ボリュームの概念を中心に展開しているように見えますが、これはディスクとはまったく似ていないようで、既にマウントされているファイルシステムに対してのみ発生します。

私が持っていた有望なリードは次のとおりです。

/dev/sda1ただし、これらはすべて、私が求めているパーティション固有のスタイルのハンドルではなく、ボリュームまたはそのオフセットで終わります。

OPがパーティションではなく物理ディスク名の後にあることに気付くまで、私は報奨金を考えました。この回答には、パーティション名をブルート フォースする方法が含まれています。それは避けたいと思います (または、可能なパスの境界を含むドキュメントを参照してください)。

質問

私は…したい:

  • Windows でマウントされていないパーティションの正しい用語とドキュメント。
  • 利用可能なすべてのパーティションを確実に取得するための効果的で文書化された方法。
  • Linux で利用可能なパーティション ファイルの抽象化に最も近いもので、すべての IO は開かれたパーティションのディスクの適切な領域にバインドされます。

Update0

主な目的は未加工のパーティションを開くことですが、解決策としては、最初に各ディスク ドライブのハンドルを取得し、次にそれを使用して各パーティションを取得する必要があるようです。すべてのディスク ドライブ (ボリュームがマウントされていないドライブも含む) を列挙する方法が必要です。

4

4 に答える 4

6

ご指摘のとおり、IOCTL_DISK_GET_DRIVE_LAYOUT_EXを使用してパーティションのリストを取得できます。

関連する概念の概要については、こちらを参照してください。あなたのミッシングリンクは

ディスクの種類の検出

特定のファイルまたはディレクトリが配置されているディスクの種類をプログラムで検出する特定の機能はありません。間接的な方法があります。

まず、 に電話しますGetVolumePathNameCreateFile次に、パスを使用してボリュームを開くために呼び出します。次に、 IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS ボリューム ハンドルを使用してディスク番号を取得し、ディスク番号を使用して「\?\PhysicalDriveX」などのディスク パスを作成します。最後に、 を使用 IOCTL_DISK_GET_DRIVE_LAYOUT_EXしてパーティション リストを取得し、パーティション リスト内の各エントリの PartitionType を確認します。

ディスク管理制御コードの完全なリストには、さらに有用なコードが含まれている可能性があります。正直なところ、Unix のパーティション名が Windows にどのようにマップされるのかはわかりません。

于 2010-10-28T11:43:55.087 に答える
4

ユーザー空間とWindows API (win32)の安全な避難所から、NTTDK を使用したデバイス ドライバーのコーディングに移行することを想像できる場合は、 IoReadPartitionTableExまたはその他の低レベルのディスク関数を試すことができます。

于 2010-10-28T11:23:48.810 に答える
2

率直に言うと、マウントされている/マウントされていないすべてのディスク パーティションを確実に取得する最善の方法は、mbr/gpt を自分で解析することです。

最初にいくつかのことを明確にします。ディスクにはパーティションが含まれており、パーティションを組み合わせてボリュームを作成します。したがって、2 つの異なるディスクからの 2 つのパーティションで構成される 1 つのボリュームを持つことができます。

IOCTL_DISK_GET_DRIVE_LAYOUT_EX手動で行うことなく得られる最も近い解決策です。これに関する問題は、MBR を誤って解析できる Windows に依存していることです。私の現在の作業理論は、Windows が EFI 経由でインストールされているが、MBR 経由で起動されている場合、この種の問題が発生するというものです。ほとんどのパーティション マネージャーは重要なパーティション情報を GPT と一緒に MBR にコピーするため、Windows はこれを回避できます。ただし、これは、パーティション UUID (GPT にのみ保存される) などの重要な情報を取得できないことを意味します。

他のすべてのソリューションには、パーティション情報とはまったく異なるボリューム情報を取得することが含まれます。

補足:通常、ボリューム ID はの形式になり\\.\Volume{PARTITION_UUID}ます。これが当てはまらないケース: ドライブが GPT ではなく MBR でパーティション分割されている場合 (MBR にはパーティション UUID がないため、Windows が作成します)、RAID ドライブがある場合、または次のパーティションで構成されるボリュームがある場合複数のディスク (raid と同じようなもの)。それらは私の頭に浮かぶケースにすぎません。私を拘束しないでください。

于 2013-05-25T20:55:59.263 に答える
1

あなたは初期段階で少し間違っていると思います。たとえば、「マウント」は Unix で機能するように Windows でも機能すると想定しているようです。少し違います。

最も身近な終わりから始めましょう。C:\ドライブ文字を使用するようなパス。これらは基本的に、最近ではシンボリック リンクのセットにすぎません (Windows では、正式には「ジャンクション」として知られています)。すべてのユーザー用の基本セットがあり、各ユーザーは独自のセットを追加できます。ボリュームのドライブ文字がなくても、 のようなボリューム名\\?\Volume{4c1b02c1-d990-11dc-99ae-806e6f6e6963}\が表示されます。などの呼び出しでこのボリューム名を使用できます。ただし、それらが好きCreateFile()かどうかはわかりません。fopen()

この関数QueryDosDeviceは、ドライブ文字またはボリューム名の Windows デバイス名を取得します。デバイス名は「\Device\HarddiskVolume1」のように見えますが、これを渡すことはできませんCreateFile

Microsoft には、すべてのパーティションを列挙するサンプル コードがあります。

Windows では、Linux と同様に、パーティション自体をファイルのように開くことができます。これは、 の下で非常によく文書化されていCreateFileます。

于 2010-10-28T11:57:42.583 に答える