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