Skip to content

Commit 99662b2

Browse files
committed
Ensure full file extraction with header
1 parent 743fa8f commit 99662b2

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

Source/DiskImageManager.lpi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<MajorVersionNr Value="2"/>
3232
<MinorVersionNr Value="5"/>
3333
<RevisionNr Value="1"/>
34-
<BuildNr Value="105"/>
34+
<BuildNr Value="106"/>
3535
<StringTable CompanyName="Envy Technologies" InternalName="Disk Image Manager" LegalCopyright="Copyright 2002-2023 Damien Guard." OriginalFilename="DiskImageManager.exe" ProductName="Disk Image Manager"/>
3636
</VersionInfo>
3737
<BuildModes Count="2">

Source/DiskImageManager.res

0 Bytes
Binary file not shown.

Source/filesystem.pas

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ TDSKFile = class(TObject)
5858
HeaderType: string;
5959
Checksum: boolean;
6060
Size: integer;
61+
HeaderSize: integer;
6162
Meta: string;
6263

6364
function GetData(WithHeader: boolean): TDiskByteArray;
@@ -198,6 +199,7 @@ function TDSKFileSystem.ReadFileEntry(Data: array of byte; Offset: integer): TDS
198199
ReadOnly := Data[Offset + READONLY_OFFSET] > 127;
199200
System := Data[Offset + SYSTEM_OFFSET] > 127;
200201
Archived := Data[Offset + ARCHIVED_OFFSET] > 127;
202+
HeaderSize := 0;
201203

202204
Extent := Data[Offset + EXTENT_LOW];
203205
AllocOffset := Offset + ALLOCATION_OFFSET;
@@ -250,6 +252,7 @@ procedure TDSKFileSystem.TryAMSDOSHeader(Data: array of byte; DiskFile: TDSKFile
250252
DiskFile.Checksum := True;
251253
DiskFile.HeaderType := 'AMSDOS';
252254
DiskFile.Size := Data[64] + (Data[65] << 8) + (Data[66] << 16);
255+
DiskFile.HeaderSize := 128;
253256

254257
LoadAddr := Data[21] + (Data[22] << 8);
255258
ExecAddr := Data[26] + (Data[27] << 8);
@@ -286,6 +289,7 @@ procedure TDSKFileSystem.TryPlus3DOSHeader(Data: array of byte; DiskFile: TDSKFi
286289
DiskFile.Checksum := CalcChecksum = Data[127];
287290
DiskFile.HeaderType := Sig;
288291
DiskFile.Size := Data[11] + (Data[12] << 8) + (Data[13] << 16) + (Data[14] << 24);
292+
DiskFile.HeaderSize := 128;
289293

290294
Length := Data[16] + (Data[17] << 8);
291295
Param1 := Data[18] + (Data[19] << 8);
@@ -322,7 +326,7 @@ destructor TDSKFile.Destroy;
322326
inherited Destroy;
323327
end;
324328

325-
function TDSKFile.GetData(WithHeader:boolean): TDiskByteArray;
329+
function TDSKFile.GetData(WithHeader: boolean): TDiskByteArray;
326330
var
327331
Block, BytesLeft, TargetIdx, BlockSize, SectorsLeft, SectorsPerBlock: integer;
328332
Disk: TDSKDisk;
@@ -332,7 +336,7 @@ function TDSKFile.GetData(WithHeader:boolean): TDiskByteArray;
332336
FileData := nil;
333337
SetLength(FileData, Size);
334338

335-
BytesLeft := Size;
339+
BytesLeft := Size + HeaderSize;
336340
TargetIdx := 0;
337341
Disk := FParentFileSystem.FParentDisk;
338342
BlockSize := Disk.Specification.GetBlockSize();
@@ -366,9 +370,9 @@ function TDSKFile.GetData(WithHeader:boolean): TDiskByteArray;
366370

367371
// Strip any headers
368372
if (not WithHeader) and ((HeaderType = 'PLUS3DOS') or (HeaderType = 'AMSDOS')) then
369-
Result := Copy(FileData, 128, Size - 128)
373+
Result := Copy(FileData, HeaderSize, Size - HeaderSize)
370374
else
371-
Result := FileData;
375+
Result := Copy(FileData, Size);
372376
end;
373377

374378
end.

0 commit comments

Comments
 (0)