Beispiel #1
0
        private void BackgroundWorker_unpacker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker unpacker = sender as BackgroundWorker;

            File_info_bytes[] F_I_B = new File_info_bytes[(int)(H_I.Conf_Files + H_I.Bin_Files)];                                                                                                       //Информация для одиночного файла
            int start_adress        = 0x2800;                                                                                                                                                           //Адрес начала списка файлов

            for (int i = 0; i < H_I.Conf_Files + H_I.Bin_Files; i++)                                                                                                                                    // Первый цикл из всех файлов, запакованных в прошивку
            {
                F_I_B[i].ROM_Name  = new ASCIIEncoding().GetString(decode_header_bytes, i * (int)Func.Parsing_Bytes.File_info + start_adress, (int)Func.Parsing_Bytes.String_parse).TrimEnd('\0');      // 0х40 (64) Имя файла прошивки
                F_I_B[i].File_Name = new ASCIIEncoding().GetString(decode_header_bytes, i * (int)Func.Parsing_Bytes.File_info + 64 + start_adress, (int)Func.Parsing_Bytes.String_parse).TrimEnd('\0'); // 0х40 (64) Имя файла
                F_I_B[i].Offset    = BitConverter.ToInt64(decode_header_bytes, i * (int)Func.Parsing_Bytes.File_info + 128 + start_adress) * 512;                                                       // 0х8 (2х4) Начальный адрес блока
                F_I_B[i].Size      = BitConverter.ToInt64(decode_header_bytes, i * (int)Func.Parsing_Bytes.File_info + 136 + start_adress);                                                             // 0х8 (2х4) Размер
                F_I_B[i].CRC       = BitConverter.ToInt64(decode_header_bytes, i * (int)Func.Parsing_Bytes.File_info + 144 + start_adress);                                                             // 0х8 (2х4) CRC32 Контрольная сумма
                F_I_B[i].Res       = BitConverter.ToInt64(decode_header_bytes, i * (int)Func.Parsing_Bytes.File_info + 152 + start_adress);                                                             // 0х8 Резерв
                long   size_for_decode = F_I_B[i].Size;
                string path_file       = Decode_ROM_Path + "\\" + F_I_B[i].File_Name;
                while (size_for_decode % 512 != 0) // Читаем блоками по 512 байт
                {
                    size_for_decode++;
                }
                byte[] convert_bytes = new byte[size_for_decode];
                using (BinaryReader br = new BinaryReader(File.OpenRead(ROM_File_Path)))
                {
                    br.BaseStream.Position = F_I_B[i].Offset; // Смещение позиции чтения на начальный адрес
                    byte[] file_bytes = br.ReadBytes((int)size_for_decode);
                    if (i < H_I.Conf_Files)                   // Обрабатываем тут конфигурационные файлы, требующие расшифровки (идут в начале)
                    {
                        convert_bytes = func.Decoder(file_bytes, key_decode);
                    }
                    else // За ними бинарные файлы в чистом виде.
                    {
                        convert_bytes = file_bytes;
                    }
                }
                if (convert_bytes.Length > F_I_B[i].Size)
                {
                    Array.Resize(ref convert_bytes, (int)F_I_B[i].Size);
                }
                if (unpacker.CancellationPending || Convert.ToUInt32(F_I_B[i].CRC) != Crc32.CalculateCrc(convert_bytes)) // Проверяем контрольную сумму
                {
                    e.Cancel = true;
                    break;
                }
                using (BinaryWriter writer = new BinaryWriter(File.Open(path_file, FileMode.Create), new ASCIIEncoding()))
                {
                    writer.Write(convert_bytes);
                }
                unpacker.ReportProgress(i * 100 / (int)(H_I.Conf_Files + H_I.Bin_Files), F_I_B[i]);
                Thread.Sleep(1);
            }
        }
Beispiel #2
0
        private void BackgroundWorker_unpacker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            toolStripProgressBar1.Value = e.ProgressPercentage;
            toolStripStatusLabel1.Text  = string.Format(LocRes.GetString("status_repack_unpacking_complited") + " {0}%", e.ProgressPercentage);
            if (e.ProgressPercentage > 5)
            {
                toolStripSplitButton_explorer.Visible = true;
            }
            File_info_bytes F_I_B = (File_info_bytes)e.UserState;

            textBox_parse.AppendText(string.Format(
                                         Environment.NewLine + "{0} {1}, {2} {3}, {4} {5}, {6} {7}",
                                         LocRes.GetString("file"), F_I_B.File_Name, LocRes.GetString("offset"), F_I_B.Offset, LocRes.GetString("size"),
                                         F_I_B.Size, LocRes.GetString("crc"), F_I_B.CRC));
        }