7

GetDiskFreeSpaceEx() を使用して複数のセッションで作成されたディスクのサイズを読み取ろうとすると、最後のセッションのサイズのみが得られます。C/C++ ですべてのセッションの数とサイズを正しく読み取るにはどうすればよいですか?

ありがとう。

4

3 に答える 3

3

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_EXIOCTL_DISK_GET_LENGTH_INFOIOCTL_DISK_GET_PARTITION_INFO_EX


DeviceIoControlですべてが失敗した場合は、Windows Image Mastering API(IMAPI)を利用できる可能性があります。DVDをサポートするには、APIのv2(Vista以降に含まれています。XPおよび2003にも追加できます。ここを参照してください:IMAPIv2の新機能)が必要です。このAPIは主にCDの書き込み用ですが、ディスクサイズを取得するための機能が含まれている可能性があります。含まれていない場合は、奇妙に感じるでしょう。特に、この例はおもしろそうです。これがマルチセッションディスクでも機能するかどうかはわかりませんが、作成できるので、おそらくそうだと思います。

IMAPIのリソースは次のとおりです
。MSDN-IMAPIMSDN
-IMAPIインターフェイス
MSDN-IMAPIを使用したマルチセッションディスクの作成(注:CまたはC ++ではなくVBを使用した例)

于 2010-11-02T17:53:56.973 に答える
2

少なくとも 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 に感謝します

于 2010-11-01T21:12:23.260 に答える
0

レガシーおよび下位互換性の問題により、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 はそれらを気にせず、最新のものだけを気にするため、古いセッションにアクセスするのは非常に面倒です。

于 2010-11-02T18:25:59.970 に答える