Projekte > Optische Laufwerke > Medieninformationen

CD Type

IOCTL_CDROM_DISK_TYPE control code

Auch für die Feststellung des Types einer CD gibt es einen IOCTL Control Code. Der IOCTL_CDROM_DISC_TYPE Control Code gibt als Ergebnis zurück, ob es sich um eine DatenCD, eine AudioCD oder eine MixedCD handelt. Das ist etwas anders als der Disc Type in der Rohen Table of Contents der MMC. Im Dev Center der MSDN ist dieser Control Code nicht dokumentiert. Dazu benötigt man das DDK. Dort ist er in der Headerdatei Ntddcdrm.h definiert. Die Datei findet man zum Beispiel hier:

 
  #define IOCTL_CDROM_DISK_TYPE
                CTL_CODE(IOCTL_CDROM_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
        

Die Function CTL_CODE ist zum Beispiel bei OSR Online erläutert. Die Konstanten finden sich in der Ntddcdrm.h und der devioctl.h (Zum Beispiel hier).

 
  #define IOCTL_CDROM_BASE          FILE_DEVICE_CD_ROM
 
  #define FILE_DEVICE_CD_ROM        0x00000002
 
  #define FILE_ANY_ACCESS           0
 
  #define METHOD_BUFFERED           0
        

Daraus ergibt sich dann in Delphi folgendes:

 
  const
    FILE_DEVICE_CD_ROM = $00000002;
    IOCTL_CDROM_BASE   = FILE_DEVICE_CD_ROM;
    FILE_ANY_ACCESS    = 0;
    METHOD_BUFFERED    = 0;
 
  const
    IOCTL_CDROM_DISK_TYPE = (IOCTL_CDROM_BASE shl 16) or
                            (FILE_ANY_ACCESS shl 14) or
                            ($0010 shl 2) or
                            METHOD_BUFFERED;
          
 

Antwortstruktur

Als Antwort erhält man eine CDROM_DISK_DATA Struktur. Diese und die für die Auswertung benötigten Konstanten sind ebenfalls in der Ntddcdrm.h definiert:

 
  typedef struct _CDROM_DISK_DATA {
 
      ULONG DiskData;
 
  } CDROM_DISK_DATA, *PCDROM_DISK_DATA;
 
  #define CDROM_DISK_AUDIO_TRACK      (0x00000001)
  #define CDROM_DISK_DATA_TRACK       (0x00000002)
        

In Delphi ergibt sich:

 
  type
    TCDROM_DISK_DATA = record
      DiskData : Cardinal;
    end;
 
  const
    CDROM_DISK_AUDIO_TRACK = $00000001;
    CDROM_DISK_DATA_TRACK  = $00000002;
          

 

Ausführung

 
  function TOptDrives.IOCTL_CDROMDiskType(aDevice: THandle): Boolean;
  {*******************************************************************************
  *  Den Type der CDROM Disk ermitteln.
  }
  var
    CDD       : TCDROM_DISK_DATA;
    nReturned : Cardinal;
  begin
    Result := False;
    {
    *  CDD initialisieren.
    }
    FillChar(FDrive[FActive].CDROM_DISKTYPE, SizeOf(Cardinal), $FF);
    {
    *  Befehl ausführen.
    }
    Result := DeviceIoControl(aDevice, IOCTL_CDROM_DISK_TYPE, nil, 0,
                              @CDD, SizeOf(CDD), nReturned, nil);
    if Result
    then FDrive[FActive].CDROM_DISKTYPE := CDD.DiskData and $03
    else FDrive[FActive].CDROM_DISKTYPE := Cardinal(-1);
  end;
          

Wenn kein Datenträger eingelegt ist, ergibt die Funktion den Fehler "Unzulässige Funktion.".

 

Demo, welche diese Funktion nutzt:

CDROM Disk Type (podCDROMDiscType.7z - 238 kb) MD5 (1 kb). Stand: 26. Februar 2012

Änderungen an der Demo

Datum Beschreibung
26.02.2012Aktualisiert: Groupbox "Optische Laufwerke".