Example #1
0
        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));
                }
            }
        }
Example #2
0
        public async Task <byte[]> CalculateFileHash(ExeFsHeader header)
        {
            var data = await GetDataReference(header).ReadArrayAsync().ConfigureAwait(false);

            using (var sha = SHA256.Create())
            {
                return(sha.ComputeHash(data));
            }
        }
Example #3
0
 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
     }));
 }
Example #4
0
        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));
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
 public static ExeFSSectionHeader?FindExeFSSection(ExeFsHeader header, string name)
 {
     return(header.Sections.FirstOrDefault(p => new string(p.Name).Contains(name)));
 }
Example #7
0
 public async Task <bool> IsFileHashValid(ExeFsHeader header)
 {
     return(await IsFileHashValid(Headers.IndexOf(header)));
 }
Example #8
0
 public IReadOnlyBinaryDataAccessor GetDataReference(ExeFsHeader header)
 {
     return(ExeFsData.GetReadOnlyDataReference(header.Offset + 0x200, header.FileSize));
 }