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


Автор: beginner2 22.2.2007, 20:16
Здравствуйте!

Уважаемые программисты, подскажите, пожалуйста, каким образом можно найти ADIP (или physical format information 00h, как пишет неро) DVD-диска. 

Изучил страницу http://forum.vingrad.ru/topic-42563/hl/ioctl_cdrom_read_toc_ex/index.html, но так и не понял, почему IOCTL_CDROM_READ_TOC_EX равно $24054, и каким образом можно переделать код для работы с DVD.

Автор: beginner2 23.2.2007, 14:33
Нашел здесь структуру dvd http://msdn2.microsoft.com/en-us/library/ms804554.aspx, подскажите, пожалуйста, только чему надо приравнять IOCTL_DVD_READ_STRUCTURE 

Автор: beginner2 27.2.2007, 23:06
Разобрался

Автор: MetalFan 28.2.2007, 09:35
beginner2, расскажи ;)

Автор: beginner2 28.2.2007, 19:03
Ой, в двух словах-то и не объяснишь smile 

В общем,  структура dvd описана здесь http://msdn2.microsoft.com/en-us/library/ms809044.aspx, а что касается константы IOCTL_DVD_READ_STRUCTURE, то из ddk xp получил, что она равна $335140.

Автор: MetalFan 1.3.2007, 09:07
beginner2, а пример кода для получения привести? для потомков)

Автор: DaDe 29.6.2007, 09:32
Ну собствено кусок кода, как и говорил

Код

 const
    IOCTL_DVD_READ_STRUCTURE = $335140;
 type
    DVD_STRUCTURE_FORMAT=(DvdPhysicalDescriptor,
                          DvdCopyrightDescriptor,
                          DvdDiskKeyDescriptor,
                          DvdBCADescriptor,
                          DvdManufacturerDescriptor,
                          DvdMaxDescriptor);
    DVD_SESSION_ID=integer;
    DVD_READ_STRUCTURE = record
      BlockByteOffset:LARGE_INTEGER;
      Format:DVD_STRUCTURE_FORMAT;
      SessionId:DVD_SESSION_ID;
      LayerNumber:Byte;
    end;

    _DVD_MANUFACTURER_DESCRIPTOR = record
      ManufacturingInformation: array [0..2047] of Byte;
    end;
    DVD_MANUFACTURER_DESCRIPTOR  = _DVD_MANUFACTURER_DESCRIPTOR;
    PDVD_MANUFACTURER_DESCRIPTOR = ^DVD_MANUFACTURER_DESCRIPTOR;

function GetADIP(CD: Char; var dout_data: DVD_MANUFACTURER_DESCRIPTOR): Boolean;
  var
    hCDDevice : THandle;
    din_data: DVD_READ_STRUCTURE;
    dout_size: DWORD;
