Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Определение типа CD носителя (https://forum.antichat.xyz/showthread.php?t=97674)

slesh 24.12.2008 01:05

Определение типа 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.



Время: 02:11