Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > производитель CD


Автор: offline 25.11.2005, 17:12
Кому ни будь удалось считать производителя или тип зприсываемого слоя с CD? Если да, то подскажите как это сделать.

Автор: Snowy 25.11.2005, 17:33
C CD это с диска или с CR-ROM драйва?
Если с драйва, то пример есть в DRKB.
Если с диска... А там есть такая информация?

Автор: offline 25.11.2005, 17:36
Нес с драйва, а именно с CD-R диска. Да, там такая инфа лежит, вот только как до нее достучаться?

Автор: _hunter 25.11.2005, 17:40
судя по:
Цитата
или тип зприсываемого слоя с CD

таки болванки...
хотя про инфу о производителе я тоже не слышал...

Автор: offline 25.11.2005, 18:39
тогда откуда эти данные Nero CD-DVD Speed берет smile? именна с болванки

Автор: RA 25.11.2005, 22:16
Я может скажу глупость smile , но всёже скажу.
Может инфа объэтом записанна на нулевой дорожке.

Автор: offline 25.11.2005, 22:40
честно говоря я не знаю, где записывается это инфа, но считать очень хочется smile
>RAdmin
а как ее от туда вычитать?

Автор: offline 28.11.2005, 14:28
есть у кого какие идеи ?

Автор: offline 6.12.2005, 17:12
Я тут узнал, что нужная мне информация хранится в TOC, а не в нулевой дорожке, а уже из ТОС по таблицам ATIP получить производителя диска...

А вот как до ТОС можно добраться и прочитать его?

Автор: offline 6.12.2005, 20:17

Вот тут

http://www.replikator.ru/context.php?a_ID_CONTEXT=416&a_ID_MENU=10&ID_SITE=1

есть расшифровка таблиц ATIP (В таблице указаны НАЧАЛА диапазонов ! Единицы фреймов означают ТИП материала носителя.)
А вот как получить эти данные?

Автор: Snowy 6.12.2005, 20:44
http://forum.vingrad.ru/index.php?showtopic=54675
http://forum.vingrad.ru/index.php?showtopic=42563

Автор: offline 6.12.2005, 23:52
>Snowy

смотрел я там, но так и ничего не нашел smile

Автор: Snowy 7.12.2005, 10:42
Цитата(kirilllius @ 6.12.2005, 23:52)
смотрел я там, но так и ничего не нашел

А я облазал MSDN и тоже ничего не нашел.
Вся инфа, касающаяся именно диска, а не его содержимого находится в этой структуре:
CDROM_TOC_ATIP_DATA_BLOCK
Код

typedef struct _CDROM_TOC_ATIP_DATA_BLOCK {
  UCHAR  CdrwReferenceSpeed : 3;
  UCHAR  Reserved3          : 1;
  UCHAR  WritePower         : 3;
  UCHAR  True1              : 1;
  UCHAR  Reserved4       : 6;
  UCHAR  UnrestrictedUse : 1;
  UCHAR  Reserved5       : 1;
  UCHAR  A3Valid   : 1;
  UCHAR  A2Valid   : 1;
  UCHAR  A1Valid   : 1;
  UCHAR  DiscSubType : 3;
  UCHAR  IsCdrw    : 1;
  UCHAR  True2     : 1;
  UCHAR  Reserved7;
  UCHAR  LeadInMsf[3];
  UCHAR  Reserved8;
  UCHAR  LeadOutMsf[3];
  UCHAR  Reserved9;
  UCHAR  A1Values[3];
  UCHAR  Reserved10;
  UCHAR  A2Values[3];
  UCHAR  Reserved11;
  UCHAR  A3Values[3];
  UCHAR  Reserved12;
} CDROM_TOC_ATIP_DATA_BLOCK, *PCDROM_TOC_ATIP_DATA_BLOCK;

Я не вижу, где здесь может спрятаться производитель...

Автор: Girder 7.12.2005, 10:52
Да дествительно... где-то там поле отведенно. Но у меня например ни разу Nero не показал инфу о производителе. С чего все взяли что производитель будет заполнять енто(тем более честно енто делать) - 1? Зачем существует описалово... как по внешнему виду определить кто дествительно является производетелем - 2? Зачем существует оборудование... которое по поверхности диска определяет уникальным штамп оборудования на котором произведен диск(ну т.е. как отпечатки пальцев) - 3?

Автор: offline 7.12.2005, 14:15
>Snowy

а как получить эти значения, как посмотреть, что там?
UCHAR A1Values[3];
UCHAR A2Values[3];
UCHAR A3Values[3];


а как это на Delphi будет выглядеть, а то я с С++ не дружу smile

Автор: Snowy 7.12.2005, 15:08
Если этот код работает, то так:
http://forum.vingrad.ru/index.php?showtopic=42563&view=findpost&p=347230

Автор: offline 7.12.2005, 17:56
а VB кто нибудь знает?
вот я нашел кусок кода программки

Код

On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_CDROMDrive")
For Each objItem in colItems
    Wscript.Echo "Availability: " & objItem.Availability
    For Each strCapability in objItem.Capabilities
        Wscript.Echo "Capability: "& strCapability
    Next
    Wscript.Echo "Caption: " & objItem.Caption
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "Drive: " & objItem.Drive
    Wscript.Echo "Manufacturer: " & objItem.Manufacturer
    Wscript.Echo "Media Loaded: " & objItem.MediaLoaded
    Wscript.Echo "Media Type: " & objItem.MediaType
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID
    Wscript.Echo "SCSI Bus: " & objItem.SCSIBus
    Wscript.Echo "SCSI Logical Unit: " & objItem.SCSILogicalUnit
    Wscript.Echo "SCSI Port: " & objItem.SCSIPort
    Wscript.Echo "SCSI Target ID: " & objItem.SCSITargetId
