This commit is contained in:
Aria 2025-03-21 22:23:30 +11:00
commit 9c94d113d3
Signed by untrusted user who does not match committer: aria
GPG key ID: 19AB7AA462B8AB3B
10260 changed files with 1237388 additions and 0 deletions

View file

@ -0,0 +1,265 @@
unit CheckSum;
interface
uses
Classes, Forms;
type
TChecksumCRC32 = class
public
constructor Create;
procedure Reset;
procedure Provide(Data: PByte; Length: Integer);
function Checksum: Integer;
private
FCrc: Integer;
FCrcTable: array[0..255] of Integer;
end;
TFile = class
public
FileName: String;
Missing: Boolean;
FileSize: Integer;
Crc: Integer;
end;
TChecksums = class
public
constructor Create(const PathName: String);
destructor Destroy; override;
procedure Scan;
procedure Load;
procedure Save;
procedure Compare(BaseLine: TChecksums; Log: TStrings);
private
FFiles: TStringList;
FCrc: TChecksumCRC32;
FPathName: String;
procedure Process(const FileName: String);
procedure InnerScan(const PathName: String);
end;
implementation
uses SysUtils, StrUtils;
constructor TChecksumCRC32.Create;
var
c, n, k: Integer;
begin
Reset;
for n := 0 to 255 do begin
c := n;
for k := 0 to 7 do begin
if c and 1 = 1 then
c := Integer($edb88320) xor Integer(Cardinal(c) shr 1)
else
c := (c shr 1);
end;
FCrcTable[n] := c;
end;
end;
procedure TChecksumCRC32.Reset;
begin
FCrc := Integer($ffffffff);
end;
procedure TChecksumCRC32.Provide(Data: PByte; Length: Integer);
var
c, n: Integer;
begin
c := FCrc;
for n := 0 to Length-1 do
c := FCrcTable[(c xor PByte(Integer(Data) + n)^) and $ff] xor Integer(Cardinal(c) shr 8);
FCrc := c;
end;
function TChecksumCRC32.Checksum: Integer;
begin
Result := FCrc xor Integer($ffffffff);
end;
constructor TChecksums.Create(const PathName: String);
begin
FCrc := TChecksumCRC32.Create;
FFiles := TStringList.Create;
FFiles.Sorted := True;
FFiles.Duplicates := dupIgnore;
FFiles.CaseSensitive := False;
FPathName := IncludeTrailingPathDelimiter(PathName);
end;
destructor TChecksums.Destroy;
var
I: Integer;
begin
for I := 0 to FFiles.Count -1 do
FFiles.Objects[I].Free;
FreeAndNil(FFiles);
FreeAndNil(FCrc);
end;
function FileSize(fileName : wideString) : Int64;
var
Sr : TSearchRec;
begin
Result := 0;
if FindFirst(fileName, faAnyFile, Sr) = 0 then
Result := Sr.FindData.nFileSizeLow;
FindClose(Sr) ;
end;
procedure TChecksums.Scan;
begin
InnerScan(FPathName);
end;
procedure TChecksums.InnerScan(const PathName: String);
var
Sr : TSearchRec;
begin
Application.ProcessMessages;
if FindFirst(PathName + '*', faAnyFile, Sr) = 0 then begin
try
repeat
if not AnsiStartsStr('.', Sr.Name) and not AnsiEndsText('.checksum', Sr.Name) then begin
if Sr.Attr and faDirectory <> 0 then begin
InnerScan(IncludeTrailingPathDelimiter(PathName + Sr.Name));
end else begin
Process(PathName + Sr.Name);
end;
end;
until FindNext(Sr) <> 0;
finally
FindClose(Sr);
end;
end;
end;
procedure TChecksums.Process(const FileName: String);
var
FS: TFileStream;
Len: Integer;
Buffer: array[0..4095] of Byte;
Entry: TFile;
begin
Entry := TFile.Create;
Entry.FileName := AnsiLowerCase(FileName);
Entry.Missing := not FileExists(Filename);
Entry.FileSize := 0;
Entry.Crc := 0;
if not Entry.Missing then begin
Entry.FileSize := FileSize(FileName);
try
FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try
FCrc.Reset;
while FS.Position <> FS.Size do begin
Len := FS.Read(Buffer[0], 4096);
FCrc.Provide(@Buffer[0], Len);
end;
Entry.Crc := FCrc.Checksum;
finally
FreeAndNil(FS);
end;
except
end;
end;
FFiles.AddObject(Entry.FileName, Entry);
end;
procedure Split(const S: String; Parts: TStringList);
begin
Parts.Clear;
ExtractStrings(['|'], [], PChar(S), Parts);
end;
procedure TChecksums.Load;
var
Data: TStringList;
Parts: TStringList;
I : Integer;
Entry: TFile;
begin
if not FileExists(FPathName+'sb.checksum') then
Exit;
Data := TStringList.Create;
Parts := TStringList.Create;
Data.LoadFromFile(FPathName+'sb.checksum');
for I := 0 to Data.Count -1 do begin
Split(Data.Strings[I], Parts);
if Parts.Count <> 3 then
raise Exception.Create('Checksum file parse error');
Entry := TFile.Create;
Entry.FileName := FPathName + Parts[0];
Entry.Missing := False;
Entry.FileSize := StrToInt(Parts[1]);
Entry.Crc := StrToInt(Parts[2]);
FFiles.AddObject(Entry.FileName, Entry);
end;
Parts.Free;
Data.Free;
end;
procedure TChecksums.Save;
var
Data: TStringList;
I : Integer;
Entry: TFile;
PathName: String;
begin
PathName := AnsiLowerCase(FPathName);
Data := TStringList.Create;
for I := 0 to FFiles.Count -1 do begin
Entry := TFile(FFiles.Objects[I]);
if not Entry.Missing then
Data.Append(AnsiReplaceStr(Entry.FileName, PathName, '') + '|' + IntToStr(Entry.FileSize) + '|0x' + IntToHex(Entry.Crc, 8));
end;
Data.SaveToFile(FPathName+'sb.checksum');
Data.Free;
end;
procedure TChecksums.Compare(BaseLine: TChecksums; Log: TStrings);
var
I: Integer;
L: TStringList;
Base: TFile;
Local: TFile;
A: Integer;
begin
L := TStringList.Create;
L.Sorted := True;
L.Duplicates := dupIgnore;
L.CaseSensitive := False;
for I := 0 to FFiles.Count-1 do
L.Add(FFiles.Strings[I]);
for I := 0 to BaseLine.FFiles.Count-1 do
L.Add(BaseLine.FFiles.Strings[I]);
for I := 0 to L.Count-1 do begin
Base := nil;
Local := nil;
if FFiles.Find(L[I], A) then
Local := TFile(FFiles.Objects[A]);
if BaseLine.FFiles.Find(L[I], A) then
Base := TFile(BaseLine.FFiles.Objects[A]);
if Local = nil then
Log.Append('File ' + L[I] + ' is missing.')
else if Base = nil then
Log.Append('File ' + L[I] + ' is not part of the baseline.')
else if Base.FileSize <> Local.FileSize then
Log.Append('File ' + L[I] + ' is the wrong size, expected ' +IntToStr(Base.FileSize) + ' but found ' + IntToStr(Local.FileSize) + '.')
else if Base.Crc <> Local.Crc then
Log.Append('File ' + L[I] + ' did not match checksum.');
end;
end;
end.

