⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isoimage.pas

📁 用于CD/DVD烧录的Delphi源码,包括source和demo
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  for Index := 0 to FTree.PathTableCount - 1 do
  begin
    PathRec := FTree.LittleEndianPathTable.Items[Index];
    Log('SaveImage', 'Write Dir Joliet LPath Name: ' +
      PathRec^.DirectoryIdentifierM);
    FImage.Stream.Write(PathRec^.LengthOfDirectoryIdentifierM, 1);
      //ISO Path Table L
    FImage.Stream.Write(PathRec^.ExtendedAttributeRecordLength, 1);
    PathRec^.JolietLocationOfExtent := (PathRec^.LocationOfExtent +
      SectorOffsett);
    FImage.Stream.Write(PathRec^.JolietLocationOfExtent, 4);
    FImage.Stream.Write(PathRec^.ParentDirectoryNumber, 2);
    TempPchar := PathRec^.DirectoryIdentifierM;
    FImage.Stream.Write(TempPchar^, PathRec^.LengthOfDirectoryIdentifierM);
    if (PathRec^.LengthOfDirectoryIdentifierM mod 2) > 0 then
      FImage.Stream.Write(TempPadChar, 1);
  end;
  StreamPos := FImage.Stream.Position;
  PadBytes := 2048 - (StreamPos - CurrentStreamPointer); // pad out to 2048
  for Index := 1 to PadBytes do
    FImage.Stream.Write(TempPadChar, 1);
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Current Pos After LPath Tables: ' +
    inttostr(FImage.Stream.Position) + ' : ' + inttohex(FImage.Stream.Position, 6)
    + ' : ' + inttostr(Sector));

  CurrentStreamPointer := FImage.Stream.Position;
  Log('SaveImage',
    '|----------------------------------------------------------|');
  // write out big endian path table sector 22
  for Index := 0 to FTree.PathTableCount - 1 do
  begin
    PathRec := FTree.LittleEndianPathTable.Items[Index];
    Log('SaveImage', 'Write Dir Joliet MPath Name: ' +
      PathRec^.DirectoryIdentifierM[0]);
    FImage.Stream.Write(PathRec^.LengthOfDirectoryIdentifierM, 1);
      //ISO Path Table L
    FImage.Stream.Write(PathRec^.ExtendedAttributeRecordLength, 1);
    PathRec^.JolietLocationOfExtentM :=
      SwapDWord(PathRec^.JolietLocationOfExtent);
    FImage.Stream.Write(PathRec^.JolietLocationOfExtentM, 4);
    ReverseByte := SwapWord(PathRec^.ParentDirectoryNumber);
      // reverse to big endian
    FImage.Stream.Write(ReverseByte, 2);
    TempPchar := PathRec^.DirectoryIdentifierM;
    FImage.Stream.Write(TempPchar^, PathRec^.LengthOfDirectoryIdentifierM);
    if (PathRec^.LengthOfDirectoryIdentifierM mod 2) > 0 then
      FImage.Stream.Write(TempPadChar, 1); // padding byte
  end;
  StreamPos := FImage.Stream.Position;
  PadBytes := 2048 - (StreamPos - CurrentStreamPointer); // pad out to 2048
  for Index := 1 to PadBytes do
    FImage.Stream.Write(TempPadChar, 1);
  Log('SaveImage',
    '|----------------------------------------------------------|');
  // end of path table
end;

function TISOImage.SaveImageToDisk(Mode: Integer): Boolean;

var
  StreamPos: Integer;
  StartLBA, FileStartBlock: Integer;
  TempPchar, TempPadChar: Pchar;
  TempString: string;
  ReverseByte: Cardinal;
  Index: Integer;
  PathRec: PPathTableRecord;
  CurrentStreamPointer, PadBytes, Sector: Integer;

