Как прочитать размер мультисессионного DVD-диска в Windows? - PullRequest
7 голосов
/ 24 октября 2010

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2010

Возможно, вы захотите взглянуть на API-функцию DeviceIoControl .См. здесь для контрольных кодов. Здесь - это пример кода, который извлекает размер CD-диска.Замените

CreateFile(TEXT("\\\\.\\PhysicalDrive0")

, например,

CreateFile(TEXT("\\\\.\\F:") /* Drive is F: */

, если хотите.

Примечание: На странице написано, что DeviceIoControl можно использовать для «извлечения информации о дисководах гибких дисков, жестких дисках, ленточных накопителях или дисководе компакт-дисков», но яЯ также проверил его на 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).Вам потребуется v2 API (входит в Vista и более поздние версии, также может быть добавлено в XP & 2003, см. Здесь: Что нового в IMAPIv2 ) для поддержки DVD.Этот API в первую очередь предназначен для записи компакт-дисков, но, возможно, содержит некоторые функции для определения размера диска, я бы посчитал его странным, если бы его не было.В частности, этот пример представляется интересным.Я не знаю, работает ли этот диск и для мультисессионных дисков, но, поскольку он может их создавать, я думаю, это вероятно.

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

1 голос
/ 02 ноября 2010

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

UPDATE

Ссылка на исходный код обновлена, спасибо @ oystein

0 голосов
/ 02 ноября 2010

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

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

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

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

...