Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program PackageInfoConverter;
- Uses
- SysUtils, Crt, FileUtil;
- Type
- Byt4 = Array[1..4] of Byte;
- Const
- RefMagic : Byt4 = ($28, $55, $56, $06);
- RefEOF : Byt4 = ($FF,$FF,$FF,$FF);
- RefAPPITEM : Array[1..8] of Byte = ($61,$70,$70,$69,$74,$65,$6D,$73);
- Var
- LoadedFile : File Of Byte;
- SavedFile : File Of Byte;
- Buffer32 : Byt4;
- Buffer64 : Array[1..8] of Byte;
- BufferSHA : Array[1..20] of Byte;
- BufferGEN : Array of Byte;
- BufferByte : Byte;
- StartOffset : Int64;
- PackageSize : Int64;
- CheckFlag : Boolean;
- Readed :Integer;
- CountEOF, CountPackage : ShortInt;
- EntryCount : Integer;
- Function CheckByte(Const Group1, Group2 : Byt4) : Boolean;
- Var
- I : Integer;
- Begin
- Result := True;
- For I := 1 To 4 Do If Group1[I] <> Group2[I] Then Result := False;
- end;
- begin
- WriteLN('Steam Packageinfo.VDF converter');
- // Check if the original file exists
- If FileExists('packageinfo.vdf') Then Begin
- // Load the magic number from the original file
- AssignFile(LoadedFile, 'packageinfo.vdf');
- Reset(LoadedFile);
- BlockRead(LoadedFile,Buffer32[1], 4, Readed);
- CheckFlag := False;
- // Check if the magic number is correct
- If (Readed <> 4) Or (CheckByte(Buffer32, RefMagic) = False) Then
- WriteLn('Wrong packageinfo version')
- Else Begin
- CheckFlag := True;
- // Save the magic number and the universe on the new file
- AssignFile(SavedFile, 'packageinfo.vdf.new');
- Rewrite(SavedFile);
- Buffer32[1] := $27;
- BlockWrite(SavedFile, Buffer32[1],4);
- BlockRead(LoadedFile, Buffer32[1],4);
- BlockWrite(SavedFile, Buffer32[1],4);
- // Read the first 4 byte of Package
- BlockRead(LoadedFile, Buffer32[1], 4, Readed);
- If Readed = 4 Then
- CheckFlag := True
- Else
- CheckFlag := False;
- EntryCount := 0;
- While (CheckFlag = True) And (CheckByte(Buffer32, RefEOF) = False) Do Begin
- Inc(EntryCount);
- // Write Package
- BlockWrite(SavedFile, Buffer32[1],4);
- //Read and write Sha1;
- BlockRead(LoadedFile, BufferSHA[1], 20, Readed);
- If Readed <> 20 Then
- CheckFlag := False
- Else
- BlockWrite(SavedFile, BufferSHA[1], 20);
- // Read and write ChangeNumber
- BlockRead(LoadedFile, Buffer32[1],4, Readed);
- If Readed <> 4 Then
- CheckFlag := False
- Else
- BlockWrite(SavedFile, Buffer32[1],4);
- // Read and ignore picsToken
- BlockRead(LoadedFile, Buffer64[1], 8, Readed);
- If Readed <> 8 Then
- CheckFlag := False;
- // Load bytes and check if AppItems or EOF ($FFFFFFFF) strings are found
- CountPackage := 0;
- CountEOF := 0;
- StartOffset := FilePos(loadedFile);
- Repeat
- BlockRead(LoadedFile,BufferByte, 1 , Readed);
- If Readed <> 1 Then
- CheckFlag := False
- Else Begin
- If BufferByte = RefAPPITEM[CountPackage +1] Then
- Inc(CountPackage)
- Else CountPackage := 0;
- If BufferByte = RefEOF[CountEOF +1] Then
- Inc(CountEOF)
- Else
- CountEOF := 0;
- end;
- until (CountPackage = 8) or (CountEOF = 4) Or (CheckFlag = False);
- If CountPackage = 8 Then Begin
- // Calculate the amount of bytes to save
- PackageSize := FilePos(LoadedFile) - StartOffset + 4;
- // Load and save Package
- Seek(LoadedFile, StartOffset);
- SetLength(BufferGEN, PackageSize);
- BlockRead(LoadedFile, BufferGEN[0], PackageSize);
- BlockWrite(SavedFile, BufferGEN[0], PackageSize);
- WriteLN('Found package ' + IntToStr(EntryCount) +' : Size of ' + IntToStr(PackageSize) + ' bytes');
- end;
- If CountEOF = 4 Then Begin
- // Calculate the amount of bytes to save
- PackageSize := FilePos(LoadedFile) - StartOffset -4;
- // Load and save Package
- Seek(LoadedFile, StartOffset);
- SetLength(BufferGEN, PackageSize);
- BlockRead(LoadedFile, BufferGEN[0], PackageSize);
- BlockWrite(SavedFile, BufferGEN[0], PackageSize);
- end;
- // Load next PackageID
- BlockRead(LoadedFile, Buffer32[1], 4, Readed);
- If Readed <> 4 Then
- CheckFlag := False;
- end;
- If CheckFlag = False Then
- WriteLN('File too short or corrupted')
- Else
- BlockWrite(SavedFile, RefEOF[1], 4);
- CloseFile(SavedFile);
- End;
- CloseFile(LoadedFile);
- If CheckFlag = True Then Begin
- // Copy files
- CheckFlag := CopyFile('packageinfo.vdf', 'packageinfo.vdf.backup');
- If CheckFlag = True Then
- CheckFlag := CopyFile('packageinfo.vdf.new', 'packageinfo.vdf');
- If CheckFlag = True Then
- CheckFlag := DeleteFile('packageinfo.vdf.new');
- If CheckFlag = True Then
- WriteLN('All OK. Press any key to close.')
- Else
- WriteLN('Error copying files');
- End;
- end
- Else
- WriteLN('packageinfo.vdf not found');
- Repeat
- Sleep(100);
- Until Keypressed;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement