Цитата(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;
|
|