Как прочитать размер мультисессионного DVD-диска в Windows?

Попытка чтения размеров дисков, которые были созданы в нескольких сеансах с использованием GetDiskFreeSpaceEx(), дает размер только последнего сеанса. Как правильно прочитать количество и размеры всех сессий в C/C++?

Благодарю.

3 ответа

Решение

Возможно, вы захотите взглянуть на функцию API DeviceIoControl. Смотрите здесь для контрольных кодов. Вот пример кода, который извлекает размер 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,


Если все не удается с DeviceIoControl, вы могли бы использовать API Мастеринг образов Windows (IMAPI). Для поддержки DVD вам понадобится v2 API (входит в Vista и более поздние версии, может быть добавлено и в XP & 2003, см. Здесь: Что нового в IMAPIv2). Этот API в первую очередь предназначен для записи компакт-дисков, но, возможно, содержит некоторые функции для определения размера диска, я бы посчитал его странным, если бы его не было. В частности, этот пример кажется интересным. Я не знаю, работает ли этот диск и для мультисессионных дисков, но, поскольку он может их создавать, я думаю, это вероятно.

Вот некоторые ресурсы для IMAPI:
MSDN - IMAPI
MSDN - IMAPI интерфейсы
MSDN - Создание мультисессионных дисков с IMAPI (примечание: пример с VB, а не с C или C++)

Эй, у меня есть как минимум 2 решения для вас:

1) Скачать dvd+rw-mediainfo.exe от http://fy.chalmers.se/~appro/linux/DVD+RW/tools/win32/, это инструмент, который читает информацию о вашем диске. Затем просто сделайте системный вызов из вашего приложения и проанализируйте результаты. Вот пример вывода:

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 /, которые будут работать, зависит от накопителя и его программного обеспечения.

Старые диски не будут поддерживать новые интерфейсы, а некоторые новые диски не будут поддерживать устаревшие интерфейсы.

Таким образом, некоторые библиотеки и инструменты могут использовать один или несколько из этих интерфейсов.

Наблюдать за старшими сессонами все довольно грязно, так как большинство ОС не будут заботиться о них, только самые последние.

Другие вопросы по тегам