mirror of
https://github.com/terrymacdonald/DisplayMagician.git
synced 2024-08-30 18:32:20 +00:00
Have reverse engineered the uplay launcher a little bit, and managed to extract some of the useful file structures to be able to parse the useful bits of teh uplay game library. Need to properly extract the games info from it though.
102 lines
3.2 KiB
C#
102 lines
3.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace HeliosPlus.GameLibraries.UplayConfigurationParser
|
|
{
|
|
class UplayConfigurationParser
|
|
{
|
|
|
|
/*def _convert_data(self, data):
|
|
# calculate object size (konrad's formula)
|
|
if data > 256 * 256:
|
|
data = data - (128 * 256 * math.ceil(data / (256 * 256)))
|
|
data = data - (128 * math.ceil(data / 256))
|
|
else:
|
|
if data > 256:
|
|
data = data - (128 * math.ceil(data / 256))
|
|
return data*/
|
|
|
|
internal static decimal ConvertData (decimal data)
|
|
{
|
|
if (data > 65536)
|
|
{
|
|
data = data - (128 * 256 * Math.Ceiling(data / 65536));
|
|
}
|
|
else if (data > 256)
|
|
{
|
|
data = data - (128 * Math.Ceiling(data / 256));
|
|
}
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*def _parse_configuration_header(self, header, second_eight= False):
|
|
try:
|
|
offset = 1
|
|
multiplier = 1
|
|
record_size = 0
|
|
tmp_size = 0
|
|
|
|
if second_eight:
|
|
while header[offset] != 0x08 or(header[offset] == 0x08 and header[offset + 1] == 0x08) :
|
|
record_size += header[offset] * multiplier
|
|
multiplier *= 256
|
|
offset += 1
|
|
tmp_size += 1
|
|
else:
|
|
while header[offset] != 0x08 or record_size == 0:
|
|
record_size += header[offset] * multiplier
|
|
multiplier *= 256
|
|
offset += 1
|
|
tmp_size += 1
|
|
|
|
record_size = self._convert_data(record_size)
|
|
|
|
offset += 1 # skip 0x08
|
|
|
|
# look for launch_id
|
|
multiplier = 1
|
|
launch_id = 0
|
|
|
|
while header[offset] != 0x10 or header[offset + 1] == 0x10:
|
|
launch_id += header[offset] * multiplier
|
|
multiplier *= 256
|
|
offset += 1
|
|
|
|
launch_id = self._convert_data(launch_id)
|
|
|
|
offset += 1 # skip 0x10
|
|
|
|
multiplier = 1
|
|
launch_id_2 = 0
|
|
while header[offset] != 0x1A or(header[offset] == 0x1A and header[offset + 1] == 0x1A) :
|
|
launch_id_2 += header[offset] * multiplier
|
|
multiplier *= 256
|
|
offset += 1
|
|
|
|
launch_id_2 = self._convert_data(launch_id_2)
|
|
|
|
#if object size is smaller than 128b, there might be a chance that secondary size will not occupy 2b
|
|
if record_size - offset < 128 <= record_size:
|
|
tmp_size -= 1
|
|
record_size += 1
|
|
|
|
# we end up in the middle of header, return values normalized
|
|
# to end of record as well real yaml size and game launch_id
|
|
return record_size - offset, launch_id, launch_id_2, offset + tmp_size + 1
|
|
except:
|
|
# something went horribly wrong, do not crash it,
|
|
# just return 0s, this way it will be handled later in the code
|
|
# 10 is to step a little in configuration file in order to find next game
|
|
return 0, 0, 0, 10*/
|
|
|
|
//internal static decimal ParseConfigurationHeader(decimal data);
|
|
}
|
|
}
|