View file

@ -0,0 +1,38 @@
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"e:\program files (x86)\borland\delphi7\Projects\Bpl"
-LN"e:\program files (x86)\borland\delphi7\Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST

View file

@ -0,0 +1,136 @@
[FileVersion]
Version=7.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
NamespacePrefix=
SymbolDeprecated=1
SymbolLibrary=1
SymbolPlatform=1
UnitLibrary=1
UnitPlatform=1
UnitDeprecated=1
HResultCompat=1
HidingMember=1
HiddenVirtual=1
Garbage=1
BoundsError=1
ZeroNilCompat=1
StringConstTruncated=1
ForLoopVarVarPar=1
TypedConstVarPar=1
AsgToTypedConst=1
CaseLabelRange=1
ForVariable=1
ConstructingAbstract=1
ComparisonFalse=1
ComparisonTrue=1
ComparingSignedUnsigned=1
CombiningSignedUnsigned=1
UnsupportedConstruct=1
FileOpen=1
FileOpenUnitSrc=1
BadGlobalSymbol=1
DuplicateConstructorDestructor=1
InvalidDirective=1
PackageNoLink=1
PackageThreadVar=1
ImplicitImport=1
HPPEMITIgnored=1
NoRetVal=1
UseBeforeDef=1
ForLoopVarUndef=1
UnitNameMismatch=1
NoCFGFileFound=1
MessageDirective=1
ImplicitVariants=1
UnicodeToLocale=1
LocaleToUnicode=1
ImagebaseMultiple=1
SuspiciousTypecast=1
PrivatePropAccessor=1
UnsafeType=0
UnsafeCode=0
UnsafeCast=0
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;Rave50CLX;Rave50VCL;dclOfficeXP
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Language]
ActiveLang=
ProjectLang=
RootDir=
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1043
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=

