예제 #1
0
        bool resource_check_custpacktbl_item(byte[] bin, UInt32 rom_base, UInt32 rom_size, UInt32 addr)
        {
            UInt32 offset;
            CUSTPACK_DATA_HEADER1 image_header1;
            CUSTPACK_DATA_HEADER2 image_header2;

            image_header1 = new CUSTPACK_DATA_HEADER1();
            image_header2 = new CUSTPACK_DATA_HEADER2();

            if (!(check_addr(addr)))
            {
                return(false);
            }

            offset = addr - Image__ROM__Base;

            if (offset < rom_base || offset >= rom_base + rom_size - 8)
            {
                return(false);
            }

            image_header1.MaxImageNumEXT    = BitConverter.ToUInt16(bin, (int)offset);
            image_header1.CustImageNamesEXT = BitConverter.ToUInt32(bin, (int)offset + 2);

            image_header2.MaxImageNumEXT    = BitConverter.ToUInt32(bin, (int)offset);
            image_header2.CustImageNamesEXT = BitConverter.ToUInt32(bin, (int)offset + 4);

            if ((image_header1.MaxImageNumEXT == 0) || (UInt32)offset - image_header1.MaxImageNumEXT * 4 != (UInt32)(image_header1.CustImageNamesEXT - Image__ROM__Base))
            {
                if ((image_header2.MaxImageNumEXT == 0) || (UInt32)offset - image_header2.MaxImageNumEXT * 4 != (UInt32)(image_header2.CustImageNamesEXT - Image__ROM__Base))
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #2
0
        bool resource_get_custpack2ndJumpTbl(byte[] bin)
        {
            int index, i = 0;

            UInt32 rom_base = 0;
            UInt32 rom_size = (UInt32)m_bin.Length;

            int offset;

            g_custpack2ndJumpTbl = null;

            MTKCustpack2ndJumpTbl   p_custpack2ndJumpTbl = new MTKCustpack2ndJumpTbl();
            CUSTPACK_NVRAM_HEADER   nvram_header         = new CUSTPACK_NVRAM_HEADER();
            CUSTPACK_DATA_HEADER    image_header         = new CUSTPACK_DATA_HEADER();
            CUSTPACK_DATA_HEADER1   image_header1        = new CUSTPACK_DATA_HEADER1();
            CUSTPACK_DATA_HEADER2   image_header2        = new CUSTPACK_DATA_HEADER2();
            NVRAM_MMI_CACHE_DEFAULT byte_cache           = new NVRAM_MMI_CACHE_DEFAULT();
            NVRAM_MMI_CACHE_DEFAULT short_cache          = new NVRAM_MMI_CACHE_DEFAULT();
            NVRAM_MMI_CACHE_DEFAULT double_cache         = new NVRAM_MMI_CACHE_DEFAULT();

            for (index = (int)rom_base; index < rom_base + rom_size - 50; index++)
            {
                p_custpack2ndJumpTbl.mtk_theme_header   = BitConverter.ToUInt32(bin, index);
                p_custpack2ndJumpTbl.mtk_image_header   = BitConverter.ToUInt32(bin, index + 4);
                p_custpack2ndJumpTbl.custpack_audio     = BitConverter.ToUInt32(bin, index + 8);
                p_custpack2ndJumpTbl.mtk_audio_header   = BitConverter.ToUInt32(bin, index + 12);
                p_custpack2ndJumpTbl.custpack_nvram_ptr = BitConverter.ToUInt32(bin, index + 16);

                if (!g_regionInfo.m_load_successed)
                {
                    Image__ROM__Base = p_custpack2ndJumpTbl.mtk_theme_header & IMAGE_ROM_BASE_FLAG;
                }

                if (!(Image__ROM__Base == 0 || Image__ROM__Base == 0x08000000 || Image__ROM__Base == 0xf0000000))
                {
                    continue;
                }

                if (!resource_check_custpacktbl_item(bin, rom_base, rom_size, p_custpack2ndJumpTbl.mtk_image_header)
                    //||!resource_check_custpacktbl_item(bin,rom_base,rom_size,p_custpack2ndJumpTbl.mtk_theme_header)
                    || !resource_check_custpacktbl_item(bin, rom_base, rom_size, p_custpack2ndJumpTbl.mtk_audio_header)
                    )
                {
                    continue;
                }
                i = 0;

                offset = (int)(p_custpack2ndJumpTbl.custpack_nvram_ptr - Image__ROM__Base);

                if (!(check_addr(p_custpack2ndJumpTbl.custpack_nvram_ptr)))
                {
                    continue;
                }
                nvram_header.version = BitConverter.ToUInt32(bin, (int)offset + ((i++) << 2));

                if ((nvram_header.COMMON_NVRAM_EF_ALS_LINE_ID_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_MSCAP_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.NVRAM_EF_MMI_CACHE_BYTE_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.NVRAM_EF_MMI_CACHE_SHORT_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.NVRAM_EF_MMI_CACHE_DOUBLE_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_PHB_SOS_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_SMSAL_MAILBOX_ADDR_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_SMSAL_COMMON_PARAM_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_CB_DEFAULT_CH_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_SETTING_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_MS_SECURITY_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_RAC_PREFERENCE_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_INET_CUSTPACK_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }
                if ((nvram_header.COMMON_NVRAM_EF_WAP_BOOKMARK_LIST_DEFAULT = Address_Converter_And_Check((int)offset + ((i++) << 2))) == 0)
                {
                    continue;
                }


                byte_cache.m_base = nvram_header.NVRAM_EF_MMI_CACHE_BYTE_DEFAULT - Image__ROM__Base;
                byte_cache.m_len  = (UInt32)((bin[byte_cache.m_base] << 24) + (bin[1 + byte_cache.m_base] << 16) + (bin[2 + byte_cache.m_base] << 8) + bin[3 + byte_cache.m_base]);

                short_cache.m_base = nvram_header.NVRAM_EF_MMI_CACHE_SHORT_DEFAULT - Image__ROM__Base;
                short_cache.m_len  = (UInt32)((bin[short_cache.m_base] << 24) + (bin[1 + short_cache.m_base] << 16) + (bin[2 + short_cache.m_base] << 8) + bin[3 + short_cache.m_base]);

                double_cache.m_base = nvram_header.NVRAM_EF_MMI_CACHE_DOUBLE_DEFAULT - Image__ROM__Base;
                double_cache.m_len  = (UInt32)((bin[double_cache.m_base] << 24) + (bin[1 + double_cache.m_base] << 16) + (bin[2 + double_cache.m_base] << 8) + bin[3 + double_cache.m_base]);

                if (byte_cache.m_base + 512 == short_cache.m_base &&
                    short_cache.m_base + 512 == double_cache.m_base)
                {
                    m_isCompressed   = false;
                    byte_cache.m_len = short_cache.m_len = double_cache.m_len = 512;
                    Array.Copy(bin, byte_cache.m_base, byte_cache.m_data, 0, 512);
                    Array.Copy(bin, short_cache.m_base, short_cache.m_data, 0, 512);
                    Array.Copy(bin, double_cache.m_base, double_cache.m_data, 0, 512);
                }
                else if (byte_cache.m_base + (byte_cache.m_len + 4) == short_cache.m_base &&
                         short_cache.m_base + (short_cache.m_len + 4) == double_cache.m_base)
                {
                    m_isCompressed = true;
                    if (resource_uncompress(byte_cache.m_data, 512, bin, byte_cache.m_base, byte_cache.m_len) != 0 ||
                        resource_uncompress(short_cache.m_data, 512, bin, short_cache.m_base, short_cache.m_len) != 0 ||
                        resource_uncompress(double_cache.m_data, 512, bin, double_cache.m_base, double_cache.m_len) != 0)
                    {
                        continue;
                    }
                }
                else
                {
                    continue;
                }

                g_custpack2ndJumpTbl = p_custpack2ndJumpTbl;
                break;
            }
            if (g_custpack2ndJumpTbl != null)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }