Определение типа CD носителя
Вот решил выложить одну свою функцию для определения типа носителя вставленного в DVD-ROM.
Из-за специфики работы дивидиромов - они не показывают тип диска если не поддерживают его.
т.е. если DVD не пише DVD-R то все вставленные не пустые DVD-R диски будут показываться как DVD-ROM.
Мож кому пригодиться )
Код:
program Project2;
uses windows;
{$APPTYPE CONSOLE}
const
IOCTL_CDROM_GET_CONFIGURATION=$00024058;
SCSI_GET_CONFIGURATION_REQUEST_TYPE_ONE=2;
DiskTypeName:array[0..18] of string=(
'Invalid','NonRemovableDisk','RemovableDisk','MOErasable',
'MOWriteOnce','AS_MO','CD-ROM','CD-R',
'CD-RW','DVD-ROM','DVD-R','DVD-RAM',
'DVD-RW','DVD-RW Sequential','DVD+RW','DVD+R','DDCD-ROM',
'DDCD-R','DDCD-RW');
DiskTypeCode:array[0..18] of word=
(0,1,2,3,4,5,8,9,10,16,17,18,19,20,26,27,32,33,34);
type
GET_CONFIGURATION_IOCTL_INPUT=packed record
Feature:dword;
RequestType:dword;
Reserved:array[0..1] of pointer;
end;
GET_CONFIGURATION_HEADER=packed record
DataLength:dword;
Reserved:word;
CurrentProfile:word;
Data:char;
end;
PGET_CONFIGURATION_HEADER=^GET_CONFIGURATION_HEADER;
function SWAP(dw:word):word;assembler;
asm
xchg ah,al
end;
function GetDiskType(Disk:char):string;
var
h:dword;
ret:LongBool;
input:GET_CONFIGURATION_IOCTL_INPUT;
pConfigHeader:PGET_CONFIGURATION_HEADER;
retbc:cardinal;
x:integer;
begin
h:=CreateFile(pchar('\\.\'+Disk+':'),GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
if h=INVALID_HANDLE_VALUE then
begin
result:='Error';
exit;
end;
ZeroMemory(@input, sizeof(GET_CONFIGURATION_IOCTL_INPUT));
input.RequestType:=SCSI_GET_CONFIGURATION_REQUEST_TYPE_ONE;
input.Feature:=0;
getmem(pConfigHeader,32);
ret:=DeviceIoControl(h,IOCTL_CDROM_GET_CONFIGURATION,@input, sizeof(GET_CONFIGURATION_IOCTL_INPUT),pConfigHeader,32, retbc, nil);
if not ret then
begin
result:='Error';
CloseHandle(h);
exit;
end;
for x:=0 to 18 do
if pConfigHeader^.CurrentProfile=SWAP(DiskTypeCode[x]) then
begin
result:=DiskTypeName[x];
break;
end;
freemem(pConfigHeader);
CloseHandle(h);
end;
begin
writeln(GetDiskType('I'));
end.
|