Avatar
www.fr-an.de

Medieninformationen

CD Type

IOCTL_CDROM_DISK_TYPE control code

Mit dem IOCTL_CDROM_DISC_TYPE control code kann man den Typ einer CD ermitteln. Das heißt, ob es eine DatenCD, eine AudioCD oder eine MixedCD ist. Im Dev Center der MSDN ist dieser control code nicht dokumentiert. Dazu benötigt man das DDK. Der control code ist in der Headerdatei Ntddcdrm.h definert. Diese findet sich 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

 
    ...
 
  begin
 
    ...
 
    {
    *  Handle holen.
    }
    dwDesiredAccess := GENERIC_READ;
    dwShareMode     := FILE_SHARE_READ;
    aDevice         := CreateFile(PAnsiChar(Format('\\.\%s:', [aDrive])),
                                  dwDesiredAccess, dwShareMode,
                                  nil, OPEN_EXISTING, 0, 0);
    {
    *  CDD initialisieren.
    }
    FillChar(CDD, SizeOf(CDD), $00);
    {
    *  Befehl ausführen.
    }
    if DeviceIoControl(aDevice, IOCTL_CDROM_DISK_TYPE, nil, 0, @CDD, SizeOf(CDD),
                       nReturned, nil) then
    case cdd.DiskData and $03 of
      CDROM_DISK_DATA_TRACK :                           Result := 'DatenCD';
      CDROM_DISK_AUDIO_TRACK :                          Result := 'AudioCD';
      CDROM_DISK_DATA_TRACK or CDROM_DISK_AUDIO_TRACK : Result := 'MixedCD';
    end;
 
    ...
 
  end;
        

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

 

Demo, welche diese Funktion nutzt:

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

Änderungen an der Demo

26.02.2012 -
Aktualisiert: Groupbox "Optische Laufwerke".

 

Fr_An - Erstellt: 18. Februar 2012 - Letzte Änderung: 26. Februar 2012

seit 28. Juli 2010