Come leggere un multi-sessione di dimensioni del disco DVD in Windows?
Domanda
Il tentativo di leggere i formati di dischi che sono stati creati in sessioni multiple utilizzando GetDiskFreeSpaceEx () dà la dimensione del solo l'ultima sessione. Come faccio a leggere correttamente il numero e le dimensioni di tutte le sessioni in C / C ++?
Grazie.
Soluzione
Si potrebbe desiderare di guardare il DeviceIoControl funzione API. Vedere qui per i codici di controllo. Qui un esempio di codice che recupera la dimensione di un disco CD. Sostituire
CreateFile(TEXT("\\\\.\\PhysicalDrive0")
per es.
CreateFile(TEXT("\\\\.\\F:") /* Drive is F: */
se lo si desidera.
Nota: La pagina dice che DeviceIoControl
può essere usato per "recuperare informazioni su un disco floppy, unità disco rigido, unità nastro, o CD-ROM", ma ho anche provato su un DVD, e sembrava funzionare perfettamente. Io non avere accesso ai vostri DVD multisessione di prova, in modo dovrete prova se stessi che funziona. Se non funziona, mi piacerebbe provare alcuni degli altri codici di controllo, almeno IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
, IOCTL_DISK_GET_DRIVE_LAYOUT_EX
, IOCTL_DISK_GET_LENGTH_INFO
e IOCTL_DISK_GET_PARTITION_INFO_EX
.
Se tutto fallisce con DeviceIoControl, si potrebbe fare uso delle API di Image Mastering di Windows (IMAPI). Avrete bisogno v2 delle API (incluso con Vista e in seguito, può essere aggiunto a XP e 2003 troppo, vedi qui: Cosa c'è di nuovo in IMAPIv2 ) per il supporto DVD. Questa API è principalmente per la masterizzazione di CD, ma che forse contiene alcune funzionalità per il recupero dimensione del disco, avrei trovato strano se non lo ha fatto. In particolare, questo esempio sembra essere interessante. Non so se questo funziona per multisessione dischi sia, ma dal momento che può crearle, credo che sia probabile.
Ecco alcune risorse per IMAPI:
MSDN - IMAPI
MSDN - IMAPI interfacce
MSDN - Creazione di dischi con multisessione IMAPI (nota: ad esempio con VB, non C o C ++)
Altri suggerimenti
Hey ho ottenuto almeno 2 soluzioni per voi:
1) Scarica dvd+rw-mediainfo.exe
da http: //fy.chalmers .it / ~ appro / linux / DVD + RW / strumenti / win32 / , è uno strumento che legge informazioni sul tuo disco. Poi basta fare una chiamata di sistema dalla tua app e analizzare i risultati. Qui di output di esempio:
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) Indagare mciSendString
da [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
, ho il sospetto è possibile inviare dei comandi e ottenere i risultati desiderati.
PS: naturalmente è possibile scaricare i sorgenti dvd+rw-mediainfo.exe
da qui e indagare ulteriormente, sto solo dando idee a cui pensare.
UPDATE
Link al codice sorgente aggiornato, grazie @oystein
Ci sono molti modi per fare questo in quanto le unità DVD hanno diverse interfacce per questo a causa di questioni di eredità e indietro-compatibilità.
Si potrebbe inviare un comando IOCTL_SCSI_PASSTHROUGH_DIRECT al DVD-drive (la maniglia physicaldevice per esso). Con esso si emette un comandi SCSI che verranno elaborate dal drive. È possibile leggere le informazioni di sessione, disco informazioni capcity disco e altro ancora. Credo che il DVD + RW questioni-mediainfo.exe questi.
Purtroppo, l'interfaccia è un po 'complicato e oscuro, dal momento che è un comando all'interno di un comando. Th passthrough ha un byte di buffer si dovrà compilare in te stesso con la struttura di comando.
In alternativa, è possibile chiamare IOCTL_CDROM_READ_TOC_EX: http://www.osronline.com/ddkx/storage/k306_2cs2.htm
Credo anche che l'insieme esatto del IOCTL / comandi che il lavoro volontà dipende sul disco e la sua firmaware.
unità meno recenti non supportano le interfacce newr e alcune delle unità più recenti non supportano interfacce legacy.
In questo modo, alcune delle librerie e strumenti potrebbe usare una o più di queste interfacce.
Accseeing le sessons anziani è tutto molto disordinato, in realtà, poiché la maggior parte del sistema operativo non si cura di loro, solo quelli più recenti.