前提・実現したいこと
現在、ディスクの管理にて次の様に表示されるダイナミックディスクでGPTなドライブよりパーティションの空き情報を取得方法を探しています。
[100MB 正常(EFI システムパーティション)][97.66GB 未割り当て][D: 833.63GB NTFS 正常]
※ソフトウェアRAIDを使用している4つのディスクの一つとなっております。
発生している問題
パーティションの空き情報はパーティションの情報からることができる思い、 GPTな物理ドライブの \.\PhysicaDrive0
より DeviceIoControl
の IOCTL_DISK_GET_DRIVE_LAYOUT_EX
経由でパーティション間の空き領域情報を取得しようとしてみたのですが、それにより取得される。 DRIVE_LAYOUT_INFORMATION_EX
の PartitionEntry[]
こと PARTITION_INFORMATION_EX
に設定される パーティションの各情報は次の様な形となります。
PartitionNumber | StartOffset | PartitionLength | StartOffset+PartitionLength | Type |
---|---|---|---|---|
1 | 1048576 | 104857600 | 105906176 | c12a7328-f81f-11d2-ba4b-00a0c93ec93b |
2 | 105906176 | 1048576 | 106954752 | 5808c8aa-7e8f-42e0-85d2-e1e90434cfb3 |
3 | 106954752 | 133169152 | 240123904 | e3c9e316-0b5c-4db8-817d-f92df00215ae |
4 | 240123904 | 999964745216 | 1000204869120 | af9b60a0-1431-4f62-bc68-3311714a69ad |
想定していた隙間がどこにも空いていませんでした。
試したこと
以下の方法を試しました。
list partition
尚、disikpart
で list partition
すると、次の様な表示となりました。
diskpart
1 Partition ### Type Size Offset 2 ------------- ------------------ ------- ------- 3 Partition 1 システム 100 MB 1024 KB 4 Partition 2 予約済みダイナミック 1024 KB 101 MB 5 Partition 3 予約 127 MB 102 MB 6 Partition 4 ダイナミック データ 931 GB 229 MB
####FindVolume で取得されたVolumeに対しての読み込み
FindVolume で取得されたVolumeに対して IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
により読み込んだ場合対象のドライブに関しての情報は次のものだけとなった。
StartOffset | ExtentLength | StartOffset+ExtentLegnth |
---|---|---|
105097723904 | 895106416640 | 1000204140544 |
マウントしているボリュームのみ取得される様で、RAID構成されているDドライブの位置だけわかる状態となっておりました。(計4ディスクの位置も取得されているがここでは必要な情報だけ載せる形で省略。
使用したコード
juner/IoControl#93f655872fb7bda6e60d0f0ca13ff96c47680e30
のIoControlPhysicalExample
####QueryDosDevice()
より取得されたパス群の中より、ボリュームを探して取得
QueryDosDevice()
より取得したデバイス名群より、HarddiskVolumeX
形式の名前を探し、それを元にIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
を実施した。
FilePath | StartOffset | ExtentLength | StartOffset+ExtentLegnth |
---|---|---|---|
.\HarddiskVolume1 | 1048576 | 104857600 | 105906176 |
.\HarddiskVolume2 | 106954752 | 133169152 | 240123904 |
.\HarddiskVolume10 | 105097723904 | 895106416640 | 1000204140544 |
一部のパーティションが取得できていないが、これがほしかった情報であろうか?
このコードは FindVolume で取得されたVolumeに対しての読み込み の確認に使ったコードに含まれる。
GPTPartition情報を直に読み込む
PartitionNumber | First(LBA8) | Last(LBA8) | SectorSize | First*SectorSize | Last*SectorSize |
---|---|---|---|---|---|
1 | 0x800 | 0x327FF | 512 | 1048576 | 105905664 |
2 | 0x32800 | 0x32FFF | 512 | 105906176 | 106954240 |
3 | 0x33000 | 0x727FF | 512 | 106954752 | 240123392 |
4 | 0x72800 | 0x74706D8E | 512 | 240123904 | 1000204868608 |
FirstSectorSize が合致しているのでこの情報はほぼ同じ情報と想定される。LastSectorSize がずれるのは誤差?
確認に使用したコード
juner/ReadHeader#8591d9704b9b5dd4c2ffdc2192e9c779563c89e5
の ReadHeaderExample
補足情報(FW/ツールのバージョンなど)
OS: Windows10 (1803)
以上、よろしくお願い致します。