void DialogMBR::disk_art() { int i = cmb_disk->currentIndex(); QString partition = disk_name[i]; int efi = is_gpt("/dev/" + partition); cmb_mbr->setEnabled(false); if (efi == 0 && dialog_auswertung == 5) cmb_mbr->setEnabled(true); }
int read_dos_pt(int fd, struct slice all, struct slice *sp, int ns) { struct partition p; unsigned long offset = all.start; int i, n=4; unsigned char *bp; uint64_t sector_size_mul = get_sector_size(fd)/512; bp = (unsigned char *)getblock(fd, offset); if (bp == NULL) return -1; if (bp[510] != 0x55 || bp[511] != 0xaa) return -1; for (i=0; i<4; i++) { memcpy(&p, bp + 0x1be + i * sizeof (p), sizeof (p)); if (is_gpt(p.sys_type)) return 0; if (i < ns) { sp[i].start = sector_size_mul * le32_to_cpu(p.start_sect); sp[i].size = sector_size_mul * le32_to_cpu(p.nr_sects); } else { fprintf(stderr, "dos_partition: too many slices\n"); break; } if (is_extended(p.sys_type)) { /* extended partitions only get one or two sectors mapped for LILO to install, whichever is needed to have 1kb of space */ if (sector_size_mul == 1) sp[i].size = 2; else sp[i].size = sector_size_mul; n += read_extended_partition(fd, &p, i, sp+n, ns-n); } } return n; }
int DialogMBR::sektor_auslesen() { QString Dateiname; QString befehl; QString text; QString partition; QString homepath = QDir::homePath(); int sektor_ = 0; int i = 0; int j = 0; QString dummy[10]; QStringList hidden_size; QString hidden_size_; i = cmb_disk->currentIndex(); partition = disk_name[i]; efiflag = is_gpt("/dev/" + partition); // fdisk -lu , mit diesem Befehl Startsektor von sda1 ermitteln. // derzeit für Ubuntu: Startsektor sda1 = 63*512 = 32256 // Sektornummer in Datei abspeichern Dateiname = homepath + "/.config/qt5-fsarchiver/sektornummer.txt"; befehl = "fdisk -lu | grep " + partition + "1 > " + homepath + "/.config/qt5-fsarchiver/sektornummer.txt"; i = system (befehl.toLatin1().data()); QFile file(Dateiname); QFileInfo info(Dateiname); size_ = info.size(); //Wenn Dateigröße = 0 ist verhindert diese Abfrage einen Abstaurz qDebug() << "befehl" << befehl << size_; if (size_ == 0){ QMessageBox::about(this, tr("Note", "Hinweis"), tr("Mistake. The partition table can not be read. The program is terminated", "Fehler. Die Partitionstabelle kann nicht ausgelesen werden. Das Programm wird abgebrochen.\n")); return 1; } //Datei auslesen if( file.open(QIODevice::ReadOnly|QIODevice::Text)) { QTextStream ds(&file); hidden_size_ = ds.readLine(); hidden_size = hidden_size_.split(" "); file.close(); for (i=0; i < 100; i++){ if (hidden_size[i] != "") { dummy[j] = hidden_size[i]; j = j + 1; } if (j == 3) break; } if (dummy[1] == "*") //Festplatte hat Bootsektor sektor_ = dummy[2].toInt(); else sektor_ = dummy[1].toInt(); //Festplatte hat keinen Bootsektor } //Datei löschen // befehl = "rm " + homepath + "/.config/qt5-fsarchiver/sektornummer.txt";; system (befehl.toLatin1().data()); if (sektor_ < 2 && efiflag == 0) { QMessageBox::about(this, tr("Note", "Hinweis"), tr("The end of hidden area of the 1st Partition could not be read. Only 512 bytes are saved.", "Das Ende des verborgenen Bereiches der 1. Partition konnte nicht ausgelesen werden. Es werden nur 512 Bytes gesichert.\n")); sektor_ = 2; } sektor_byte = sektor_ * 512; Sektor_byte = QString::number(sektor_byte); sektor_byte_1 = (sektor_ -1) * 512 ; Sektor_byte_1= QString::number(sektor_byte_1); return 0; }
int DialogMBR::mbr() { QString befehl; int i; int success = 0; int pos=0; int pos2=0; QString partition; QString homepath = QDir::homePath(); QModelIndex index = treeView->currentIndex(); QModelIndexList indexes = selModel->selectedIndexes(); //Ubuntu Version einlesen, nur wenn Systempartition Ubuntuversion_auslesen(); i = cmb_disk->currentIndex(); partition = disk_name[i]; efiflag = is_gpt("/dev/" + partition); folder_ = (dirModel->filePath(index)); pos = folder_.indexOf("mbr_sd"); pos2 = folder_.indexOf("gpt_sd"); if (efiflag == 0 && (pos == -1) && (dialog_auswertung == 5)){ QMessageBox::about(this, tr("Note", "Hinweis"), tr("You must choose the MBR file\n","Sie müssen eine MBR Sicherungsdatei auswählen.\n")); return 1 ; } if (efiflag == 1 && (pos2 == -1) && (dialog_auswertung == 5)) { QMessageBox::about(this, tr("Note", "Hinweis"), tr("You must choose the GPT file\n","Sie müssen eine GPT Sicherungsdatei auswählen.\n")); return 1 ; } if (efiflag == 0){ success = sektor_auslesen(); if (success == 1) return 1; } if (efiflag == 1 && (dialog_auswertung == 5)) cmb_mbr->setEnabled(false); if (efiflag == 0 && (dialog_auswertung == 5)) cmb_mbr->setEnabled(true); if (dialog_auswertung == 4) { i = folder_einlesen(); if (i ==0) { QFile file(folder_); this->setCursor(Qt::WaitCursor); if (efiflag == 0) befehl = ("dd if=/dev/" + partition + " of='" + folder_ + "'/" + Ubuntuversion + "_mbr_" + partition + " bs=" + Sektor_byte + " " + "count=1"); this->setCursor(Qt::ArrowCursor); if (efiflag == 1) befehl = ("sgdisk -b '" + folder_ + "'/" + Ubuntuversion + "_gpt_" + partition + " /dev/" + partition); i = system (befehl.toLatin1().data()); this->setCursor(Qt::ArrowCursor); if (i == 0 && efiflag == 0) QMessageBox::about(this,tr("Note", "Hinweis"), tr("MBR was successfully backed up.\n", "MBR wurde erfolgreich gesichert.\n")); if (i != 0 && efiflag == 0) QMessageBox::about(this, tr("Note", "Hinweis"), tr("MBR has not been backeed.\n", "MBR wurde nicht gesichert.\n")); if (i == 0 && efiflag == 1) QMessageBox::about(this,tr("Note", "Hinweis"), tr("GPT was successfully backed up.\n", "GPT wurde erfolgreich gesichert.\n")); if (i != 0 && efiflag == 1) QMessageBox::about(this, tr("Note", "Hinweis"), tr("GPT has not been backeed.\n", "GPT wurde nicht gesichert.\n")); } } if (dialog_auswertung == 5 && efiflag == 1) { i = folder_einlesen(); if (i ==1) return 0; int auswertung = questionMessage(tr("Caution: If you really want to to write back the GUID partition table?\n", "Vorsicht: Wollen Sie wirklich die GUID Partitionstabelle zurückschreiben?\n")); if (auswertung == 2) return 1; if (i ==0) { this->setCursor(Qt::WaitCursor); if (cmb_mbr->currentIndex() == 0) { befehl = ("sgdisk -l '" + folder_ + "' /dev/" + partition); i = system (befehl.toLatin1().data()); this->setCursor(Qt::ArrowCursor); if (i == 0) QMessageBox::about(this, tr("Note", "Hinweis"), tr("The GUID partition table is successful return.\n", "Die GUID Partitionstabelle wurde erfolgreich wieder hergestellt.\n")); else QMessageBox::about(this, tr("Note", "Hinweis"), tr("The GUID partition table was not restored.\n", "Die GUID Partitionstabelle wurde nicht wieder hergestellt.\n")); } } } if (dialog_auswertung == 5 && cmb_mbr->currentIndex() != 3 && efiflag == 0) { i = folder_einlesen(); if (i ==1) return 0; if (efiflag == 0) { int auswertung = questionMessage(tr("Caution: If you really want to to write back the MBR completely or partially?\n", "Vorsicht: Wollen Sie wirklich den MBR komplett beziehungsweise teilweise zurückschreiben?\n")); if (auswertung == 2) return 1; if (i ==0) { this->setCursor(Qt::WaitCursor); if (cmb_mbr->currentIndex() == 0) { befehl = ("dd if='"+ folder_ + "' of=/dev/" + partition + " bs=1 count=446"); i = system (befehl.toLatin1().data()); this->setCursor(Qt::ArrowCursor); if (i == 0) QMessageBox::about(this, tr("Note", "Hinweis"), tr("The Boot Loader section is successful return.\n", "Der Bootloaderbereich wurde erfolgreich wieder hergestellt.\n")); else QMessageBox::about(this, tr("Note", "Hinweis"), tr("The boot loader area was not restored.\n", "Der Bootloaderbereich wurde nicht wieder hergestellt.\n")); } if (cmb_mbr->currentIndex() == 2) { //Partitionstabelle extrahieren befehl = ("dd if='"+ folder_ + "' of=" + homepath + "/.mbr.txt bs=1 skip=446 count=66"); i = system (befehl.toLatin1().data()); //Partitionstabelle wiederherstellen befehl = ("dd if=" + homepath + "/.mbr.txt of=/dev/" + partition + " bs=1 seek=446 count=66"); i = i + system (befehl.toLatin1().data()); //Datei löschen befehl = "rm " + homepath + "/.mbr.txt"; system (befehl.toLatin1().data()); this->setCursor(Qt::ArrowCursor); if (i == 0) QMessageBox::about(this, tr("Note", "Hinweis"), tr("The partition table is successful return.", "Die Partitionstabelle wurde erfolgreich wieder hergestellt.\n")); else QMessageBox::about(this, tr("Note", "Hinweis"), tr("The partition table was not restored.\n", "Die Partitionstabelle wurde nicht wieder hergestellt.\n")); } if (cmb_mbr->currentIndex() == 1) { // MBR und Pasrtitionstabelle wieder herstellen befehl = ("dd if='"+ folder_ + "' of=/dev/" + partition + " bs=1 count=512"); i = system (befehl.toLatin1().data()); this->setCursor(Qt::ArrowCursor); if (i == 0) QMessageBox::about(this, tr("Note","Hinweis"), tr("The MBR is successful return.\n", "Der MBR wurde erfolgreich wieder hergestellt.\n")); else QMessageBox::about(this, tr("Note", "Hinweis"), tr("The MBR is not restored.\n", "Der MBR wurde nicht wieder hergestellt.\n")); } } } } if (dialog_auswertung == 5 && cmb_mbr->currentIndex() == 3) { i = folder_einlesen(); if (i ==1) return 0; int auswertung = questionMessage(tr("Caution: If you really want to to write back the secret field?\n", "Vorsicht: Wollen Sie wirklich den verborgenen Bereich zurückschreiben? \n")); if (auswertung == 2) return 1; //i = folder_einlesen(); this->setCursor(Qt::WaitCursor); if (i ==0) { //verborgenen Bereich extrahieren befehl = ("dd if='"+ folder_ + "' of=" + homepath + "/.mbr.txt bs=1 skip=512 count=" + Sektor_byte_1); i = system (befehl.toLatin1().data()); //verborgenen Bereich wiederherstellen befehl = ("dd if=" + homepath + "/.mbr.txt of=/dev/" + partition + " bs=1 seek=512 count=" + Sektor_byte_1); i = i + system (befehl.toLatin1().data()); //Datei löschen befehl = "rm " + homepath + "/.mbr.txt"; i = system (befehl.toLatin1().data()); this->setCursor(Qt::ArrowCursor); if (i == 0) QMessageBox::about(this, tr("Note", "Hinweis"), tr("The hidden area is successful return.\n", "Der verborgene Bereich wurde erfolgreich wieder hergestellt.\n")); else QMessageBox::about(this, tr("Note", "Hinweis"), tr("The hidden area was not restored.\n", "Der verborgene Bereich wurde nicht wieder hergestellt.\n")); } } return 0; }