begin
  Result := False;
  TempPadChar := $00;
  Sector := 0;
  StartLBA := 22;
  FileStartBlock := 150;
  if FFileName = '' then
  begin
    Log('SaveImage', 'No Filename Entered!');
    exit;
  end;

  case Mode of
    1: FImage := TImageStreamHandler.Create(FFileName, ybfMode1,
      ifCompleteSectors);
    2: FImage := TImageStreamHandler.Create(FFileName, ybfMode2,
      ifCompleteSectors);
  end;

  if (FImage.ISOBookFormat = ybfMode1) then
    Log('SaveImage', 'Yellow book mode 1')
  else if (FImage.ISOBookFormat = ybfMode2) then
    Log('SaveImage', 'Yellow book mode 2');

  Log('SaveImage', 'User data sector size is ' + IntToStr(FImage.SectorDataSize)
    + ' bytes');
  Log('SaveImage', 'Image data offset in image file is ' +
    IntToStr(FImage.ImageOffset) + ' bytes');

  if (FImage.SectorDataSize <> 2048) then
  begin
    Log('SaveImage',
      'sorry, but sector size other than 2048 bytes are not yet supported...');
    Exit;
  end;

  // Setup Directory tree and path tables
  FTree.RefreshPathTables(StartLBA, FileStartBlock);
  FTree.SortDirectories;
  Log('SaveImage', 'Refresh Path Tables');

  // Setup Root Directory tree and Fill Data
  FTree.RootDirectory.FillRootISOData(True);
  FTree.RootDirectory.SetupRootDirectoryLocationOfExtent(FTree.RootDirectory.StartLBA);
  Log('SaveImage', 'Fill Root Directory Data');

  // Start writing image data to file
  Log('SaveImage',
    '|----------------------------------------------------------|');
  FImage.Stream.Write(FISOHeader, sizeof(FISOHeader)); //ISO Header 32k
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Write ISO Header : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //setup primary volume descriptor
  FPVDClass.VolumeIdentifier := FVolID;
  FPVDClass.VolumeSpaceSize := BuildBothEndianDWord(FTree.FileLBA +
    FTree.FileBlocks);
  FPVDClass.PathTableSize := BuildBothEndianDWord(FTree.PathTableLength);
  copymemory(@FPVDClass.Descriptor.Primary.RootDirectory,
    @FTree.RootDirectory.RootISOData, sizeof(TRootDirectoryRecord));
  FImage.Stream.Write(FPVDClass.Descriptor, sizeof(FPVDClass.Descriptor));
    //ISO Primary Volume Descriptor
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Write ISO Primary Volume Descriptor : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //setup secondary volume descriptor
  FSVDClass.VolumeIdentifier := FVolID;
  FSVDClass.VolumeSpaceSize := BuildBothEndianDWord(FTree.FileLBA +
    FTree.FileBlocks);
  FSVDClass.PathTableSize := BuildBothEndianDWord(FTree.JolietPathTableLength);
  copymemory(@FSVDClass.Descriptor.Supplementary.RootDirectory,
    @FTree.RootDirectory.RootISOData, sizeof(TRootDirectoryRecord));
  FSVDClass.ResetRootExtent(FTree.JolietOffsett + 1);
    // make sure it starts in the right place
  FImage.Stream.Write(FSVDClass.Descriptor, sizeof(FSVDClass.Descriptor));
    //ISO Secondary Volume Descriptor
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Write ISO Secondary Volume Descriptor :' +
    inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  // write out boot record descriptor
    // Image.Stream.Write(FBRClass.Descriptor,sizeof(FBRClass.Descriptor));  //ISO Boot Record
    // Log('SaveImage', 'Write ISO Boot Record');

  // write volume set terminator
  FImage.Stream.Write(FVDSTClass, sizeof(FVDSTClass));
    //ISO Volume Set Terminator
  Log('SaveImage', 'Write Volume Set Terminator');

  CurrentStreamPointer := FImage.Stream.Position;
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Current Pos After Volume Descriptors: ' +
    inttostr(CurrentStreamPointer) + ' : ' + inttohex(CurrentStreamPointer, 6) +
    ' : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //write out Primary path table
  WritePathTableData(FImage, CurrentStreamPointer);
  CurrentStreamPointer := FImage.Stream.Position;
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Current Pos After Pri Path Tables: ' +
    inttostr(FImage.Stream.Position) + ' : ' + inttohex(FImage.Stream.Position, 6)
    + ' : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //write out Supplemental path table
  WriteJolietPathTableData(FImage, CurrentStreamPointer);
  CurrentStreamPointer := FImage.Stream.Position;
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Current Pos After Sup Path Tables: ' +
    inttostr(FImage.Stream.Position) + ' : ' + inttohex(FImage.Stream.Position, 6)
    + ' : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  // write directory and file tables start with root sector 23 start
  WriteRootStructureTree(True, FImage, FTree.RootDirectory);
  Log('SaveImage', 'Joliet Offsett: ' + inttostr(FTree.JolietOffsett));

  // write Joliet directory and file tables start with FTree.JolietOffsett
  FTree.RefreshPathTables(FTree.JolietOffsett, FileStartBlock);
  FTree.RootDirectory.FillRootISOData(False);
  WriteRootStructureTree(False, FImage, FTree.RootDirectory);

  CurrentStreamPointer := FImage.Stream.Position;
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Current Pos After Write Structure: ' +
    inttostr(FImage.Stream.Position) + ' : ' + inttohex(FImage.Stream.Position, 6)
    + ' : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //Fill Up Gap to 150 sectors
  PadBytes := (FTree.FileStartBlock * 2048); // get size
  CurrentStreamPointer := FImage.Stream.Position; // get current position
  PadBytes := (PadBytes - CurrentStreamPointer); // pad number
  for Index := 1 to PadBytes do
    FImage.Stream.Write(TempPadChar, 1); // pad out sectors
  Log('SaveImage',
    '|----------------------------------------------------------|');

  // load up and write out files data
  WriteFileData(FImage, FTree.RootDirectory);
  CurrentStreamPointer := FImage.Stream.Position;
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Current Pos After Write File Data: ' +
    inttostr(FImage.Stream.Position) + ' : ' + inttohex(FImage.Stream.Position, 6)
    + ' : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  FImage.Free;
  FImage := nil;
  Result := True;
