Über das Windows Device Management läßt sich mit der Funktion
DeviceIoControl und dem ControlCode
IOCTL_STORAGE_GET_MEDIA_TYPES_EX die Struktur
GET_MEDIA_TYPES ermitteln, welche den Device Type (u.a. CD und DVD) enthält. Den Zugriff auf das Laufwerk erhält man mit
CreateFile. Da nur lesender Zugriff benötigt wird, sollte es keine Rechteprobleme geben.
Der ControlCode IOCTL_STORAGE_GET_MEDIA_TYPES_EX und die Struktur GET_MEDIA_TYPES:
Delphi-Quellcode:
const
FILE_DEVICE_CD_ROM = $00000002;
FILE_DEVICE_MASS_STORAGE = $0000002d;
FILE_DEVICE_DVD = $00000033;
const
IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE;
const
METHOD_BUFFERED = 0;
const
FILE_ANY_ACCESS = 0;
const
IOCTL_STORAGE_GET_MEDIA_TYPES_EX = (IOCTL_STORAGE_BASE shl 16) or ($0301 shl 2) or METHOD_BUFFERED or (FILE_ANY_ACCESS shl 14);
type
TGET_MEDIA_TYPES = packed record
DeviceType : DWord;
MediaInfoCount : DWord;
// MediaInfo : Array[0..0] of TDEVICE_MEDIA_INFO;
end;
PGET_MEDIA_TYPES = ^TGET_MEDIA_TYPES;
Die MediaInfo ist auskommentiert, da sie nicht benötigt wird.
Die Funktion:
Delphi-Quellcode:
function GetMediaType(sDrive: AnsiChar; out sType: AnsiString): Boolean;
{*******************************************************************************
* Laufwerkstyp: CD, DVD, Unbekannt.
}
var
hDevice : THandle;
mediaTypes : PGET_MEDIA_TYPES;
cBuffer : array [0..2047] of AnsiChar;
nReturned : Cardinal;
begin
Result := False;
hDevice := CreateFileA(PAnsiChar(Format('\\.\%s:', [sDrive])), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0 );
if hDevice <> INVALID_HANDLE_VALUE
then begin
nReturned := 0;
Result := DeviceIoControl(hDevice, IOCTL_STORAGE_GET_MEDIA_TYPES_EX, nil, 0, @cBuffer, SizeOf(cBuffer), nReturned, nil);
if Result
then begin
mediaTypes := @cBuffer;
case mediaTypes.DeviceType of
FILE_DEVICE_CD_ROM : sType := 'CD-ROM';
FILE_DEVICE_DVD : sType := 'DVD';
else sType := 'Unknown';
end;
end;
CloseHandle(hDevice);
end;
end;
Der Funktion wird das Laufwerksbuchstabe übergeben. Das Ergebnis der Funktion entspricht dem Ergebnis der Ausführung der Funktion DeviceIOControl. War die Ausführung erfolgreich bekommt man als Type CD-ROM, DVD oder unbekannt zurück.