protected async Task Initialize() { var headers = new ExeFsHeader[10]; var fileData = new byte[10][]; var hashes = new byte[10][]; await Task.WhenAll(Enumerable.Range(0, 10).Select(async i => { headers[i] = new ExeFsHeader(await ExeFsData.ReadArrayAsync(i * 16, 16).ConfigureAwait(false)); hashes[i] = await ExeFsData.ReadArrayAsync(0xC0 + ((9 - i) * 32), 32).ConfigureAwait(false); // Hashes are stored in reverse order from headers if (headers[i].FileSize > 0) { fileData[i] = await ExeFsData.Slice(headers[i].Offset + 0x200, headers[i].FileSize).ReadArrayAsync().ConfigureAwait(false); } })).ConfigureAwait(false); for (int i = 0; i < headers.Length; i++) { var header = headers[i]; var data = fileData[i]; var hash = hashes[i]; if (header.FileSize > 0) { Files.Add(header.Filename, new ExeFsEntry(data, hash)); } } }
public async Task <byte[]> CalculateFileHash(ExeFsHeader header) { var data = await GetDataReference(header).ReadArrayAsync().ConfigureAwait(false); using (var sha = SHA256.Create()) { return(sha.ComputeHash(data)); } }
public async Task Initialize() { Headers = new ExeFsHeader[10]; Hashes = new byte[10][]; await Task.WhenAll(Enumerable.Range(0, 10).Select(async i => { Headers[i] = new ExeFsHeader(await ExeFsData.ReadArrayAsync(i * 16, 16)); Hashes[i] = await ExeFsData.ReadArrayAsync(0xC0 + ((9 - i) * 32), 32); // Hashes are stored in reverse order from headers })); }
public static Bitmap CreateBitmap(Stream stream) { // Read the header CXIHeader header = Helpers.ReadCXIHeader(stream); header.ExeFSOffset *= BlockSize; header.ExeFSLength *= BlockSize; // Now read the ExeFS header ExeFsHeader exefs_header = ReadExeFSHeader(stream, header.ExeFSOffset); ExeFSSectionHeader?icon_section = FindExeFSSection(exefs_header, "icon"); if (icon_section != null && icon_section.Value.Size != 0) { SMDH icon = ReadExeFSSection <SMDH>(stream, icon_section.Value, header.ExeFSOffset); return(DecodeMortonImage(icon.Graphics.Large, 48)); } return(new Bitmap(100, 100)); }
public async Task Initialize() { var headers = new ExeFsHeader[10]; var hashes = new byte[10][]; await Task.WhenAll(Enumerable.Range(0, 10).Select(async i => { headers[i] = new ExeFsHeader(await ExeFsData.ReadArrayAsync(i * 16, 16).ConfigureAwait(false)); hashes[i] = await ExeFsData.ReadArrayAsync(0xC0 + ((9 - i) * 32), 32).ConfigureAwait(false); // Hashes are stored in reverse order from headers })).ConfigureAwait(false); this.Headers = new List <ExeFsHeader>(10); this.Hashes = new List <byte[]>(10); for (int i = 0; i < headers.Length; i++) { var header = headers[i]; var hash = hashes[i]; if (header.FileSize > 0) { this.Headers.Add(header); this.Hashes.Add(hash); } } }
public static ExeFSSectionHeader?FindExeFSSection(ExeFsHeader header, string name) { return(header.Sections.FirstOrDefault(p => new string(p.Name).Contains(name))); }
public async Task <bool> IsFileHashValid(ExeFsHeader header) { return(await IsFileHashValid(Headers.IndexOf(header))); }
public IReadOnlyBinaryDataAccessor GetDataReference(ExeFsHeader header) { return(ExeFsData.GetReadOnlyDataReference(header.Offset + 0x200, header.FileSize)); }