示例#1
0
        public override void Decompress(AU3_Resource res)
        {
            res.State = "Extracted";
            res.DoUpdate();
            res.count = 0;
            //form.SetText("Decompressing...", form.lblStatus);
            if (res.CompressedSize == res.DecompressedSize)
            {
                //form.SetText("Not Compressed.", form.lblStatus);
                //res.evtDecompressed.Set();
                return;
            }
            res.pMem = new byte[res.DecompressedSize];
            res.spos = 0;
            res.pos  = 8;   // "EA06/EA05/JB??", p32(size)
            if (!Utils.AU3_SIGN.Contains(BitConverter.ToUInt32(res.RawData, 0)))
            {
                res.Status = Utils.STATUS.InvalidCompressedHeader;
                res.State  = "Invalid Compressed File Format!";
                res.DoUpdate();
                //res.evtDecompressed.Set();
                return; // invalid signature
            }

            if (BitConverter.ToUInt32(res.RawData, 0) == 0x3130424a)
            {
                try
                {
                    res.JB01_Decompress(this);
                } catch (Exception)
                {
                    res.count = 0;
                    res.pos   = 8;
                    res.DecompressorInitLegacy();

                    while (res.spos < res.DecompressedSize)
                    {
                        res.r = res.sub_417518(this);
                        if (res.r < 0x100)
                        {
                            res.pMem[res.spos++] = (byte)res.r;
                        }
                        else
                        {
                            res.v     = res.sub_417665(res.r, this) + 3;
                            res.delta = res.spos - res.sub_4176a5(this);
                            while (res.spos < res.pMem.Length && res.v-- > 0)
                            {
                                res.pMem[res.spos++] = res.pMem[res.delta++];
                            }
                        }
                    }
                }
            }
            else
            {
                res.count = 0;
                res.pos   = 8;
                res.DecompressorInitLegacy();

                while (res.spos < res.DecompressedSize)
                {
                    res.r = res.sub_417518(this);
                    if (res.r < 0x100)
                    {
                        res.pMem[res.spos++] = (byte)res.r;
                    }
                    else
                    {
                        res.v     = res.sub_417665(res.r, this) + 3;
                        res.delta = res.spos - res.sub_4176a5(this);
                        while (res.spos < res.pMem.Length && res.v-- > 0)
                        {
                            res.pMem[res.spos++] = res.pMem[res.delta++];
                        }
                    }
                }
            }
            res.RawDataSize = res.DecompressedSize;
            res.RawData     = res.pMem;
            if (this.IsUnicode)
            {
                res.SourceCode = Encoding.Unicode.GetString(res.pMem);
            }
            else
            {
                res.SourceCode = Encoding.ASCII.GetString(res.pMem);
            }
            res.Status      = Utils.STATUS.OK;
            res.State       = "Decompressed";
            res.Type        = Utils.TYPE.Text;
            res.SourceState = Utils.SOURCE_STATE.Decompressed;
            //form.SetText("Decompressed.", form.lblStatus);
            //res.evtDecompressed.Set();
            //form.UpdateStatus(null, null);

            if (!res.Tag.Contains("SCRIPT"))
            {
                res.MarkComplete();
            }
            else
            {
                res.DoUpdate();
            }
        }
示例#2
0
        public override void Decompress(AU3_Resource res)
        {
            res.State = "Extracted";
            res.count = 0;
            res.DoUpdate();
            //form.SetText("Decompressing...", form.lblStatus);
            if (res.CompressedSize == res.DecompressedSize)
            {
                //form.SetText("Not Compressed.", form.lblStatus);
                //res.evtNotify.Set();
                if (!res.Tag.Contains("SCRIPT<"))
                {
                    res.MarkComplete();
                }
                else
                {
                    res.DoUpdate();
                }
                return;
            }
            var mem = new byte[res.DecompressedSize];
            int i   = 0;

            res.pos = 8;    // "EA06", p32(size)
            if (!Utils.AU3_SIGN.Contains(BitConverter.ToUInt32(res.RawData, 0)))
            {
                res.Status = Utils.STATUS.InvalidCompressedHeader;
                res.State  = "Invalid Compressed File Format!";
                //res.evtNotify.Set();
                return; // invalid signature
            }

            while (i < res.DecompressedSize)
            {
                var r = ExtractBits(res, 1);
                if (r == 1)
                {
                    mem[i++] = (byte)ExtractBits(res, 8);
                }
                else
                {
                    var v = ExtractBits(res, 0xf);
                    r = CustomExtractBits(res);
                    var delta = i - v;
                    while (r-- > 0)
                    {
                        mem[i++] = mem[delta++];
                    }
                }
            }
            res.RawDataSize = res.DecompressedSize;
            res.RawData     = mem;
            res.Status      = Utils.STATUS.OK;
            res.State       = "Decompressed";
            res.Type        = Utils.TYPE.Binary;
            res.SourceState = Utils.SOURCE_STATE.Decompressed;
            //form.SetText("Decompressed.", form.lblStatus);
            //res.evtNotify.Set();
            //form.UpdateStatus(null, null);
            if (!res.Tag.Contains("SCRIPT<"))
            {
                res.MarkComplete();
            }
            else
            {
                res.DoUpdate();
            }
        }