📄 isoimage.pas
字号:
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 + -