[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [Patch] fdisk
Ok, der dritte Anlauf ;) So weit ich das seh, hab ich jetzt alles beachtet.
Index: lost/trunk/src/modules/c/fdisk/partition.h
===================================================================
--- lost/trunk/src/modules/c/fdisk/partition.h (revision 0)
+++ lost/trunk/src/modules/c/fdisk/partition.h (revision 0)
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Martin Kleusberg.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FDISK_PARTITION_H__
+#define __FDISK_PARTITION_H__
+
+#include <stdint.h>
+
+#define DISK_SIGNATURE_START 0x1B8
+#define PARTITION_TABLE_START 0x1BE
+#define BOOT_SIGNATURE_POS 0x1FE
+#define BOOT_SIGNATURE 0xAA55
+
+#define SECTORS_PER_TRACK 63
+
+#define BOOTFLAG_SET 0x80
+#define BOOTFLAG_UNSET 0x00
+
+#define DEFAULT_PARTITION_TYPE 0x83
+#define DEFAULT_BOOTABLE_FLAG BOOTFLAG_UNSET
+
+#define PARTITION_TYPE_PRIMARY 0
+#define PARTITION_TYPE_EXTENDED 1
+#define PARTITION_TYPE_LOGICAL 2
+
+// Ein Zeiger auf argv[1] oder besser gesagt den Laufwerksnamen
+char* device_name;
+// Anzahl der Heads
+unsigned long device_numheads;
+
+// Ein einzelner Eintrag der Partitionstabelle, wie er auch auf der Festplatte
+// vorkommt
+struct partition_entry_t
+{
+ uint8_t bootable; // Bootflag (0x00 nicht bootable, 0x80 bootable)
+ uint8_t start[3]; // Startposition im CHS Format
+ uint8_t type; // Partitionstyp
+ uint8_t end[3]; // Endposition im CHS Format
+ uint32_t start_sector; // LBA Startposition
+ uint32_t num_sectors; // Anzahl der Sektoren in der Partition
+} __attribute__ ((__packed__));
+
+// Alle Informationen ueber eine Partition, die fdisk benoetigt
+struct partition_t
+{
+ int exists; // 1, wenn die Partition existiert, 0 wenn nicht
+ unsigned int number; // Nummer der Partition, beginnend mit 1
+ int type; // 0 = primary, 1 = extended, 2 = logical
+
+ struct partition_entry_t data; // Die eigentlichen Daten
+};
+
+// Berechnet den Endsektor einer Partition
+long get_end_sector(struct partition_t* p);
+// Gibt die Disk Signature des zurueck
+uint32_t get_disk_signature();
+// Zerlegt die 3 Byte grossen CHS Eintraege
+void uncompress_chs(uint8_t* compressed, unsigned int* cylinder,
+ unsigned int* head, unsigned int* sector);
+// Erstellt die 3 Byte grossen CHS Eintraege
+void compress_chs(uint8_t* compressed, unsigned int cylinder,
+ unsigned int head, unsigned int sector);
+// Konvertiert CHS nach LBA
+unsigned int chs2lba(unsigned int cylinder, unsigned int head,
+ unsigned int sector);
+// Konvertiert LBA nach CHS
+void lba2chs(unsigned int lba, unsigned int* cylinder, unsigned int* head,
+ unsigned int* sector);
+// Partitionsdaten von der Fesplatte lesen. Gibt 0 zurueck, wenn erfolgreich
+int read_partitions(char* filename);
+// Neuen MBR erstellen und auf Festplatte schreiben. Gibt 0 zurueck,
+// wenn erfolgreich
+int apply_changes();
+// Loescht eine Partition
+void delete_partition(struct partition_t* p);
+// Erstellt eine neue Partition
+void create_partition(struct partition_t* p, unsigned int number,
+ unsigned int start_lba, unsigned int end_lba);
+
+// Kopie des MBR und Array fuer die Primary Partitions
+unsigned char mbr[512];
+struct partition_t mbr_partitions[4];
+
+#endif
Index: lost/trunk/src/modules/c/fdisk/fdisk.c
===================================================================
--- lost/trunk/src/modules/c/fdisk/fdisk.c (revision 0)
+++ lost/trunk/src/modules/c/fdisk/fdisk.c (revision 0)
@@ -0,0 +1,465 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Martin Kleusberg.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <readline/readline.h>
+#define _USE_START_
+#include <init.h>
+
+#include "partition.h"
+#include "typeids.h"
+
+// Diese Variable wird auf 1 gesetzt, wenn aenderungen vorgenommen wurden,
+// und sobald diese auf die Festplatte geschrieben wurden, auf 0 zurueck
+// gesetzt
+int unsaved_changes = 0;
+
+// Diese Funktion wird nur vorruebergehend benoetigt, da getchar() nicht
+// auf einen Tastendruck wartet.
+// TODO Entfernen, sobald getchar wie erwartet funktioniert
+char keyboard_read_char()
+{
+ fflush(stdout);
+ char c = 0;
+ while (!fread(&c, 1, 1, stdin));
+ putchar(c);
+ return c;
+}
+
+// Diese Funktion konvertiert 2 chars in einen 8bit Integer Wert,
+// z.B.: c1 = F und c2 = F => Ergebis = 255.
+// TODO Entfernen, sobald sscanf implementiert ist
+unsigned char hex2uint8(char c1, char c2)
+{
+ unsigned char temp = 0;
+ char ret_val = 0;
+
+ if (c1 >= '0' && c1 <= '9') {
+ temp = c1 - '0';
+ }
+ if (c1 >= 'A' && c1 <= 'F') {
+ temp = c1 - 'A' + 10;
+ }
+ if (c1 >= 'a' && c1 <= 'f') {
+ temp = c1 - 'a' + 10;
+ }
+ ret_val = temp * 16;
+
+ if (c2 >= '0' && c2 <= '9') {
+ temp = c2 - '0';
+ }
+ if (c2 >= 'A' && c2 <= 'F') {
+ temp = c2 - 'A' + 10;
+ }
+ if (c2 >= 'a' && c2 <= 'f') {
+ temp = c2 - 'a' + 10;
+ }
+ ret_val += temp;
+
+ return ret_val;
+}
+
+void shell_list_partitions()
+{
+ // Allgemeine Daten und Statistiken
+ printf("%s\n", device_name);
+ printf(" Disk Signature: 0x%-08x\n\n", get_disk_signature());
+
+ // Kopfzeile der Tabelle
+ printf("# | Start | End | Boot | Type\n");
+
+ // TODO extended/logical partitions unterstuetzen
+
+ // Partitionen auflisten
+ int i;
+ for (i=0;i<4;i++) {
+ // Nur dann was anzeigen, wenn die Partition auch existiert
+ if (mbr_partitions[i].exists) {
+ printf("%2i|%12i|%12i| %c | %02x\n", mbr_partitions[i].number,
+ mbr_partitions[i].data.start_sector,
+ get_end_sector(&mbr_partitions[i]),
+ mbr_partitions[i].data.bootable == BOOTFLAG_SET ? '*' : ' ',
+ (int)mbr_partitions[i].data.type);
+ }
+ }
+}
+
+void shell_toggle_bootable()
+{
+ // TODO extended/logical partitions unterstuetzen
+
+ // Den User nach der Partitionsnummer fragen. Den passenden Array Index
+ // erhaelt man durch Subtraktion von 1
+ printf("Which partition (0 to cancel)? ");
+ int partition = (int)(keyboard_read_char()-'0') - 1;
+ printf("\n");
+
+ // Abbrechen?
+ if (partition == -1) {
+ return;
+ }
+
+ // Eingabe ueberpruefen. Die Nummer muss gueltig sein, und die
+ // dazugehoerige Partition soll exisitieren
+ if (partition < 0 || partition > 3 ||
+ mbr_partitions[partition].exists == 0)
+ {
+ printf("Invalid partition\n");
+ } else {
+ if (mbr_partitions[partition].data.bootable == BOOTFLAG_UNSET) {
+ mbr_partitions[partition].data.bootable = BOOTFLAG_SET;
+ } else if (mbr_partitions[partition].data.bootable == BOOTFLAG_SET) {
+ mbr_partitions[partition].data.bootable = BOOTFLAG_UNSET;
+ } else {
+ printf("WARNING: The bootable flag was invalid! Maybe the "
+ "partition table is corrupted!\n");
+ printf(" It's now set to not bootable.\n");
+ mbr_partitions[partition].data.bootable = BOOTFLAG_UNSET;
+ }
+ unsaved_changes = 1;
+ }
+}
+
+void shell_write()
+{
+ // Sollen die aenderungen wirklich auf die HDD geschrieben werden?
+ printf("WARNING: You should be absoulutely sure what you do! You may "
+ "destroy your data and it's hard to undo this step.\n");
+ printf("Continue? [Yn] ");
+ char answer = keyboard_read_char();
+ printf("\n");
+
+ if (answer == 'Y') {
+ if (!apply_changes()) {
+ printf("Saved. You should restart your computer now.\n");
+ unsaved_changes = 0;
+ }
+ }
+}
+
+void shell_delete()
+{
+ // Den User nach der Partitionsnummer fragen. Den passenden Array Index
+ // erhaelt man durch Subtraktion von 1
+ printf("Which partition (0 to cancel)? ");
+ int partition = (int)(keyboard_read_char()-'0') - 1;
+ printf("\n");
+
+ // TODO extended/logical partitions unterstuetzen
+
+ // Abbrechen?
+ if (partition == -1) {
+ return;
+ }
+
+ // Eingabe ueberpruefen. Die Nummer muss gueltig sein, und die
+ // dazugehoerige Partition soll (noch) exisitieren
+ if (partition < 0 || partition > 3 ||
+ mbr_partitions[partition].exists == 0)
+ {
+ printf("Invalid partition\n");
+ } else {
+ delete_partition(&mbr_partitions[partition]);
+ unsaved_changes = 1;
+ }
+}
+
+void shell_typelist()
+{
+ int i;
+ int types_printed = 0;
+ for (i=0;i<256;i++) {
+ if (partition_type_id[i].name != 0) {
+ // 3 Typen pro Zeile anzeigen. Um diesen Wert zu aendern, muss
+ // die 21 im printf String und die 3 in der if Abfrage geaendert
+ // werden
+ printf("%02x %-21s", i, partition_type_id[i].name);
+ if (((++types_printed) % 3 == 0) || (i == 255)) {
+ printf("\n");
+ } else {
+ printf(" - ");
+ }
+ }
+ }
+}
+
+void shell_settype()
+{
+ // Den User nach der Partitionsnummer fragen. Den passenden Array Index
+ // erhaelt man durch Subtraktion von 1
+ printf("Which partition (0 to cancel)? ");
+ int partition = (int)(keyboard_read_char()-'0') - 1;
+ printf("\n");
+
+ // TODO extended/logical partitions unterstuetzen
+
+ // Abbrechen?
+ if (partition == -1) {
+ return;
+ }
+
+ // Eingabe ueberpruefen. Die Nummer muss gueltig sein, und die
+ // dazugehoerige Partition muss exisitieren
+ if (partition < 0 || partition > 3 ||
+ mbr_partitions[partition].exists == 0)
+ {
+ printf("Invalid partition\n");
+ } else {
+ // TODO Die Eingabe sollte komfortabler werden. Daher muss das
+ // Eingabeformat eingeschraenkt werden und eine Suchfunktion
+ // bzw. etwas vergleichbares intigiert werden.
+ // Den User solange nach einer neuen ID fragen, wie er eine
+ // ungueltige eingibt
+ char good_input = 0;
+ char* input;
+ do {
+ input = readline("Please enter the new type as two digit hex "
+ "code or h for help: ");
+ if (strcmp(input, "h") == 0) {
+ shell_typelist();
+ free(input);
+ } else if (isxdigit(input[0]) && isxdigit(input[1])) {
+ good_input = 1;
+ } else {
+ free(input);
+ }
+ } while (good_input == 0);
+ // Die Eingabe konvertieren und den Partitionseintrag entsprechend
+ // abaendern
+ mbr_partitions[partition].data.type = hex2uint8(input[0], input[1]);
+ free(input);
+
+ unsaved_changes = 1;
+ }
+}
+
+void shell_new()
+{
+ // TODO extended/logical partitions unterstuetzen
+ // TODO Funktion etwas aufraeumen
+
+ // Den User nach der Partitionsnummer fragen. Den passenden Array Index
+ // erhaelt man man durch Subtraktion von 1
+ printf("Which partition (0 to cancel)? ");
+ int partition = (int)(keyboard_read_char()-'0') - 1;
+ printf("\n");
+
+ // Abbrechen?
+ if (partition == -1) {
+ return;
+ }
+
+ // Eingabe ueberpruefen. Die Nummer muss gueltig sein, und die
+ // dazugehoerige Partition darf noch nicht exisitieren
+ if (partition < 0 || partition > 3 ||
+ mbr_partitions[partition].exists != 0)
+ {
+ printf("Invalid partition number\n");
+ } else {
+ // TODO Nur gueltige Werte akzeptieren, so dass es nicht mehr moeglich
+ // ist, Partitionen zu erstellen, die zu gross sind, nicht
+ // vollstaendig auf der Festplatte liegen, die sich mit anderen
+ // Partitionen ueberlappen oder die ihren Startpunkt nach ihrem
+ // Ende haben
+
+ // In welchem Format soll die Startadresse eingegeben werden
+ printf("Start Position: CHS or LBA? [CL] ");
+ char input_type = 0;
+ do {
+ printf("\b"); // NOTE Diese Zeile sollte eigentlich das Zeichen von
+ // der letzten (falschen) Eingabe entfernen.
+ // Das \b funktioniert momentan aber nicht richtig
+ input_type = keyboard_read_char();
+ } while (input_type != 'C' && input_type != 'c' && input_type != 'L' &&
+ input_type != 'l');
+ printf("\n");
+
+ // Start Adresse
+ unsigned int start_lba;
+ if (input_type == 'C' || input_type == 'c') {
+ // User will Adresse im CHS Format eingeben
+ char* input = readline("Start Position: Cylinder? ");
+ unsigned int start_cylinder = atoi(input);
+ free(input);
+ input = readline("Start Position: Head? ");
+ unsigned int start_head = atoi(input);
+ free(input);
+ input = readline("Start Position: Sector? ");
+ unsigned int start_sector = atoi(input);
+ free(input);
+
+ start_lba = chs2lba(start_cylinder, start_head, start_sector);
+ } else {
+ // Eingabe im LBA Format
+ char* input = readline("Start Position: LBA Address? ");
+ start_lba = atoi(input);
+ free(input);
+ }
+
+ // Soll die Endadresse im CHS oder im LBA Format eingegeben werden?
+ // Oder anhand der Groesse berechnet werden?
+ printf("End Position: CHS, LBA or calculate from size? [CLS] ");
+ input_type = 0;
+ do {
+ printf("\b");
+ input_type = keyboard_read_char();
+ } while (input_type != 'C' && input_type != 'c' && input_type != 'L' &&
+ input_type != 'l' && input_type != 'S' && input_type != 's');
+ printf("\n");
+
+ // Endposition bzw. Groesse ermitteln
+ unsigned int end_lba;
+ if (input_type == 'C' || input_type == 'c') {
+ // User will Adresse im CHS Format eingeben
+ char* input = readline("End Position: Cylinder? ");
+ unsigned int end_cylinder = atoi(input);
+ free(input);
+ input = readline("End Position: Head? ");
+ unsigned int end_head = atoi(input);
+ free(input);
+ input = readline("End Position: Sector? ");
+ unsigned int end_sector = atoi(input);
+ free(input);
+
+ end_lba = chs2lba(end_cylinder, end_head, end_sector);
+ } else if (input_type == 'L' || input_type == 'l') {
+ // Eingabe im LBA Format
+ char* input = readline("End Position: LBA Address? ");
+ end_lba = atoi(input);
+ free(input);
+ } else {
+ // Endposition anhand der Partitionsgroesse berechnen
+ char* input = readline("End Position: Partition size "
+ "(in sectors)? ");
+ end_lba = start_lba + atoi(input);
+ free(input);
+ }
+
+ // Neue Partition erstellen
+ create_partition(&mbr_partitions[partition], partition, start_lba,
+ end_lba);
+
+ unsaved_changes = 1;
+ }
+}
+
+void shell()
+{
+ printf("Type h for help\n");
+
+ while (1) {
+ // Naechsten Befehl holen
+ char* input = readline("> ");
+
+ // Eingegebenen Befehl ermitteln
+ if (strcmp(input, "h") == 0) { // Hilfe
+ // NOTE Das \t funktioniert momentan nicht
+ printf("Type one of the following commands:\n");
+ printf("b\t\t\tToggle bootable flag\n");
+ printf("d\t\t\tDelete partition\n");
+ printf("h\t\t\tHelp\n");
+ printf("l\t\t\tList partitions\n");
+ printf("n\t\t\tCreate a new partition\n");
+ printf("q\t\t\tQuit\n");
+ printf("t\t\t\tChange a partition's type\n");
+ printf("tl\t\t\tList all partition types\n");
+ printf("w\t\t\tWrite changes to disk\n");
+ } else if (strcmp(input, "q") == 0) { // Beenden
+ if (unsaved_changes == 1) {
+ printf("You are about to quit. Any unsaved changes will be "
+ "lost, do you want to continue? [Yn] ");
+ char answer = keyboard_read_char();
+ printf("\n");
+ if (answer == 'Y') {
+ free(input);
+ break;
+ }
+ } else {
+ free(input);
+ break;
+ }
+ } else if (strcmp(input, "l") == 0) { // Partitionen auflisten
+ shell_list_partitions();
+ } else if (strcmp(input, "b") == 0) { // Bootable Flag aendern
+ shell_toggle_bootable();
+ } else if (strcmp(input, "w") == 0) { // aenderungen speichern
+ shell_write();
+ } else if (strcmp(input, "d") == 0) { // Partition loeschen
+ shell_delete();
+ } else if (strcmp(input, "t") == 0) { // Change partition type
+ shell_settype();
+ } else if (strcmp(input, "n") == 0) { // Neue Partition erstellen
+ shell_new();
+ } else if (strcmp(input, "tl") == 0) { // Partitionstypen auflisten
+ shell_typelist();
+ } else {
+ printf("Unknown command (h for help)\n");
+ }
+
+ free(input);
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ printf("fdisk\nThis program is in development. Be careful!\n\n");
+
+ // Command Line ueberpruefen
+ if (argc != 2) {
+ printf("Usage: fdisk device\n");
+ printf("For example: fdisk ata:/ata00\n");
+ return 0;
+ }
+
+ // Aktuelle Partitionierung einlesen
+ if (read_partitions(argv[1])) {
+ return 1;
+ }
+
+ // Anzahl der Heads erfragen
+ // TODO Automatisch erledigen
+ char* input = readline("Please enter the number of heads: ");
+ device_numheads = atoi(input);
+ free(input);
+
+ // Initialisierung fertig. Starte den interaktiven Teil
+ shell();
+
+ // Beenden, kein Fehler aufgetreten
+ return 0;
+}
Index: lost/trunk/src/modules/c/fdisk/typeids.c
===================================================================
--- lost/trunk/src/modules/c/fdisk/typeids.c (revision 0)
+++ lost/trunk/src/modules/c/fdisk/typeids.c (revision 0)
@@ -0,0 +1,300 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Martin Kleusberg.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "typeids.h"
+
+// Siehe http://www.win.tue.nl/~aeb/partitions/partition_types-1.html
+// Die Namen duerfen momenten nicht laenger als 21 sein,
+// siehe shell_typelist() in fdisk.c
+// TODO Namen und Abkuerzungen vereinheitlichen
+struct partition_type_id_t partition_type_id[257] = {
+ {0x00, "No Part."},
+ {0x01, "FAT12"},
+ {0x02, "XENIX root"},
+ {0x03, "XENIX user"},
+ {0x04, "FAT16 <32MB"},
+ {0x05, "Extended"},
+ {0x06, "FAT16 >32MB"},
+ {0x07, "NTFS/HPFS"},
+ {0x08, "AIX"},
+ {0x09, "AIX bootable"},
+ {0x0A, "OS/2 Boot Manag"},
+ {0x0B, "FAT32"},
+ {0x0C, "FAT32 (LBA)"},
+ {0x0D, 0},
+ {0x0E, "FAT16 (LBA)"},
+ {0x0F, "W95 Ext' LBA"},
+ {0x10, "OPUS"},
+ {0x11, "FAT12 (Hidden)"},
+ {0x12, "Diagnostic"},
+ {0x13, 0},
+ {0x14, "FAT16 <32M hidn"},
+ {0x15, 0},
+ {0x16, "FAT16 >32M hidn"},
+ {0x17, "NTFS/HPFS hid'n"},
+ {0x18, "AST SmartSleep"},
+ {0x19, 0},
+ {0x1A, 0},
+ {0x1B, "FAT32 hidden"},
+ {0x1C, "FAT32 hid'n LBA"},
+ {0x1D, 0},
+ {0x1E, "FAT16 hid'n LBA"},
+ {0x1F, 0},
+ {0x20, 0},
+ {0x21, 0},
+ {0x22, 0},
+ {0x23, 0},
+ {0x24, "NEC DOS"},
+ {0x25, 0},
+ {0x26, 0},
+ {0x27, 0},
+ {0x28, 0},
+ {0x29, 0},
+ {0x2A, "AtheOS AFS"},
+ {0x2B, "SyllableSecure"},
+ {0x2C, 0},
+ {0x2D, 0},
+ {0x2E, 0},
+ {0x2F, 0},
+ {0x30, 0},
+ {0x31, 0},
+ {0x32, "NOS"},
+ {0x33, 0},
+ {0x34, 0},
+ {0x35, "JFS on OS/2"},
+ {0x36, 0},
+ {0x37, 0},
+ {0x38, "THEOS 2GB"},
+ {0x39, "Plan9"},
+ {0x3A, "THEOS 4GB"},
+ {0x3B, "THEOS extended"},
+ {0x3C, "PartitionMagic"},
+ {0x3D, "NetWare Hidden"},
+ {0x3E, 0},
+ {0x3F, 0},
+ {0x40, "Venix 80286"},
+ {0x41, "PPC PReP Boot"},
+ {0x42, "SFS"},
+ {0x43, 0},
+ {0x44, "GoBack"},
+ {0x45, "Priam"},
+ {0x46, "Eumel/Ergos L3"},
+ {0x47, "Eumel/Ergos L3"},
+ {0x48, "Eumel/Ergos L3"},
+ {0x49, 0},
+ {0x4A, "AdaOS"},
+ {0x4B, 0},
+ {0x4C, "Oberon"},
+ {0x4D, "QNX4.x"},
+ {0x4E, "QNX4.x 2nd part"},
+ {0x4F, "QNX4.x 3rd part"},
+ {0x50, "OnTrack DM"},
+ {0x51, "OnTrack DM6 Aux1"},
+ {0x52, "CP/M"},
+ {0x53, "OnTrack DM6 Aux3"},
+ {0x54, "OnTrack DM6 DDO"},
+ {0x55, "EZ-Drive"},
+ {0x56, "Golden Bow"},
+ {0x57, "DrivePro"},
+ {0x58, 0},
+ {0x59, 0},
+ {0x5A, 0},
+ {0x5B, 0},
+ {0x5C, "Priam EDisk"},
+ {0x5D, 0},
+ {0x5E, 0},
+ {0x5F, 0},
+ {0x60, 0},
+ {0x61, "SpeedStor"},
+ {0x62, 0},
+ {0x63, "GNU Hurd/System V"},
+ {0x64, "Novell Netware 286"},
+ {0x65, "Novell Netware 386"},
+ {0x66, "Novell Netware SMS"},
+ {0x67, "Novell"},
+ {0x68, "Novell"},
+ {0x69, "Novell Netware 5+"},
+ {0x6A, 0},
+ {0x6B, 0},
+ {0x6C, 0},
+ {0x6D, 0},
+ {0x6E, 0},
+ {0x6F, 0},
+ {0x70, "DiskSecure MultiBoot"},
+ {0x71, 0},
+ {0x72, "V7/x86"},
+ {0x73, 0},
+ {0x74, 0},
+ {0x75, "PX/IX"},
+ {0x76, 0},
+ {0x77, "M2FS/M2CS"},
+ {0x77, "VNDI"},
+ {0x78, "XOSL FS"},
+ {0x79, 0},
+ {0x7A, 0},
+ {0x7B, 0},
+ {0x7C, 0},
+ {0x7D, 0},
+ {0x7E, 0},
+ {0x7F, 0},
+ {0x80, "Minix <1.4a"},
+ {0x81, "Minix>1.4b/Old Linux"},
+ {0x82, "Linux swap/Solaris"},
+ {0x83, "Linux"},
+ {0x84, "OS/2 hidden C:"},
+ {0x85, "Linux extended"},
+ {0x86, "FAT16 volume set"},
+ {0x87, "NTFS volume set"},
+ {0x88, "Linux plaintext"},
+ {0x89, 0},
+ {0x8A, 0},
+ {0x8B, 0},
+ {0x8C, 0},
+ {0x8D, "FreeDOS hid'n FAT12"},
+ {0x8E, "Linux LVM"},
+ {0x8F, 0},
+ {0x90, "FreeDOS hid'n FAT16"},
+ {0x91, "FreeDOS hid'n ext'd"},
+ {0x92, "FreeDOS hid'n FAT16"},
+ {0x93, "Amoeba"},
+ {0x94, "Amoeba BBT"},
+ {0x95, "MIT EXOPC"},
+ {0x96, 0},
+ {0x97, "FreeDOS hid'n FAT32"},
+ {0x98, "FreeDOS hid FAT32LBA"},
+ {0x99, 0},
+ {0x9A, "FreeDOS hid FAT16LBA"},
+ {0x9B, "FreeDOS hid ext'dLBA"},
+ {0x9C, 0},
+ {0x9D, 0},
+ {0x9E, 0},
+ {0x9F, "BSD/OS"},
+ {0xA0, "Thinkpad hibernate"},
+ {0xA1, 0},
+ {0xA2, 0},
+ {0xA3, 0},
+ {0xA4, 0},
+ {0xA5, "NetBSD/FreeBSD"},
+ {0xA6, "OpenBSD"},
+ {0xA7, "MeXTStep"},
+ {0xA8, "Darwin UFS"},
+ {0xA9, "NetBSD"},
+ {0xAA, 0},
+ {0xAB, "Darwin boot"},
+ {0xAC, 0},
+ {0xAD, 0},
+ {0xAE, "ShagOS"},
+ {0xAF, "ShagOS swap"},
+ {0xB0, 0},
+ {0xB1, 0},
+ {0xB2, 0},
+ {0xB3, 0},
+ {0xB4, 0},
+ {0xB5, 0},
+ {0xB6, 0},
+ {0xB7, "BSDI BSD/386"},
+ {0xB8, "BSDI BSD swap"},
+ {0xB9, 0},
+ {0xBA, 0},
+ {0xBB, "BootWiz hid'n"},
+ {0xBC, 0},
+ {0xBD, 0},
+ {0xBE, "Solaris 8 boot"},
+ {0xBF, "Solaris x86"},
+ {0xC0, "CTOS/DRDOS"},
+ {0xC1, "DRDOS sec'd FAT12"},
+ {0xC2, "Hidden Linux"},
+ {0xC3, "Hid'n Linux swap"},
+ {0xC4, "DRDOS sec FAT16 <32M"},
+ {0xC5, "DRDOS sec'd ext'd"},
+ {0xC6, "DRDOS sec FAT16 >32M"},
+ {0xC7, "Syrinx"},
+ {0xC8, 0},
+ {0xC9, 0},
+ {0xCA, 0},
+ {0xCB, "DRDOS sec'd FAT32"},
+ {0xCC, "DRDOS sec FAT32 LBA"},
+ {0xCD, 0},
+ {0xCE, "DRDOS sec FAT16 LBA"},
+ {0xCF, "DRDOS sec ext'd LBA"},
+ {0xD0, 0},
+ {0xD1, 0},
+ {0xD2, 0},
+ {0xD3, 0},
+ {0xD4, 0},
+ {0xD5, 0},
+ {0xD6, 0},
+ {0xD7, 0},
+ {0xD8, "CP/M-86"},
+ {0xD9, 0},
+ {0xDA, "Non-FS data"},
+ {0xDB, "CP/M / CTOS"},
+ {0xDC, 0},
+ {0xDD, 0},
+ {0xDE, "Dell PowerEdge"},
+ {0xDF, "BootIt"},
+ {0xE0, 0},
+ {0xE1, "DOS access"},
+ {0xE2, 0},
+ {0xE3, "DOS R/O"},
+ {0xE4, "SpeedStor"},
+ {0xE5, "Tandy MDOS"},
+ {0xE6, 0},
+ {0xE7, 0},
+ {0xE8, "LUKS"},
+ {0xE9, 0},
+ {0xEA, 0},
+ {0xEB, "BeOS BFS"},
+ {0xEC, "SkyOS SkyFS"},
+ {0xED, 0},
+ {0xEE, "EFI GPT"},
+ {0xEF, "EFI"},
+ {0xF0, "Linux/PA-RISC boot"},
+ {0xF1, "SpeedStor"},
+ {0xF2, "DOS 3.3+ secondary"},
+ {0xF3, 0},
+ {0xF4, "SpeedStor"},
+ {0xF5, 0},
+ {0xF6, "SpeedStor"},
+ {0xF7, 0},
+ {0xF8, 0},
+ {0xF9, "pCache"},
+ {0xFA, "Bochs"},
+ {0xFB, "VMware FS"},
+ {0xFC, "VMware swap"},
+ {0xFD, "Linux raid auto"},
+ {0xFE, "LANstep"},
+ {0xFF, "Xenix BBT"}
+};
Index: lost/trunk/src/modules/c/fdisk/Makefile.all
===================================================================
--- lost/trunk/src/modules/c/fdisk/Makefile.all (revision 0)
+++ lost/trunk/src/modules/c/fdisk/Makefile.all (revision 0)
@@ -0,0 +1,8 @@
+shopt -s extglob
+source $LOST_BUILDMK_ROOT/config.sh
+
+echo "LD $1/apps/fdisk"
+
+$LOST_TOOLS_LD -ofdisk -Ttext=0x40000000 --start-group *.o $2 --end-group
+
+$LOST_TOOLS_STRIP -s fdisk -o $1/apps/fdisk
Index: lost/trunk/src/modules/c/fdisk/typeids.h
===================================================================
--- lost/trunk/src/modules/c/fdisk/typeids.h (revision 0)
+++ lost/trunk/src/modules/c/fdisk/typeids.h (revision 0)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Martin Kleusberg.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FDISK_TYPEIDS_H__
+#define __FDISK_TYPEIDS_H__
+
+// Die IDs fuer extended partitions. Es gibt noch ein paar
+// andere, die aber unwichtig sind, wie ich finde
+#define TYPE_EXTENDED_PARTITION_1 0x05
+#define TYPE_EXTENDED_PARTITION_2 0x0F
+#define TYPE_EXTENDED_PARTITION_3 0x85
+
+struct partition_type_id_t
+{
+ unsigned char id;
+ char* name;
+};
+
+extern struct partition_type_id_t partition_type_id[257];
+
+#endif
Index: lost/trunk/src/modules/c/fdisk/partition.c
===================================================================
--- lost/trunk/src/modules/c/fdisk/partition.c (revision 0)
+++ lost/trunk/src/modules/c/fdisk/partition.c (revision 0)
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2008 The LOST Project. All rights reserved.
+ *
+ * This code is derived from software contributed to the LOST Project
+ * by Martin Kleusberg.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the LOST Project
+ * and its contributors.
+ * 4. Neither the name of the LOST Project nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <types.h>
+#include <stdio.h>
+#include <string.h>
+#include "partition.h"
+#include "typeids.h"
+
+long get_end_sector(struct partition_t* p)
+{
+ return p->data.start_sector+p->data.num_sectors-1;
+}
+void uncompress_chs(uint8_t* compressed, unsigned int* cylinder,
+ unsigned int* head, unsigned int* sector)
+{
+ *head = compressed[0];
+
+ *cylinder = (compressed[1] & 0xC0) << 2;
+ *cylinder += compressed[2];
+
+ *sector = compressed[1] & 0x3F;
+}
+void compress_chs(uint8_t* compressed, unsigned int cylinder,
+ unsigned int head, unsigned int sector)
+{
+ if (head > 255) {
+ head = 254;
+ }
+ if (cylinder > 1024) {
+ cylinder = 1023;
+ }
+ if (sector > 63) {
+ sector = 63;
+ }
+ if (sector < 1) {
+ sector = 1;
+ }
+
+ compressed[0] = head;
+
+ compressed[1] = (cylinder & 0x300) >> 2;
+ compressed[1] += sector;
+
+ compressed[2] = cylinder & 0xFF;
+}
+unsigned int chs2lba(unsigned int cylinder, unsigned int head,
+ unsigned int sector)
+{
+ return(cylinder * device_numheads * SECTORS_PER_TRACK + head *
+ SECTORS_PER_TRACK + (sector - 1));
+}
+void lba2chs(unsigned int lba, unsigned int* cylinder, unsigned int* head,
+ unsigned int* sector)
+{
+ *cylinder = lba / (device_numheads * SECTORS_PER_TRACK);
+ *head = (lba % (device_numheads * SECTORS_PER_TRACK)) / SECTORS_PER_TRACK;
+ *sector = ((lba % (device_numheads * SECTORS_PER_TRACK)) %
+ SECTORS_PER_TRACK) + 1;
+}
+
+int apply_changes()
+{
+ // TODO extended/logical partitions unterstuetzen
+
+ // Datei/Laufwerk oeffnen
+ FILE* dev = fopen(device_name, "w");
+ if (dev == 0) {
+ printf("Could not open device \"%s\"\nAborting!\n", dev);
+ return -1;
+ }
+
+ // Die im RAM liegende Kopie des MBR aktualisieren, ohne jedoch den Code-
+ // Teil zu aendern
+ int i;
+ for (i=0;i<4;i++) {
+ // Wenn die Partition existiert, den Datenblock an die korrekte
+ // Position kopieren. Wenn nicht, den entsprechenden Bereich
+ // einfach mit Nullen fuellen
+ if (mbr_partitions[i].exists) {
+ memcpy(&mbr[PARTITION_TABLE_START + i *
+ sizeof(struct partition_entry_t)], &mbr_partitions[i].data,
+ sizeof(struct partition_entry_t));
+ } else {
+ memset(&mbr[PARTITION_TABLE_START + i *
+ sizeof(struct partition_entry_t)], 0,
+ sizeof(struct partition_entry_t));
+ }
+ }
+
+ // Die Boot Signature nocheinmal setzen, um sicher zu gehen, dass diese
+ // auch wirklich korrekt ist
+ uint16_t* signature = (uint16_t*)(mbr + BOOT_SIGNATURE_POS);
+ *signature = BOOT_SIGNATURE;
+
+ // Neuen MBR schreiben, den Output Buffer leeren und die Datei schliessen
+ fwrite(mbr, 1, 512, dev);
+ fflush(dev);
+ fclose(dev);
+
+ return 0;
+}
+
+void delete_partition(struct partition_t* p)
+{
+ // TODO extended/logical partitions unterstuetzen
+
+ memset(&(p->data), 0, sizeof(struct partition_entry_t));
+ p->number = 0;
+ p->exists = 0;
+}
+
+static void create_new_mbr_partition_table()
+{
+ memset(&mbr[PARTITION_TABLE_START], 0,
+ 4 * sizeof(struct partition_entry_t));
+ *((uint16_t*)&mbr[BOOT_SIGNATURE_POS]) = BOOT_SIGNATURE;
+}
+
+int read_partitions(char* filename)
+{
+ // TODO extended/logical partitions unterstuetzen
+
+ // Dateinamen speichern
+ device_name = filename;
+
+ // Laufwerk/Datei oeffnen und MBR lesen
+ FILE* dev = fopen(filename, "r");
+ if (dev == 0) {
+ printf("Could not open device \"%s\"\n", filename);
+ return -1;
+ }
+ fread(mbr, 1, 512, dev);
+
+ // Boot Signature ueberpruefen
+ if (*(uint16_t*)(&mbr[BOOT_SIGNATURE_POS]) != BOOT_SIGNATURE) {
+ printf("Invalid boot signature!\nfdisk will create a new empty "
+ "partition table.\nKeep this in mind when writing to disk.\n");
+ create_new_mbr_partition_table();
+ }
+
+ // Die Partitionstabelle analysieren und in die internen Strukturen
+ // kopieren
+ int i;
+ for (i=0;i<4;i++) {
+ memcpy(&mbr_partitions[i].data,
+ &mbr[PARTITION_TABLE_START + i * sizeof(struct partition_entry_t)],
+ sizeof(struct partition_entry_t));
+ // Ob eine Partition existiert, ueberpruefen wir m.H. des Type Bytes
+ if (mbr_partitions[i].data.type) {
+ mbr_partitions[i].number = i + 1;
+ mbr_partitions[i].exists = 1;
+
+ // Handelt es sich um eine extended Partition?
+ if (mbr_partitions[i].data.type == TYPE_EXTENDED_PARTITION_1 ||
+ mbr_partitions[i].data.type == TYPE_EXTENDED_PARTITION_2 ||
+ mbr_partitions[i].data.type == TYPE_EXTENDED_PARTITION_3)
+ {
+ // Es ist eine! Also diesen Eintrag extra behandeln
+ mbr_partitions[i].type = PARTITION_TYPE_EXTENDED;
+ printf("Extended/Logical partitions are not yet supported!\n");
+ } else {
+ mbr_partitions[i].type = PARTITION_TYPE_PRIMARY;
+ }
+ } else {
+ mbr_partitions[i].number = 0;
+ mbr_partitions[i].exists = 0;
+ mbr_partitions[i].type = PARTITION_TYPE_PRIMARY;
+ }
+ }
+
+ // Datei schliessen
+ fclose(dev);
+
+ return 0;
+}
+
+void create_partition(struct partition_t* p, unsigned int number,
+ unsigned int start_lba, unsigned int end_lba)
+{
+ // TODO extended/logical partitions unterstuetzen
+
+ // Die LBA Daten ins CHS Format konvertieren
+ unsigned int start_cyl, start_head, start_sec;
+ lba2chs(start_lba, &start_cyl, &start_head, &start_sec);
+ unsigned int end_cyl, end_head, end_sec;
+ lba2chs(end_lba, &end_cyl, &end_head, &end_sec);
+
+ // Daraus die "komprimierten" CHS Eintraege erstellen
+ uint8_t start_chs[3];
+ compress_chs(start_chs, start_cyl, start_head, start_sec);
+ uint8_t end_chs[3];
+ compress_chs(end_chs, end_cyl, end_head, end_sec);
+
+ // Die Strukturen entsprechend anpassen
+ p->exists = 1;
+ p->number = number;
+ p->type = PARTITION_TYPE_PRIMARY;
+ p->data.bootable = DEFAULT_BOOTABLE_FLAG;
+ p->data.start[0] = start_chs[0];
+ p->data.start[1] = start_chs[1];
+ p->data.start[2] = start_chs[2];
+ p->data.type = DEFAULT_PARTITION_TYPE;
+ p->data.end[0] = end_chs[0];
+ p->data.end[1] = end_chs[1];
+ p->data.end[2] = end_chs[2];
+ p->data.start_sector = start_lba;
+ p->data.num_sectors = end_lba - start_lba + 1;
+}
+
+uint32_t get_disk_signature()
+{
+ return *(uint32_t*)(&mbr[DISK_SIGNATURE_START]);
+}