Next


подскажите, что он делает?

Автор: Snowy 7.12.2005, 18:03
Так это ж WMI. Ты опять же узнаешь производителя драйва, но никак не диска.

Автор: offline 8.12.2005, 17:40
все что нужно узнал smile тема закрыта

Автор: Snowy 8.12.2005, 17:41
Цитата(kirilllius @ 8.12.2005, 17:40)
все что нужно узнал  тема закрыта

Нет уж, сначала доложи, что узнал.

Автор: offline 8.12.2005, 19:33
ну тогда две банки сгущенки для востоновления умственной деятельности smile

Есть такой компонент как Magic CD Burner (BinaryMagic) вот он и читает это. Только его приручить нужно, тяжел он в освоении.

Автор: MetalFan 24.1.2007, 11:59
если это кому еще интересно,
вот пример, позволяющий считывать ATIP, в частности ID производителя, которым является "длительность" диска.
Код

  const
    CDROM_READ_TOC_EX_FORMAT_ATIP= $4;
    IOCTL_CDROM_READ_TOC_EX = $24054;
  type
    CDROM_TOC_ATIP_DATA_BLOCK =record
      a1:  byte ;
        //UCHAR  CdrwReferenceSpeed : 3;
        //UCHAR  Reserved3          : 1;
        //UCHAR  WritePower        : 3;
        //UCHAR  True1              : 1;
      a2:  byte;
          //UCHAR  Reserved4      : 6;
          //UCHAR  UnrestrictedUse : 1;
          //UCHAR  Reserved5      : 1;
      a3:  byte;
          //UCHAR  A3Valid  : 1;
          // UCHAR  A2Valid  : 1;
          //UCHAR  A1Valid  : 1;
          //UCHAR  Reserved6 : 3;
          //UCHAR  IsCdrw    : 1;
          //UCHAR  True2    : 1;
      Reserved7:Byte;
      LeadInMsf:array[0..2]of Byte;
      Reserved8:Byte;
      LeadOutMsf:array[0..2]of Byte;
      Reserved9:Byte ;
      A1Values:array[0..2]of Byte;
      Reserved10:Byte ;
      A2Values:array[0..2]of Byte;
      Reserved11:Byte ;
      A3Values :array[0..2]of Byte;
      Reserved12:Byte;
    end;
    CDROM_READ_TOC_EX = record
      par1: byte;
      //Format : UCHAR:4 ;
      // Reserved1 : UCHAR:3;
      // Msf : UCHAR:1 ;
      SessionTrack:Byte;
      Reserved2:Byte ;
      Reserved3:Byte;
    end;
    CDROM_TOC_ATIP_DATA =record
        Length:array [0..1] of Byte;
        Reserved1:Byte;
        Reserved2:Byte;
        Descriptors: array [0..0] of CDROM_TOC_ATIP_DATA_BLOCK;
    end;


  function GetCDDiskManufactureID( ADriveLetter: Char; var AID: string ): Boolean;
  var
    hCDDevice : THandle;
    in_data: CDROM_READ_TOC_EX;
    out_size: DWORD;
    out_data: CDROM_TOC_ATIP_DATA ;
  begin

    AID := '';
    G_LAST_ERROR := '';
    Result := False;

    FillChar( in_data,SizeOf(in_data),0);
    FillChar( out_data,SizeOf(out_data),0);
    in_data.par1 := CDROM_READ_TOC_EX_FORMAT_ATIP or (1 shl 7);
    in_data.SessionTrack :=  0;
    hCDDevice := CreateFile( PChar( '\\.\'+ADriveLetter+':'),
                                    GENERIC_READ,
                                    FILE_SHARE_READ or FILE_SHARE_WRITE,
                                    nil,
                                    OPEN_EXISTING,
                                    FILE_ATTRIBUTE_NORMAL, 0 );
    if hCDDevice <> INVALID_HANDLE_VALUE then
    begin
       Result := DeviceIoControl( hCDDevice,
                                  IOCTL_CDROM_READ_TOC_EX,
                                  @in_data,
                                  sizeof(in_data),
                                  @out_data,
                                  sizeof(out_data),
                                  out_size,
                                  nil );

       if Result then
         AID := Format( '%.2d%.2d%.2d', [ out_data.Descriptors[0].LeadInMsf[0],
                                          out_data.Descriptors[0].LeadInMsf[1],
                                          out_data.Descriptors[0].LeadInMsf[2]])
       else
         G_LAST_ERROR := SysErrorMessage( GetLastError );

      CloseHandle( hCDDevice );
   end
   else
     G_LAST_ERROR := SysErrorMessage( GetLastError )
  end;

думаю разобраться в коде не сложно.
глобальная строковая переменная исполользуется для получения сообщения об ошибке.
пример кода подсмотрен на delphikingdom, причесан и адаптирован под собственные нужды)

Автор: beginner2 23.2.2007, 15:18
Скажите, пожалуйста, а почему IOCTL_CDROM_READ_TOC_EX = $24054?

Автор: MetalFan 25.2.2007, 19:10
beginner2, а чему оно должно быть равно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)