Oczywiście zwolennicy poszczególnych systemów starali się wpływać na kształt tego systemu plików, stąd zawiera on wiele kompromisów oraz jest dość złożony jak na zadanie, jaki przed nim postawiono.
Różne wersje systemu plików ISO9660
Stworzenie międzyplatformowego, wspólnego dla różnych architektur systemu plików okazało się zadaniem na tyle trudnym, że powstało kilka odmian iso9660. Oto jak przedstawia się lista wersji iso9660:
typedef unsigned char Byte;
typedef unsigned short Word;
typedef unsigned long Long;
typedef struct
{
Byte VDType; /* koniecznie 1 dla pierwszego deskryptora */
char VSStdId[5]; /* koniecznie "CD001". */
Byte volumeFlags; /* 0 dla pierwszego deskryptora */
char systemIdentifier[32]; /* System przeznaczenia */
char volumeIdentifier[32]; /* Nazwa woluminu */
Long lsbVolumeSpaceSize; /* Rozmiar woluminu, mały indianin */
Long msbVolumeSpaceSize; /* Rozmiar woluminu, duży indianin */
Word msbVolumeSetSize;
Word lsbLogicalBlockSize; /* Logiczny rozmiar bloku, obaj indianie */
Word msbLogicalBlockSize; /* jw, duży indianin */
Long lsbPathTableSize; /* Ile bajtów ma tablica ścieżek */
Long msbPathTableSize;
Long lsbPathTable1; /* pierwszy sektor tablicy ścieżek */
Long lsbPathTable2; /* opcjonalnie, drugi sektor */
Long msbPathTable1;
Long msbPathTable2;
char rootDirectoryRecord[34]; /* kopia katalogu głównego */
char volumeSetIdentifier[128];/* prawa autorski i pola kontrolne */
char publisherIdentifier[128];
char dataPreparerIdentifier[128];
char applicationIdentifier[128];
char copyrightFileIdentifier[37];
char abstractFileIdentifier[37];
char bibliographicFileIdentifier[37];
char volumeCreation[17];
char volumeModification[17];
char volumeExpiration[17];
char volumeEffective[17];
char FileStructureStandardVersion;
char ApplicationUse[512];
char FutureStandardization[653];
} PVD, *PVDPtr;
typedef char dirIDArray[8];
typedef struct
{
byte len_di; /* długość nazwy katalogu, 1 dla katalogu głównego */
byte XARlength; /* długość rekordu z rozszerzonymi atrybutami */
Long dirLocation; /* pierwszy blok katalogu */
Word parentDN; /* numer katalogu nadrzędnego */
dirIDArray dirID; /* nazwa katalogu */
} PathTableRecord, PathTableRecordPtr;
katalogi w tablicy ścieżek są umieszczone wg. następującej zasady:
typedef struct
{
char signature[2]; /* $41 $41 - 'AA' famous value. */
byte extensionLength; /* $0E for this ID. */
byte systemUseID; /* 02 = HFS. */
byte fileType[4]; /* Such as 'TEXT' or 'STAK'. */
byte fileCreator[4]; /* Such as 'hscd' or 'WILD'. */
byte finderFlags[2];
} AppleExtension;
typedef struct
{
byte len_dr; /* rozmiar rekordu katalogu */
byte XARlength; /* rozmiar rekordu z rozszerzonymi atrybutami */
Long lsbStart; /* pierwszy blok pliku */
Long msbStart;
Long lsbDataLength; /* rozmiar pliku w bajtach */
Long msbDataLength;
byte year; /* od 1900. */
byte month;
byte day;
byte hour;
byte minute;
byte second;
byte gmtOffset; /* 15-minutowe przesunięcie od GMT */
byte fileFlags; /* atrybuty */
byte interleaveSize; /* Używane dla plików interleaved */
byte interleaveSkip; /* jw */
Word lsbVolSetSeqNum; /* który wolumin ze zbioru zawiera ten plik */
Word msbVolSetSeqNum;
byte len_fi; /* długość nazwy następnego pliku */
char fi[37]; /* nazwa pliku */
AppleExtension apple; /* coś dla sadowników */
} DirRcd, *DirRcdPtr;