begin
  Result := False;
  FillChar(din_data,SizeOf(din_data),0);
  FillChar(dout_data,SizeOf(dout_data),0);

  hCDDevice := CreateFile( PChar( '\\.\'+CD+':'),
                                  GENERIC_READ,
                                  FILE_SHARE_READ or FILE_SHARE_WRITE,
                                  nil,
                                  OPEN_EXISTING,
                                  FILE_ATTRIBUTE_NORMAL, 0 );
  if hCDDevice <> INVALID_HANDLE_VALUE then
    begin
      din_data.BlockByteOffset.QuadPart := 0;
      din_data.SessionId := 1;
      din_data.Format:=DvdPhysicalDescriptor;
      din_data.LayerNumber := 0;
      if DeviceIoControl(hCDDevice,
                         IOCTL_DVD_READ_STRUCTURE,
                         @din_data,
                         sizeof(din_data),
                         @dout_data,
                         sizeof(dout_data),//2048
                         dout_size,
                         nil ) then
        result:=true;
    end;
  CloseHandle( hCDDevice );
end;

Автор: MetalFan 29.6.2007, 11:30
непонятка в коде.
буфер под DvdManufacturerDescriptor, а запрашивается DvdPhysicalDescriptor
переделал под структуру DVD_LAYER_DESCRIPTOR:

Код

 const
    IOCTL_DVD_READ_STRUCTURE = $335140;
 type
    DVD_STRUCTURE_FORMAT=(DvdPhysicalDescriptor,
                          DvdCopyrightDescriptor,
                          DvdDiskKeyDescriptor,
                          DvdBCADescriptor,
                          DvdManufacturerDescriptor,
                          DvdMaxDescriptor);
    DVD_SESSION_ID=integer;
    DVD_READ_STRUCTURE = record
      BlockByteOffset:LARGE_INTEGER;
      Format:DVD_STRUCTURE_FORMAT;
      SessionId:DVD_SESSION_ID;
      LayerNumber:Byte;
    end;

    PDVD_LAYER_DESCRIPTOR = ^_DVD_LAYER_DESCRIPTOR;
    _DVD_LAYER_DESCRIPTOR = record
      BookVersionBookType      : UCHAR; //UCHAR  BookVersion : 4; UCHAR  BookType : 4;
      MinimumRateDiskSize  : UCHAR; //UCHAR  MinimumRate : 4; UCHAR  DiskSize : 4;
      LayerTypeTrackPathNumberOfLayersReserved1: UCHAR;
      //UCHAR  LayerType : 4; UCHAR  TrackPath : 1; UCHAR  NumberOfLayers : 2; UCHAR  Reserved1 : 1;
      TrackDensityLinearDensity : UCHAR; //UCHAR  TrackDensity : 4; UCHAR  LinearDensity : 4;
      StartingDataSector: ULONG;
      EndDataSector: ULONG;
      EndLayerZeroSector: ULONG;
      Reserved5BCAFlag: UCHAR; //UCHAR  Reserved5 : 7; UCHAR  BCAFlag : 1;
      Reserved6: UCHAR;
    end;



function GetLayerDescr(CD: Char; var dout_data: _DVD_LAYER_DESCRIPTOR): Boolean;
  var
    hCDDevice : THandle;
    din_data: DVD_READ_STRUCTURE;
    dout_size: DWORD;
begin
  Result := False;
  FillChar(din_data,SizeOf(din_data),0);
  FillChar(dout_data,SizeOf(dout_data),0);
  hCDDevice := CreateFile( PChar( '\\.\'+CD+':'),
                                  GENERIC_READ,
                                  FILE_SHARE_READ or FILE_SHARE_WRITE,
                                  nil,
                                  OPEN_EXISTING,
                                  FILE_ATTRIBUTE_NORMAL, 0 );
  if hCDDevice <> INVALID_HANDLE_VALUE then
    begin
      din_data.BlockByteOffset.QuadPart := 0;
      din_data.SessionId := 1;
      din_data.Format := DvdPhysicalDescriptor;
      din_data.LayerNumber := 0;
      if DeviceIoControl(hCDDevice,
                         IOCTL_DVD_READ_STRUCTURE,
                         @din_data,
                         sizeof(din_data),
                         @dout_data,
                         sizeof(dout_data),
                         dout_size,
                         nil ) then
        result:=true;
    end;
  CloseHandle( hCDDevice );
end;

Автор: DaDe 29.6.2007, 13:46
Цитата(MetalFan @  29.6.2007,  11:30 Найти цитируемый пост)
непонятка в коде.

Ну тогда и UCHAR->Byte , ULONG->Cardinal так будет как-то ближе Delphi

Автор: MetalFan 29.6.2007, 15:12
Цитата(DaDe @  29.6.2007,  14:46 Найти цитируемый пост)
так будет как-то ближе Delphi

тогда как-то так:
Код

 const
    IOCTL_DVD_READ_STRUCTURE = $335140;
 type
    DVD_STRUCTURE_FORMAT=(DvdPhysicalDescriptor,
                          DvdCopyrightDescriptor,
                          DvdDiskKeyDescriptor,
                          DvdBCADescriptor,
                          DvdManufacturerDescriptor,
                          DvdMaxDescriptor);
    DVD_SESSION_ID=integer;
    DVD_READ_STRUCTURE = record
      BlockByteOffset:LARGE_INTEGER;
      Format:DVD_STRUCTURE_FORMAT;
      SessionId:DVD_SESSION_ID;
      LayerNumber:Byte;
    end;

    PDVD_LAYER_DESCRIPTOR = ^_DVD_LAYER_DESCRIPTOR;
    _DVD_LAYER_DESCRIPTOR = record
      BookVersionBookType      : UCHAR; //UCHAR  BookVersion : 4; UCHAR  BookType : 4;
      MinimumRateDiskSize  : UCHAR; //UCHAR  MinimumRate : 4; UCHAR  DiskSize : 4;
      LayerTypeTrackPathNumberOfLayersReserved1: UCHAR;
      //UCHAR  LayerType : 4; UCHAR  TrackPath : 1; UCHAR  NumberOfLayers : 2; UCHAR  Reserved1 : 1;
      TrackDensityLinearDensity : UCHAR; //UCHAR  TrackDensity : 4; UCHAR  LinearDensity : 4;
      StartingDataSector: ULONG;
      EndDataSector: ULONG;
      EndLayerZeroSector: ULONG;
      Reserved5BCAFlag: UCHAR; //UCHAR  Reserved5 : 7; UCHAR  BCAFlag : 1;
      Reserved6: UCHAR;
    end;

    TDVDLayerDescriptor = record
      BookVersion : Byte; {4}
      BookType    : Byte; {4}
      {}
      MinimumRate : Byte; {4}
      DiskSize    : Byte; {4}
      {}
      LayerType   : Byte; {4}
      TrackPath   : Byte; {1}
      NumberOfLayers : Byte; {2}
      Reserved1: UCHAR; {1}
      {}
      TrackDensity  : Byte; {4}
      LinearDensity : Byte; {4}
      {}
      StartingDataSector: Cardinal;
      EndDataSector : Cardinal;
      EndLayerZeroSector: Cardinal;
      {}
      Reserved5     : Byte; {7}
      BCAFlag       : Byte; {1}
      {}
      Reserved6     : Byte;
    end;

    procedure ToDVDLayerDescriptor( ADVDLayerDescr: _DVD_LAYER_DESCRIPTOR; var ADVDLayerDescrOut: TDVDLayerDescriptor );
    begin
      ADVDLayerDescrOut.BookVersion := ADVDLayerDescr.BookVersionBookType and $F;
      ADVDLayerDescrOut.BookType    := ADVDLayerDescr.BookVersionBookType shr $4;
      ADVDLayerDescrOut.MinimumRate := ADVDLayerDescr.MinimumRateDiskSize and $F;
      ADVDLayerDescrOut.DiskSize    := ADVDLayerDescr.MinimumRateDiskSize shr $4;
      ADVDLayerDescrOut.LayerType   := ADVDLayerDescr.LayerTypeTrackPathNumberOfLayersReserved1 and $F;
      ADVDLayerDescrOut.TrackPath   := ADVDLayerDescr.LayerTypeTrackPathNumberOfLayersReserved1 shr $4 and $1;
      ADVDLayerDescrOut.NumberOfLayers := ADVDLayerDescr.LayerTypeTrackPathNumberOfLayersReserved1  shr $5 and $3;
      ADVDLayerDescrOut.Reserved1      := ADVDLayerDescr.LayerTypeTrackPathNumberOfLayersReserved1  shr $7;
      ADVDLayerDescrOut.TrackDensity   := ADVDLayerDescr.TrackDensityLinearDensity and $F;
      ADVDLayerDescrOut.LinearDensity  := ADVDLayerDescr.TrackDensityLinearDensity shr $4;
      ADVDLayerDescrOut.StartingDataSector := ADVDLayerDescr.StartingDataSector;
      ADVDLayerDescrOut.EndDataSector      := ADVDLayerDescr.EndDataSector;
      ADVDLayerDescrOut.EndLayerZeroSector := ADVDLayerDescr.EndLayerZeroSector;

      ADVDLayerDescrOut.Reserved5      := ADVDLayerDescr.Reserved5BCAFlag and $7F; 
      ADVDLayerDescrOut.BCAFlag        := ADVDLayerDescr.Reserved5BCAFlag shr $7;
      ADVDLayerDescrOut.Reserved6      := ADVDLayerDescr.Reserved6;

    end;


function GetADIP(CD: Char; var ADVDLayerDescr: TDVDLayerDescriptor ): Boolean;
  var
    hCDDevice : THandle;
    din_data: DVD_READ_STRUCTURE;
    dout_size: DWORD;
    dout_data: _DVD_LAYER_DESCRIPTOR;
begin
  Result := False;
  FillChar(din_data,SizeOf(din_data),0);
  FillChar(dout_data,SizeOf(dout_data),0);
  FillChar(ADVDLayerDescr,SizeOf(ADVDLayerDescr),0);  
  hCDDevice := CreateFile( PChar( '\\.\'+CD+':'),
                                  GENERIC_READ,
                                  FILE_SHARE_READ or FILE_SHARE_WRITE,
                                  nil,
                                  OPEN_EXISTING,
                                  FILE_ATTRIBUTE_NORMAL, 0 );
  if hCDDevice <> INVALID_HANDLE_VALUE then
    begin
      din_data.BlockByteOffset.QuadPart := 0;
      din_data.SessionId := 1;
      din_data.Format := DvdPhysicalDescriptor;
      din_data.LayerNumber := 0;
      if DeviceIoControl(hCDDevice,
                         IOCTL_DVD_READ_STRUCTURE,
                         @din_data,
                         sizeof(din_data),
                         @dout_data,
                         sizeof(dout_data),
                         dout_size,
                         nil ) then
      begin
        Result := True;
        ToDVDLayerDescriptor( dout_data, ADVDLayerDescr );
      end;
    end;
  CloseHandle( hCDDevice );
end;

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