end;



function TISOImage.SaveDVDImageToDisk: Boolean;

var
  StreamPos: Integer;
  StartLBA, FileStartBlock: Integer;
  TempPchar, TempPadChar: Pchar;
  TempString: string;
  ReverseByte: Cardinal;
  Index: Integer;
  PathRec: PPathTableRecord;
  CurrentStreamPointer, PadBytes, Sector: Integer;

begin
  Result := False;
  TempPadChar := $00;
  Sector := 0;
  StartLBA := 256;
  FileStartBlock := 300;
  if FFileName = '' then
  begin
    Log('SaveImage', 'No Filename Entered!');
    exit;
  end;

  FImage := TImageStreamHandler.Create(FFileName, ybfMode1, ifCompleteSectors);

  if (FImage.ISOBookFormat = ybfMode1) then
    Log('SaveImage', 'Yellow book mode 1')
  else if (FImage.ISOBookFormat = ybfMode2) then
    Log('SaveImage', 'Yellow book mode 2');

  Log('SaveImage', 'User data sector size is ' + IntToStr(FImage.SectorDataSize)
    + ' bytes');
  Log('SaveImage', 'Image data offset in image file is ' +
    IntToStr(FImage.ImageOffset) + ' bytes');

  if (FImage.SectorDataSize <> 2048) then
  begin
    Log('SaveImage',
      'sorry, but sector size other than 2048 bytes are not yet supported...');
    Exit;
  end;

  // Setup Directory tree and path tables (move to 256 for dvd video)
  FTree.RefreshPathTables(StartLBA, FileStartBlock);
  FTree.SortDirectories;
  Log('SaveImage', 'Refresh Path Tables');

  // Setup Root Directory tree and Fill Data
  FTree.RootDirectory.FillRootISOData(True);
  FTree.RootDirectory.SetupRootDirectoryLocationOfExtent(FTree.RootDirectory.StartLBA);
  Log('SaveImage', 'Fill Root Directory Data');

  // Start writing image data to file
  Log('SaveImage',
    '|----------------------------------------------------------|');
  FImage.Stream.Write(FISOHeader, sizeof(FISOHeader)); //ISO Header 32k
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Write ISO Header : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //setup primary volume descriptor
  FPVDClass.VolumeIdentifier := FVolID;
  FPVDClass.VolumeSpaceSize := BuildBothEndianDWord(FTree.FileLBA +
    FTree.FileBlocks);
  FPVDClass.PathTableSize := BuildBothEndianDWord(FTree.PathTableLength);
  copymemory(@FPVDClass.Descriptor.Primary.RootDirectory,
    @FTree.RootDirectory.RootISOData, sizeof(TRootDirectoryRecord));
  FImage.Stream.Write(FPVDClass.Descriptor, sizeof(FPVDClass.Descriptor));
    //ISO Primary Volume Descriptor
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Write ISO Primary Volume Descriptor : ' + inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  //setup secondary volume descriptor
  FSVDClass.VolumeIdentifier := FVolID;
  FSVDClass.VolumeSpaceSize := BuildBothEndianDWord(FTree.FileLBA +
    FTree.FileBlocks);
  FSVDClass.PathTableSize := BuildBothEndianDWord(FTree.JolietPathTableLength);
  copymemory(@FSVDClass.Descriptor.Supplementary.RootDirectory,
    @FTree.RootDirectory.RootISOData, sizeof(TRootDirectoryRecord));
  FSVDClass.ResetRootExtent(FTree.JolietOffsett + 1);
    // make sure it starts in the right place
  FImage.Stream.Write(FSVDClass.Descriptor, sizeof(FSVDClass.Descriptor));
    //ISO Secondary Volume Descriptor
  Sector := (FImage.Stream.Position div FImage.SectorDataSize);
  Log('SaveImage', 'Write ISO Secondary Volume Descriptor :' +
    inttostr(Sector));
  Log('SaveImage',
    '|----------------------------------------------------------|');

  // write out boot record descriptor
    // Image.Stream.Write(FBRClass.Descriptor,sizeof(FBRClass.Descriptor));  //ISO Boot Record

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -