GetDiskFreeSpaceEx() を使用して複数のセッションで作成されたディスクのサイズを読み取ろうとすると、最後のセッションのサイズのみが得られます。C/C++ ですべてのセッションの数とサイズを正しく読み取るにはどうすればよいですか?
ありがとう。
DeviceIoControlAPI関数を確認することをお勧めします。制御コードについては、こちらをご覧ください。CDディスクのサイズを取得するコード例を次に示します。代わりの
CreateFile(TEXT("\\\\.\\PhysicalDrive0")
例えば
CreateFile(TEXT("\\\\.\\F:") /* Drive is F: */
ご希望の場合。
注:このページには、DeviceIoControl
「フロッピーディスクドライブ、ハードディスクドライブ、テープドライブ、またはCD-ROMドライブに関する情報を取得する」ために使用できると記載されていますが、DVDでもテストしたところ、完全に機能しているようです。テストするマルチセッションDVDにアクセスできなかったので、それが自分で機能するかどうかをテストする必要があります。それが機能しない場合は、他のいくつかの制御コード、少なくとも、、、およびを試してIOCTL_DISK_GET_DRIVE_GEOMETRY_EX
みます。
IOCTL_DISK_GET_DRIVE_LAYOUT_EX
IOCTL_DISK_GET_LENGTH_INFO
IOCTL_DISK_GET_PARTITION_INFO_EX
IMAPIのリソースは次のとおりです
。MSDN-IMAPIMSDN
-IMAPIインターフェイス
MSDN-IMAPIを使用したマルチセッションディスクの作成(注:CまたはC ++ではなくVBを使用した例)
少なくとも 2 つの解決策があります。
1) http://fy.chalmers.se/~appro/linux/DVD+RW/tools/win32/dvd+rw-mediainfo.exe
からダウンロードします。これは、ディスクに関する情報を読み取るツールです。次に、アプリからシステム コールを行い、結果を解析します。出力例を次に示します。
D:\Downloads>"dvd+rw-mediainfo.exe" f:
INQUIRY: [HL-DT-ST][DVDRAM GT30N ][1.01]
GET [CURRENT] CONFIGURATION:
Mounted Media: 10h, DVD-ROM
Current Write Speed: 1.0x1385=1385KB/s
Write Speed #0: 8.0x1385=11080KB/s
Write Speed #1: 4.0x1385=5540KB/s
Write Speed #2: 2.0x1385=2770KB/s
Write Speed #3: 1.0x1385=1385KB/s
Speed Descriptor#0: 00/2292991 R@8.0x1385=11080KB/s W@8.0x1385=11080KB/s
READ DVD STRUCTURE[#0h]:
Media Book Type: 01h, DVD-ROM book [revision 1]
Legacy lead-out at: 2292992*2KB=4696047616
READ DISC INFORMATION:
Disc status: complete
Number of Sessions: 1
State of Last Session: complete
Number of Tracks: 1
READ TRACK INFORMATION[#1]:
Track State: complete
Track Start Address: 0*2KB
Free Blocks: 0*2KB
Track Size: 2292992*2KB
Last Recorded Address: 2292991*2KB
FABRICATED TOC:
Track#1 : 17@0
Track#AA : 17@2292992
Multi-session Info: #1@0
READ CAPACITY: 2292992*2048=4696047616
2)mciSendString
から調査し[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
ます。何らかのコマンドを送信して、目的の結果を得ることができると思われます。
PS: もちろん、ここdvd+rw-mediainfo.exe
からソースをダウンロードしてさらに調査することもできます。
ソースコードへのリンクが更新されました。@oystein に感謝します
レガシーおよび下位互換性の問題により、DVD ドライブにはこのためのインターフェイスがいくつかあるため、これを行うには多くの方法があります。
IOCTL_SCSI_PASSTHROUGH_DIRECT コマンドを DVD ドライブ (物理デバイス ハンドル) に送信できます。それを使用して、ドライブが応答する SCSI コマンドを発行します。セッション情報、ディスク情報、ディスク容量などを読み取ることができます。dvd+rw-mediainfo.exe がこれらの問題を引き起こしていると思います。
残念ながら、インターフェイスはコマンド内のコマンドであるため、少しトリッキーでわかりにくいものです。パススルーにはバイト バッファがあり、コマンド構造を自分で入力する必要があります。
または、IOCTL_CDROM_READ_TOC_EX を呼び出すこともできます: http://www.osronline.com/ddkx/storage/k306_2cs2.htm
また、機能する IOCTL / コマンドの正確なセットは、ドライブとそのファームウェアに依存すると考えています。
古いドライブは新しいインターフェイスをサポートせず、新しいドライブの一部はレガシー インターフェイスをサポートしません。
したがって、一部のライブラリとツールは、これらのインターフェイスを 1 つ以上使用する場合があります。
ほとんどの OS はそれらを気にせず、最新のものだけを気にするため、古いセッションにアクセスするのは非常に面倒です。