ISO9660 - Dokumentation


      Vorwort:
      Diese Dokumentation entstand im Rahmen des Betriebssysteme 2 - Praktikums an
      der Universität Magdeburg.


      Inhalt:

        1. Einführung
        2. Identifizierung einer ISO9660-kompatiblen CD
        3. Die "Volume Deskriptoren"
        4. Weitere Datenstrukturen
        5. Wie lese ich denn nun eine ISO9660-CD ?
        6. Quellen




    1. Einführung:

      Die Sektorgröße einer ISO-kompatiblen CD beträgt 2048 Byte (obwohl
      laut Spezifikation auch andere Sektorgrößen möglich wären - nur
      nutzt das niemand).
      Die Daten sind sequentiell zu lesen, d.h. wenn man den Inhalt einer
      Datei lesen möchte, die größer als ein Sektor ist, braucht man einfach
      nur die darauffolgenden Sektoren zu lesen.
      Es gibt zwei weit verbreitete Erweiterung zum ISO9660-Standard:
      Joliet und RockRidge.

    2. Identifizieren einer ISO9660-kompatiblen CD

      In Sektor 16 an offset 1 sollte die Zeichenkette CD001 zu finden sein !

    3. Die "Volume Deskriptoren"

      Die Sektoren 0 bis 15 einer ISO9660-kompatiblen CD enthalten nur Nullen.
      Erst ab Sektor 16 befinden sich "sinnvolle" Daten. Der 16. Sektor enhält
      einen sogenannten Primary Volume Descriptor (PVD).
      Dem PVD folgt mindestens ein weiterer Descriptor - entweder folgt ein
      sog. Volume Descriptor Set Terminator (VDST), das ist das Zeichen, daß
      keine weiteren Volume Descriptoren folgen werden. Es können aber auch
      andere Volume Descriptoren auftreten, z.B. Boot Record oder
      Supplementary Volume Descriptor (SVD).
      Welcher Deskriptor-Typ jeweils vorliegt, kann man an Offset 0 des jeweiligen Sektors
      erkennen:

        0x00 => Boot Record
        0x01 => PVD
        0x02 => SVD
        0xFF => VDST

      3.1 Primary Volume Descriptor

        Aufbau:

          struct PVD {
            unsigned char descr_type;
            unsigned char magic[5];
            unsigned char descr_ver;
            unsigned char unused;
            unsigned char sysid[32];
            unsigned char volid[32];
            unsigned char zeros1[8]
            unsigned char seknum[8];
            unsigned char zeros2[32];
            unsigned char volsetsize[4];
            unsigned char volseqnum[4];
            unsigned char seksize[4];
            unsigned char pathtablen[8];
            unsigned char firstsek_LEpathtab1_LE[4];
            unsigned char firstsek_LEpathtab2_LE[4];
            unsigned char firstsek_BEpathtab1_BE[4];
            unsigned char firstsek_BEpathtab2_BE[4];
            unsigned char rootdir[34];
            unsigned char volsetid[128];
            unsigned char pubid[128];
            unsigned char dataprepid[128];
            unsigned char appid[128];
            unsigned char copyr[37];
            unsigned char abstractfileid[37];
            unsigned char bibliofileid[37];
            unsigned char creationdate[17];
            unsigned char modify[17];
            unsigned char expire[17];
            unsigned char effective[17];
            unsigned char filestruc_ver;
            unsigned char zero;
            unsigned char app_use[512];
            unsigned char res[653];
          }

        Beschreibung der wichtigsten Einträge in der obigen Struktur:

          * descr_type:
            hier steht 0x01
          * magic[5]:
            gefüllt mit CD001
          * descr_ver:
            Deskriptor-Version
          * sysid[32]:
            System Identifier
          * volid[32]:
            Volume Identifier
          * seknum[8]:
            Anzahl der Sektoren
          * volsetsize[4]:
            Größe des Medium
          * seksize[4]:
            Größe eines Sektor in Byte
          * pahttablen[8]:
            Länge der Pfad-Tabelle
            Siehe auch Struktur der Pfad-Tabelle
          * firstsek_LEpathtab1_LE[4]:
            Sektor, in der sich die Pfad-Tabelle befindet (Little Endian)
          * firstsek_LEpathtab2_LE[4]:
            Sektor, in der sich eine optionale Pfad-Tabelle befindet (Little Endian)
          * firstsek_BEpathtab1_LE[4]:
            Sektor, in der sich die Pfad-Tabelle befindet (Big Endian)
          * firstsek_BEpathtab2_LE[4]:
            Sektor, in der sich eine optionale Pfad-Tabelle befindet (Big Endian)
          * volsetid[128]:
            Volume Set Identifier
          * pubid[128]:
            Publisher Identifier
          * dataprepid[128]:
            Data Preparer Identifier
          * appid[128]:
            Application Identifier
          * copyr[37]:
            Copyright File Identifier
          * abstractfileid[37]:
            Abstract File Identifier
          * bibliofileid[37]:
            Bibliographic File Identifier
          * creationdate[17]:
            Datum und Zeit, wann die CD erstellt wurde
            Siehe dazu: Aufbau der Datum- und Zeitfeldes eines PVD oder SVD
          * modify[17]:
            Datum und Zeit, wann die CD zuletzt verändert wurde
            Siehe dazu: Aufbau der Datum- und Zeitfeldes eines PVD oder SVD
          * expire[17]:
            Wann sind die Daten evt. nicht mehr gültig
            Siehe dazu: Aufbau der Datum- und Zeitfeldes eines PVD oder SVD
          * filestruc_ver:
            Version der Spezifikation für Verzeichnis- und Pfadtabelleneinträge

      3.2 Supplementary Volume Descriptor

        Der Aufbau des SVD ist dem des PVD sehr ähnlich.Es gibt 2 wesentliche
        Unterschiede:
        Das SVD.unused ist nicht länger unbenutzt wie beim PVD, sondern bietet
        Platz für "volume flags". Außerdem wird SVD.zeros2 jetzt für sog.
        Escape-Sequenzen benutzt, wobei die "volume flags" angeben, nach welchem
        Standard diese Escape-Sequenzen geschrieben worden sind.
        Letztendlich ist nur Bit 0 der "volume flags" von Bedeutung - ist Bit 0 NICHT
        gesetzt, sind die Escape-Sequenzen nach ISO2375 geschrieben, sonst eben nicht.

      3.3 Boot Record

        Aufbau:

          struct BootDescr {
            unsigned char descr_type;
            unsigned char magic[5];
            unsigned char descr_ver;
            unsigned char sysid[32];
            unsigned char bootid[32];
            unsigned char system_use[1977];
          }

      3.4 Volume Descriptor Set Terminator

        Hier ist eigentlich nur das Byte an Offset 0 interessant (0xFF).
        Daran läßt sich ja schließlich erkennen, ob es ein VDST ist.
        Wie bereits erwähnt, ist die einzige Funktion dieses Deskriptors
        zu signalisieren, daß keine weiteren Volume Deskriptoren mehr
        folgen.


    4. Weitere Datenstrukturen

      Aufbau des Datum- und Zeitfeldes eines PVD oder SVD:
        Offset Bedeutung
        0 bis 3 Jahr (von 1 bis 9999)
        4 bis 5 Monat (von 1 bis 12)
        6 bis 7 Tag (von 1 bis 31)
        8 bis 9 Stunde (von 0 bis 23)
        10 bis 11 Minute (von 0 bis 59)
        12 bis 13 Sekunde (von 0 bis 59)
        14 bis 15 Hundertstel
        16 Offset für Greenwich-Zeit (in 15 min. Intervallen)

      Struktur der Pfad-Tabelle:
        Offset Bedeutung
        0 Länge des Tabellen-Eintrags (LEN)
        1 Länge des erweiterten Eintrags
        2 bis 5 Sektor der Erweiterung
        6 bis 7 Sektor des Eltern-Verzeichnisses
        8 bis (7+LEN) Name des Verzeichnisses
        (8+LEN) Padding byte

      Aufbau eines Verzeichnis- bzw. Dateieintrags:
        Offset Bedeutung
        0 Länge des Eintrags (LEN)
        1 Länge des erweiterten Eintrags
        2 bis 9 Sektor, wo der erweiterte Eintrag liegt
        10 bis 17 Größe der Datei oder des Verzeichnisses
        18 bis 24 Datum und Zeit
        Siehe Das Datum- und Zeitfeld eines Datei- oder Verzeichniseintrags
        25 Datei Flags - Siehe Tabelle Datei Flags
        26 File Unit Size ?
        27 Interleave Gap Size ?
        28 bis 31 Volume Sequence Number ?
        32 Länge des Datei- bzw. Verzeichnisnamens (LEN_F)
        33 bis (32+LEN_F) Name der Datei oder des Verzeichnisses
        (33+LEN) Padding byte
        (LEN - LEN_SU) bis LEN-1 System Use Field

      Das Datum- und Zeitfeld eines Datei- oder Verzeichniseintrags:
        Offset Bedeutung
        0 Anzahl der Jahre seit 1900
        1 Monat (1 bis 12)
        2 Tag (1 bis 31)
        3 Stunde (0 bis 23)
        4 Minute (0 bis 59)
        5 Sekunde (von 0 bis 59)
        6 Offset zur Greenwich-Zeit
        in 15 min. Intervallen

      Datei Flags:
        Bit Name
        0 Versteckt
        1 Verzeichnis
        2 Datei
        3 Record ?
        4 read only
        5 Reserviert
        6 Reserviert
        7 Multi-Extent ?


    5. Wie lese ich denn nun eine ISO9660-CD ?

      Als erstes sollte man den Sektor der Pfad-Tabelle ermitteln. Dazu liest
      man den PVD ein und schaut sich firstsek_LEpathtab1_LE an. Zwischen
      dem ermittelten Sektor der Pfad-Tabelle und dem 16. Sektor sucht man jetzt
      nach weiteren "Volume Deskriptoren". Findet man dabei einen SVD, muß man
      sich diesen Sektor merken. Die Suche ist abgeschlossen, wenn man auf den
      VDST stößt.
      Wenn man einen SVD gefunden hat, muß der Sektor für die Pfad-Tabelle
      wieder neu bestimmt werden. Anschließend kann man in der Pfad-Tabelle
      den Sektor des Hauptverzeichnisses ermitteln. Dieser wird eingelesen
      und wie ein "normaler" Verzeichniseintrag behandelt. Ausgehend vom
      Hauptverzeichnis kann man sich jetzt durch die Verzeichnisstruktur
      der CD hangeln.

    6. Quellen

      ECMA - "Volume and File Structure of CDROM for Information Interchange"





    Last Update: 26.02.2001