Чтобы получить "сырые данные" о CD/DVD диске, такие как производитель, MID, тип, емкость и скорость, в Delphi, можно использовать несколько подходов. Один из них заключается в использовании Windows API и специализированных команд для работы с устройствами чтения/записи оптических дисков. В частности, можно использовать DeviceIoControl и соответствующие команды SCSI.
uses
Windows, SysUtils;
const
IOCTL_SCSI_PASS_THROUGH_DIRECT = $4D014;
type
SCSI_PASS_THROUGH_DIRECT = record
Length: USHORT;
ScsiStatus: UCHAR;
PathId: UCHAR;
TargetId: UCHAR;
Lun: UCHAR;
CdbLength: UCHAR;
SenseInfoLength: UCHAR;
DataIn: UCHAR;
DataTransferLength: ULONG;
TimeOutValue: ULONG;
DataBuffer: Pointer;
SenseInfoOffset: ULONG;
Cdb: array[0..15] of UCHAR;
end;
procedure GetDiscInformation;
var
hDevice: THandle;
sptd: SCSI_PASS_THROUGH_DIRECT;
SenseBuffer: array[0..17] of UCHAR;
DataBuffer: array[0..255] of UCHAR;
Returned: DWORD;
i: Integer;
begin
hDevice := CreateFile('\\.\E:', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, 0, 0);
if hDevice = INVALID_HANDLE_VALUE then
begin
RaiseLastOSError;
Exit;
end;
try
ZeroMemory(@sptd, SizeOf(SCSI_PASS_THROUGH_DIRECT));
sptd.Length := SizeOf(SCSI_PASS_THROUGH_DIRECT);
sptd.CdbLength := 12;
sptd.DataIn := 1; // SCSI_IOCTL_DATA_IN
sptd.SenseInfoLength := SizeOf(SenseBuffer);
sptd.DataTransferLength := SizeOf(DataBuffer);
sptd.TimeOutValue := 2;
sptd.DataBuffer := @DataBuffer;
sptd.SenseInfoOffset := DWORD(@SenseBuffer) - DWORD(@sptd);
sptd.Cdb[0] := $46; // GET CONFIGURATION command
sptd.Cdb[7] := $02;
sptd.Cdb[8] := $00;
sptd.Cdb[9] := $00;
sptd.Cdb[10] := $F0;
if not DeviceIoControl(hDevice, IOCTL_SCSI_PASS_THROUGH_DIRECT,
@sptd, SizeOf(SCSI_PASS_THROUGH_DIRECT),
@sptd, SizeOf(SCSI_PASS_THROUGH_DIRECT),
@Returned, nil) then
begin
RaiseLastOSError;
Exit;
end;
// Пример вывода данных
for i := 0 to sptd.DataTransferLength - 1 do
begin
Write(IntToHex(DataBuffer[i], 2) + ' ');
if (i + 1) mod 16 = 0 then
WriteLn;
end;
finally
CloseHandle(hDevice);
end;
end;
begin
try
GetDiscInformation;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.
Просто так это код вставлять в Delphi его нужно вставлять с умом.
после создания проекта
и вставлять по частям объявлений переменных и типов.
Если ты выберешь выделить весь код и вставишь будут ошибки
имей это ввиду