Fail slower on resource parsing (fixes #81)

This commit is contained in:
Matt Nadareski
2022-02-10 10:28:59 -08:00
parent 96daf90ae8
commit 56f009ac56
2 changed files with 43 additions and 32 deletions

View File

@@ -33,6 +33,7 @@ namespace BurnOutSharp.ExecutableType.Microsoft.Entries
if (Data == null || codePage < 0)
return string.Empty;
// Try to convert to UTF-8 first
try
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
@@ -40,11 +41,17 @@ namespace BurnOutSharp.ExecutableType.Microsoft.Entries
byte[] convertedData = Encoding.Convert(originalEncoding, Encoding.UTF8, Data);
return Encoding.UTF8.GetString(convertedData);
}
catch (Exception ex)
catch { }
// Then try to read direct as ASCII
try
{
return Encoding.ASCII.GetString(Data);
}
catch { }
// If both encodings fail, then just return an empty string
return string.Empty;
}
}

View File

@@ -395,43 +395,47 @@ namespace BurnOutSharp.Tools
if (rdt == null)
return null;
foreach (var rdte in rdt.NamedEntries)
try
{
if (rdte.IsResourceDataEntry() && rdte.DataEntry != null)
foreach (var rdte in rdt.NamedEntries)
{
if (dataStart != null && rdte.DataEntry.DataAsUTF8String.StartsWith(dataStart))
return rdte.DataEntry;
else if (dataContains != null && rdte.DataEntry.DataAsUTF8String.Contains(dataContains))
return rdte.DataEntry;
else if (dataEnd != null && rdte.DataEntry.DataAsUTF8String.EndsWith(dataStart))
return rdte.DataEntry;
if (rdte.IsResourceDataEntry() && rdte.DataEntry != null)
{
if (dataStart != null && rdte.DataEntry.DataAsUTF8String.StartsWith(dataStart))
return rdte.DataEntry;
else if (dataContains != null && rdte.DataEntry.DataAsUTF8String.Contains(dataContains))
return rdte.DataEntry;
else if (dataEnd != null && rdte.DataEntry.DataAsUTF8String.EndsWith(dataStart))
return rdte.DataEntry;
}
else
{
var manifest = FindResourceInTable(rdte.Subdirectory, dataStart, dataContains, dataEnd);
if (manifest != null)
return manifest;
}
}
else
{
var manifest = FindResourceInTable(rdte.Subdirectory, dataStart, dataContains, dataEnd);
if (manifest != null)
return manifest;
}
}
foreach (var rdte in rdt.IdEntries)
{
if (rdte.IsResourceDataEntry() && rdte.DataEntry != null)
foreach (var rdte in rdt.IdEntries)
{
if (dataStart != null && rdte.DataEntry.DataAsUTF8String.StartsWith(dataStart))
return rdte.DataEntry;
else if (dataContains != null && rdte.DataEntry.DataAsUTF8String.Contains(dataContains))
return rdte.DataEntry;
else if (dataEnd != null && rdte.DataEntry.DataAsUTF8String.EndsWith(dataStart))
return rdte.DataEntry;
}
else
{
var manifest = FindResourceInTable(rdte.Subdirectory, dataStart, dataContains, dataEnd);
if (manifest != null)
return manifest;
if (rdte.IsResourceDataEntry() && rdte.DataEntry != null)
{
if (dataStart != null && rdte.DataEntry.DataAsUTF8String.StartsWith(dataStart))
return rdte.DataEntry;
else if (dataContains != null && rdte.DataEntry.DataAsUTF8String.Contains(dataContains))
return rdte.DataEntry;
else if (dataEnd != null && rdte.DataEntry.DataAsUTF8String.EndsWith(dataStart))
return rdte.DataEntry;
}
else
{
var manifest = FindResourceInTable(rdte.Subdirectory, dataStart, dataContains, dataEnd);
if (manifest != null)
return manifest;
}
}
}
catch { }
return null;
}