View file

@ -0,0 +1,15 @@
program SBDiagnose;
uses
Forms,
SBDiagnoseForm in 'SBDiagnoseForm.pas' {Form1},
CheckSum in 'CheckSum.pas';
{$R *.res}
begin
Application.Initialize;
Application.Title := 'Starbound Diagnostics';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Binary file not shown.

View file

@ -0,0 +1,175 @@
object Form1: TForm1
Left = 714
Top = 318
Width = 851
Height = 547
Caption = 'Starbound Diagnostics'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Icon.Data = {
0000010001002020000001002000A81000001600000028000000200000004000
000001002000000000000020000000000000000000000000000000000000FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016ABA
F95D6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF5B9ADFFF4B75C0FF4B75C0FFFFFF
FF01FFFFFF016AB9F98B6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF6ABA
FAFF67B4F5FF4B75C0FF4B75C0FF4976C045FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016ABA
F95D6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF5B9ADFFF4B75C0FF4B75C0FFFFFF
FF01FFFFFF016AB9F98B6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF6ABA
FAFF67B4F5FF4B75C0FF4B75C0FF4976C045FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01704D4D2B6E4C4C716E4C4C716E4C4C716E4C4C717073
86A37293B4FF7293B4FF7293B4FF7293B4FF6A81A5FF616C93FF616C93FFDAC4
D871DAC4D871ACC0E5BF9BBEEBFF9BBEEBFF9BBEEBFF9BBEEBFF73A8E4FF5C9B
E0FF5A98DDF74A75C08F4A75C08F4775BD27FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF016E4D4D5F6F4D4DFF6F4D4DFF6F4D4DFF6F4D4DFF7454
52FF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFFDAC5
D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FF7E91C9FF4B75
C0FF4A75BEEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF016E4D4D5F6F4D4DFF6F4D4DFF6F4D4DFF6F4D4DFF7454
52FF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFFDAC5
D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FF7E91C9FF4B75
C0FF4A75BEEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF015555550366333305663333057C615AD17C615AFF6A4E
4CFF492B32FF492B32FF492B32FF492B32FF775965FFAF91A2FFAF91A2FFDAC5
D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFD8C4D8FFD8C3
D8FFCCB7CBFF492A30FB492A30FB48293143FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017C6159CF7D625BFF6A4E
4CFF492B32FF492B32FF492B32FF492B32FF775965FFB092A3FFB092A3FFDAC5
D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5D9FFDAC5
D9FFCEB8CBFF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01614344CF614445FF6245
46FF644847FF644847FF4B2D34FF492B32FF816672FFC6ADBFFFC6ADBFFFDAC5
D9FFDAC5D9FFDFCFE1FFE4D8E7FFE4D8E7FFE4D8E7FFE4D8E7FFDDCCDEFFDAC5
D9FFCEB8CBFF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01482B32CF492B32FF5B3E
40FF7D625BFF7D625BFF4D3035FF492B32FF8A707DFFDAC5D9FFDAC5D9FFDAC5
D9FFDAC5D9FFE4D9E8FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFE0D2E3FFDAC5
D9FFCEB8CBFF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF014C2D33CF4C2D34FF5D40
42FF7D625BFF7D625BFF4D3035FF492B32FF8A707DFFDAC5D9FFDAC5D9FFDBC7
DBFFDBC7DBFFE5DAE9FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFE1D4E4FFDBC7
DBFFCFBBCDFF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016D4D4DCF6F4D4DFF7454
52FF7D625BFF7D625BFF4D3035FF492B32FF8A707DFFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEA
F5FFDFDAE5FF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016D4D4DCF6F4D4DFF7454
52FF7D625BFF7D625BFF4D3035FF492B32FF8A707DFFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEA
F5FFDFDAE5FF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01775954CF775A55FF795C
57FF7D625BFF7D625BFF4D3035FF492B32FF8A707DFFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEA
F5FFDFDAE5FF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017C6159CF7D625BFF7D62
5BFF7D625BFF7D625BFF4D3035FF492B32FF8A707DFFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEA
F5FFDFDAE5FF492B32FF492B32FF492C3345FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017C6159CF7D625BFF7D62
5BFF7D625BFF7D625BFF53353AFF4F3036FF8E7480FFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEAE5F1FFE9E3
F0FFDDD5E1FF4F3036FF4F3036FF4D303745FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017C6159CF7D625BFF7D62
5BFF7D625BFF7D625BFF704E4EFF6F4D4DFF9F838CFFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFE0D2E3FFDAC5
D9FFD1BBCDFF6F4D4DFF6F4D4DFF6E4D4D45FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017C6159CF7D625BFF7D62
5BFF7D625BFF7D625BFF704E4EFF6F4D4DFF9F838CFFDAC5D9FFDAC5D9FFEDEA
F5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFEDEAF5FFE0D2E3FFDAC5
D9FFD1BBCDFF6F4D4DFF6F4D4DFF6E4D4D45FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017D635A3B7A615A497C62
5B897D625BFF7D625BFF795C57FF795C57FF977B80FFBBA0B2FFBBA0B2FFDFCF
E0FFDFCFE0FFE6DDEBFFEDEAF5FFEBE7F3FFDFCFE0FFDFCFE0FFC8B1C2FFBBA0
B2FFB99DAEF16C4C4C496C4C4C496B505013FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017E62
5A5D7D625BFF7D625BFF7D625BFF7D625BFF94777BFFB092A3FFB092A3FFDAC5
D9FFDAC5D9FFE4D9E8FFEDEAF5FFEBE6F2FFDAC5D9FFDAC5D9FFBFA4B6FFB092
A3FFAF92A1EBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01785D
575D795C57FF795C57FF7C615AFF7D625BFF8D7172FFA2858FFFA2858FFFC1AA
B7FFC1AAB7FFC8B9C2FFCFC5CBFFCDC3CAFFC1AAB7FFC1AAB7FFAB8F9BFF9E7F
8CFF9E7E8BEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016D4C
4C5D6F4D4DFF6F4D4DFF7B6059FF7D625BFF7D625BFF7D625BFF7D625BFF7D62
5BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF745452FF6F4D
4DFF6E4D4DEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016D4C
4C5D6F4D4DFF6F4D4DFF7B6059FF7D625BFF7D625BFF7D625BFF7D625BFF7D62
5BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF745452FF6F4D
4DFF6E4D4DEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01785D
575D7A5E58FF7A5E58FF7C615AFF7D625BFF7D625BFF7D625BFF7D625BFF7D62
5BFF7D625BFF7489A1FF6DA9DCFF6DA9DCFF6DA9DCFF6DA9DCFF6BA7DAFF6AA5
D9FF69A5DBFB69BAF8CF69BAF8CF6BBBFA39FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017E62
5A5D7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D62
5BFF7D625BFF7292B1FF6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF6ABAFAFF6ABA
FAFF6ABAFAFF6ABAFAFF6ABAFAFF6BB8F745FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017E62
5A5D7D625BFF7D625BFF7D625BFF7D625BFF8C726FFF9E8588FF9E8588FF7D62
5BFF7D625BFF6C84A6FF5EA1E5FF5FA3E7FF6ABAFAFF6ABAFAFF6ABAFAFF6ABA
FAFF6AB9F9F76ABAFAA36ABAFAA36BBAF92DFFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017E62
5A5D7D625BFF7D625BFF7D625BFF7D625BFFA78E94FFDAC5D9FFDAC5D9FF7D62
5BFF7D625BFF616C92FF4B75C0FF4D7BC5FF6ABAFAFF6ABAFAFF6ABAFAFF6ABA
FAFF6AB9F9EBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF017E62
5A5D7D625BFF7D625BFF7D625BFF7D625BFFA78E94FFDAC5D9FFDAC5D9FF7D62
5BFF7D625BFF616C92FF4B75C0FF4D7BC5FF6ABAFAFF6ABAFAFF6ABAFAFF6ABA
FAFF6AB9F9EBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01704C
4C5D704E4EFF704E4EFF7B6059FF7D625BFF806660FF856B66FF856B66FF7D62
5BFF7D625BFF7A6260FF786364FF786464FF7B6A69FF7B6A69FF735E61FF6E57
5DFF6D565DEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF016D4C
4C5D6F4D4DFF6F4D4DFF7B6059FF7D625BFF7D625BFF7D625BFF7D625BFF7D62
5BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF7D625BFF745452FF6F4D
4DFF6E4D4DEBFFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01704B
4B3D6F4C4CA76F4C4CA7765854F7785A56FF7A5E58FF7D625BFF7D625BFF7D62
5BFF7D625BFF7D625BFF7D625BFF7C615AFF785A56FF785A56FF735350C76F4C
4CA76F4C4C99FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF016F4D4DE76F4D4DFF755653FF7D625BFF7D625BFF7D62
5BFF7D625BFF7D625BFF7D625BFF7B6059FF6F4D4DFF6F4D4DFF6D4C4C5DFFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFF
FF01FFFFFF01FFFFFF016F4D4DE76F4D4DFF755653FF7D625BFF7D625BFF7D62
5BFF7D625BFF7D625BFF7D625BFF7B6059FF6F4D4DFF6F4D4DFF6D4C4C5DFFFF
FF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FFFFFF01FF80
C00FFF80C00FFF00C00FF000003FF000003FFC00000FFC00000FFC00000FFC00
000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00
000FFF00003FFF80003FFF80003FFF80003FFF80003FFF80000FFF80000FFF80
000FFF80003FFF80003FFF80003FFF80003FFF80003FFFE001FFFFE001FF}
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Log: TMemo
Left = 0
Top = 0
Width = 835
Height = 489
Align = alCustom
Anchors = [akLeft, akTop, akRight, akBottom]
ScrollBars = ssBoth
TabOrder = 0
end
object ProgressBar1: TProgressBar
Left = 0
Top = 492
Width = 835
Height = 17
Align = alBottom
TabOrder = 1
end
object Timer1: TTimer
Interval = 100
OnTimer = Timer1Timer
Left = 216
Top = 240
end
end

View file

@ -0,0 +1,272 @@
unit SBDiagnoseForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, CheckSum, ComCtrls;
type
TForm1 = class(TForm)
Log: TMemo;
Timer1: TTimer;
ProgressBar1: TProgressBar;
procedure Timer1Timer(Sender: TObject);
private
procedure ScanBaseInformation;
procedure ScanSteamInformation;
procedure ScanSteamOverlay;
procedure ScanCompatFlags;
procedure ScanHsSrvDll;
procedure ScanChecksums;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Registry, StrUtils;
{$R *.dfm}
function GetEnvVarValue(const VarName: String): String;
var
BufSize: Integer;
begin
BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
if BufSize > 0 then
begin
SetLength(Result, BufSize - 1);
GetEnvironmentVariable(PChar(VarName), PChar(Result), BufSize);
end
else
Result := '';
end;
function ErrorMessage: String;
var
Error: DWORD;
begin
Error := GetLastError;
Result := IntToStr(Error) + ' ' + SysErrorMessage(Error);
end;
procedure TForm1.ScanBaseInformation;
var
Handle: HMODULE;
ProcessAffinityMask: DWORD;
SystemAffinityMask: DWORD;
begin
Log.Lines.Append('Number of processors: '+GetEnvVarValue('NUMBER_OF_PROCESSORS'));
Log.Lines.Append('Processor architecture: '+GetEnvVarValue('PROCESSOR_ARCHITECTURE'));
Log.Lines.Append('Processor: '+GetEnvVarValue('PROCESSOR_IDENTIFIER'));
Handle := GetCurrentProcess;
if not GetProcessAffinityMask(Handle, ProcessAffinityMask, SystemAffinityMask) then begin
Log.Lines.Append('ProcessAffinityMask: Failed to query, error: '+ErrorMessage);
end
else begin
Log.Lines.Append('ProcessAffinityMask: '+IntToHex(Integer(ProcessAffinityMask), 8));
Log.Lines.Append('SystemAffinityMask: '+IntToHex(Integer(SystemAffinityMask), 8));
end;
Log.Lines.Append('WindowsVersion: '+IntToStr(Win32MajorVersion)+'.'+IntToStr(Win32MinorVersion)+'.'+IntToStr(Win32BuildNumber)+' '+Win32CSDVersion);
if (Win32MajorVersion < 5) or ((Win32MajorVersion = 5) and (Win32MinorVersion < 1)) then begin
Log.Lines.Append('Versions of windows before Windows XP are not supported.');
end;
if (Win32MajorVersion = 5) and (Win32MinorVersion > 0) then begin
Log.Lines.Append('Windows XP detected, it is recommended to use a more recent version of windows.');
end;
Log.Lines.Append('');
end;
procedure TForm1.ScanSteamInformation;
begin
Log.Lines.Append('EnvAppId: '+GetEnvVarValue('SteamAppId'));
Log.Lines.Append('');
end;
procedure TForm1.ScanSteamOverlay;
var
Handle: HMODULE;
begin
Handle := GetModuleHandle('GameOverlayRenderer');
if Handle <> 0 then begin
Log.Lines.Append('The Steam Overlay has been detected.');
Log.Lines.Append('Disabling the Steam overlay may improve render performance.');
Log.Lines.Append('http://community.playstarbound.com/index.php?threads/sbdiagnose-faq.52470/');
Log.Lines.Append('');
end;
end;
procedure TForm1.ScanCompatFlags;
var
Registry: TRegistry;
Steam: Boolean;
Starbound: Boolean;
procedure Scan;
var
I: Integer;
Entries: TStringList;
begin
Entries := TStringList.Create;
if Registry.OpenKey('Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\', False) then begin
Registry.GetValueNames(Entries);
for I := 0 to Entries.Count-1 do begin
if AnsiContainsText(Entries[i], '\steam.exe') then
Steam := True;
if AnsiContainsText(Entries[i], '\starbound.exe') then
Starbound := True;
if AnsiContainsText(Entries[i], '\starbound_opengl.exe') then
Starbound := True;
if AnsiContainsText(Entries[i], '\starbound\win32\') then
Starbound := True;
end;
Registry.CloseKey;
end;
Entries.Free;
Registry.Free;
end;
begin
if (GetEnvVarValue('__COMPAT_LAYER') <> '') then begin
Log.Lines.Append('Environment Compatibility Flags: '+GetEnvVarValue('__COMPAT_LAYER'));
Log.Lines.Append('');
end;
Steam := False;
Starbound := False;
Registry := TRegistry.Create;
Registry.RootKey := HKEY_CURRENT_USER;
Scan;
Registry := TRegistry.Create;
Registry.RootKey := HKEY_LOCAL_MACHINE;
Scan;
Registry := TRegistry.Create;
Registry.RootKey := HKEY_CURRENT_USER;
Registry.Access := $000f013f;
Scan;
Registry := TRegistry.Create;
Registry.RootKey := HKEY_LOCAL_MACHINE;
Registry.Access := $000f013f;
Scan;
if Steam then begin
Log.Lines.Append('Steam is running in compatibility mode.');
Log.Lines.Append('Running steam in compatbility mode can cause stability and performance problems.');
Log.Lines.Append('http://community.playstarbound.com/index.php?threads/sbdiagnose-faq.52470/');
Log.Lines.Append('');
end;
if Starbound then begin
Log.Lines.Append('Starbound is running in compatibility mode.');
Log.Lines.Append('Running starbound in compatbility mode can cause stability and performance problems.');
Log.Lines.Append('http://community.playstarbound.com/index.php?threads/sbdiagnose-faq.52470/');
Log.Lines.Append('');
end;
end;
procedure TForm1.ScanHsSrvDll;
var
Handle: HMODULE;
begin
Handle := LoadLibraryEx('hssrv.dll', 0, LOAD_LIBRARY_AS_DATAFILE);
if Handle = 0 then
Handle := GetModuleHandle('HsSrv');
if Handle <> 0 then begin
Log.Lines.Append('HsSrv.dll detected (Asus Xonar Drivers).');
Log.Lines.Append('There have been reports of this driver having compatibility issues with starbound.');
Log.Lines.Append('http://community.playstarbound.com/index.php?threads/sbdiagnose-faq.52470/');
Log.Lines.Append('');
end;
end;
procedure TForm1.ScanChecksums;
var
A, B: TChecksums;
F: String;
begin
F := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + '..\assets\';
Log.Lines.Add('Scanning checksums...');
Application.ProcessMessages;
try
if not FileExists(F + 'sb.checksum') then begin
Log.Lines.Add('No baseline found, creating.');
Application.ProcessMessages;
A := TChecksums.Create(F);
A.Scan;
A.Save;
A.Free;
end else begin
A := TChecksums.Create(F);
A.Scan;
Log.Lines.Add('Loading baseline.');
Application.ProcessMessages;
B := TChecksums.Create(F);
B.Load;
Log.Lines.Add('Comparing checksums.');
Application.ProcessMessages;
A.Compare(B, Log.Lines);
A.Free;
end;
except
on E: Exception do
Log.Lines.Add('Failed to scan checksums: ' + E.ClassName + ': ' + E.Message);
end;
Log.Lines.Add('done.');
Log.Lines.Add('');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Log.Lines.Append('Scanning System');
Log.Lines.Append('');
Application.ProcessMessages;
ProgressBar1.Position := 10;
Application.ProcessMessages;
ScanChecksums;
ProgressBar1.Position := 50;
Application.ProcessMessages;
ScanBaseInformation;
ProgressBar1.Position := 60;
Application.ProcessMessages;
ScanSteamInformation;
ProgressBar1.Position := 70;
Application.ProcessMessages;
ScanSteamOverlay;
ProgressBar1.Position := 80;
Application.ProcessMessages;
ScanCompatFlags;
ProgressBar1.Position := 90;
Application.ProcessMessages;
ScanHsSrvDll;
ProgressBar1.Position := ProgressBar1.Max;
ProgressBar1.Enabled := False;
Log.Lines.Append('Done.');
end;
end.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB