Определение типа CD носителя

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 24 Dec 2008.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Вот решил выложить одну свою функцию для определения типа носителя вставленного в DVD-ROM.
    Из-за специфики работы дивидиромов - они не показывают тип диска если не поддерживают его.
    т.е. если DVD не пише DVD-R то все вставленные не пустые DVD-R диски будут показываться как DVD-ROM.

    Мож кому пригодиться )
    Code:
    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.
    
    
     
    2 people like this.
  2. HBWS

    HBWS Member

    Joined:
    26 Nov 2010
    Messages:
    226
    Likes Received:
    22
    Reputations:
    0
    Подогнал другу (часто приходится работать с приводами) - он был безмерно счастлив. Спасибо
     
  3. ad3ud

    ad3ud New Member

    Joined:
    8 Dec 2010
    Messages:
    4
    Likes Received:
    0
    Reputations:
    0
    Не хочу оскорблять вашу личность, но спасибо мог бы и в личку сказать...
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ох ёё. Да этому коду уже больше 2-х лет.
    Мне стыдно за такое оформление (((
     
  5. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    А почему не через IMAPI ?
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 _nic в то время не нашел доки по получению этих данных через IMAPI
    Кстати, если есть линк, кинь плиз.

    да и к томуже этот способ более изкоуровневый
     
  7. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    В МСДН конечно много че запутанного ,но в принципе все есть.
    http://msdn.microsoft.com/en-us/library/aa364854(VS.85).aspx метод get_CurrentPhysicalMediaType
     
    1 person likes this.
  8. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    не по теме но полезно может быть
    http://www.insidepro.com/kk/020/020r.shtml
     
    _________________________