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); }
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); } }