Advertisement
Guest User

Untitled

a guest
Jul 4th, 2020
1,831
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.12 KB | None | 0 0
  1. program PackageInfoConverter;
  2.  
  3. Uses
  4.   SysUtils, Crt, FileUtil;
  5.  
  6. Type
  7.   Byt4 = Array[1..4] of Byte;
  8.  
  9. Const
  10.   RefMagic : Byt4 = ($28, $55, $56, $06);
  11.   RefEOF : Byt4 = ($FF,$FF,$FF,$FF);
  12.   RefAPPITEM : Array[1..8] of Byte = ($61,$70,$70,$69,$74,$65,$6D,$73);
  13.  
  14. Var
  15.   LoadedFile : File Of Byte;
  16.   SavedFile : File Of Byte;
  17.   Buffer32 : Byt4;
  18.   Buffer64 : Array[1..8] of Byte;
  19.   BufferSHA : Array[1..20] of Byte;
  20.   BufferGEN : Array of Byte;
  21.   BufferByte : Byte;
  22.   StartOffset : Int64;
  23.   PackageSize : Int64;
  24.   CheckFlag : Boolean;
  25.   Readed :Integer;
  26.   CountEOF, CountPackage : ShortInt;
  27.   EntryCount : Integer;
  28.  
  29. Function CheckByte(Const Group1, Group2 : Byt4) : Boolean;
  30. Var
  31.   I : Integer;
  32. Begin
  33.   Result := True;
  34.   For I := 1 To 4 Do If Group1[I] <> Group2[I] Then Result := False;
  35. end;
  36.  
  37. begin
  38.   WriteLN('Steam Packageinfo.VDF converter');
  39.   // Check if the original file exists
  40.   If FileExists('packageinfo.vdf') Then Begin
  41.     // Load the magic number from the original file
  42.     AssignFile(LoadedFile, 'packageinfo.vdf');
  43.     Reset(LoadedFile);
  44.     BlockRead(LoadedFile,Buffer32[1], 4, Readed);
  45.     CheckFlag := False;
  46.     // Check if the magic number is correct
  47.     If (Readed <> 4) Or (CheckByte(Buffer32, RefMagic) = False) Then
  48.       WriteLn('Wrong packageinfo version')
  49.     Else Begin
  50.       CheckFlag := True;
  51.       // Save the magic number and the universe on the new file
  52.       AssignFile(SavedFile, 'packageinfo.vdf.new');
  53.       Rewrite(SavedFile);
  54.       Buffer32[1] := $27;
  55.       BlockWrite(SavedFile, Buffer32[1],4);
  56.       BlockRead(LoadedFile, Buffer32[1],4);
  57.       BlockWrite(SavedFile, Buffer32[1],4);
  58.       // Read the first 4 byte of Package
  59.       BlockRead(LoadedFile, Buffer32[1], 4, Readed);
  60.       If Readed = 4 Then
  61.         CheckFlag := True
  62.       Else
  63.         CheckFlag := False;
  64.       EntryCount := 0;
  65.       While (CheckFlag = True) And (CheckByte(Buffer32, RefEOF) = False) Do Begin
  66.         Inc(EntryCount);
  67.         // Write Package
  68.         BlockWrite(SavedFile, Buffer32[1],4);
  69.         //Read and write Sha1;
  70.         BlockRead(LoadedFile, BufferSHA[1], 20, Readed);
  71.         If Readed <> 20 Then
  72.           CheckFlag := False
  73.         Else
  74.           BlockWrite(SavedFile, BufferSHA[1], 20);
  75.         // Read and write ChangeNumber
  76.         BlockRead(LoadedFile, Buffer32[1],4, Readed);
  77.         If Readed <> 4 Then
  78.           CheckFlag := False
  79.         Else
  80.           BlockWrite(SavedFile, Buffer32[1],4);
  81.         // Read and ignore picsToken
  82.         BlockRead(LoadedFile, Buffer64[1], 8, Readed);
  83.         If Readed <> 8 Then
  84.           CheckFlag := False;
  85.         // Load bytes and check if AppItems or EOF ($FFFFFFFF) strings are found
  86.         CountPackage := 0;
  87.         CountEOF := 0;
  88.         StartOffset := FilePos(loadedFile);
  89.         Repeat
  90.           BlockRead(LoadedFile,BufferByte, 1 , Readed);
  91.           If Readed <> 1 Then
  92.             CheckFlag := False
  93.           Else Begin
  94.             If BufferByte = RefAPPITEM[CountPackage +1] Then
  95.               Inc(CountPackage)
  96.             Else CountPackage := 0;
  97.             If BufferByte = RefEOF[CountEOF +1] Then
  98.               Inc(CountEOF)
  99.             Else
  100.               CountEOF := 0;
  101.           end;
  102.         until (CountPackage = 8) or (CountEOF = 4) Or (CheckFlag = False);
  103.         If CountPackage = 8 Then Begin
  104.           // Calculate the amount of bytes to save
  105.           PackageSize := FilePos(LoadedFile) - StartOffset + 4;
  106.           // Load and save Package
  107.           Seek(LoadedFile, StartOffset);
  108.           SetLength(BufferGEN, PackageSize);
  109.           BlockRead(LoadedFile, BufferGEN[0], PackageSize);
  110.           BlockWrite(SavedFile, BufferGEN[0], PackageSize);
  111.           WriteLN('Found package ' + IntToStr(EntryCount) +' : Size of ' + IntToStr(PackageSize) + ' bytes');
  112.         end;
  113.         If CountEOF = 4 Then Begin
  114.           // Calculate the amount of bytes to save
  115.           PackageSize := FilePos(LoadedFile) - StartOffset -4;
  116.           // Load and save Package
  117.           Seek(LoadedFile, StartOffset);
  118.           SetLength(BufferGEN, PackageSize);
  119.           BlockRead(LoadedFile, BufferGEN[0], PackageSize);
  120.           BlockWrite(SavedFile, BufferGEN[0], PackageSize);
  121.         end;
  122.           // Load next PackageID
  123.         BlockRead(LoadedFile, Buffer32[1], 4, Readed);
  124.         If Readed <> 4 Then
  125.           CheckFlag := False;
  126.       end;
  127.       If CheckFlag = False Then
  128.         WriteLN('File too short or corrupted')
  129.       Else
  130.         BlockWrite(SavedFile, RefEOF[1], 4);
  131.       CloseFile(SavedFile);
  132.     End;
  133.     CloseFile(LoadedFile);
  134.     If CheckFlag = True Then Begin
  135.       // Copy files
  136.       CheckFlag := CopyFile('packageinfo.vdf', 'packageinfo.vdf.backup');
  137.       If CheckFlag = True Then
  138.         CheckFlag := CopyFile('packageinfo.vdf.new', 'packageinfo.vdf');
  139.       If CheckFlag = True Then
  140.         CheckFlag := DeleteFile('packageinfo.vdf.new');
  141.       If CheckFlag = True Then
  142.         WriteLN('All OK. Press any key to close.')
  143.       Else
  144.         WriteLN('Error copying files');
  145.     End;
  146.   end
  147.   Else
  148.     WriteLN('packageinfo.vdf not found');
  149.   Repeat
  150.     Sleep(100);
  151.   Until Keypressed;
  152. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement