Как прочитать размер мультисессионного 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 /, которые будут работать, зависит от накопителя и его программного обеспечения.
Старые диски не будут поддерживать новые интерфейсы, а некоторые новые диски не будут поддерживать устаревшие интерфейсы.
Таким образом, некоторые библиотеки и инструменты могут использовать один или несколько из этих интерфейсов.
Наблюдать за старшими сессонами все довольно грязно, так как большинство ОС не будут заботиться о них, только самые последние.