Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

AFS (File format): Difference between revisions

m Algoflash moved page AFS (Format de fichier) to AFS (File format) without leaving a redirect
No edit summary
Line 1: Line 1:
[[Gotcha Force | ← Gotcha Force]]
[[Gotcha Force | ← Gotcha Force]]


Le format de fichier AFS permet de [http://wiki.xentax.com/index.php/GRAF:AFS_AFS packer un ensemble de fichier dans un seul et unique fichier]. Il n'y a pas de compression. Tous les éléments (fichiers, et parties relatives au fonctionnement de l'AFS) sont alignés sur des blocks de 0x800 octets. En dehors des fichiers, l'AFS est en little endian.
The AFS file format allow to [http://wiki.xentax.com/index.php/GRAF:AFS_AFS pack a group of files sometimes in folders in one unique file]. There is no compression. Each element (packed files or AFS system files) are aligned to block of 0x800 bytes. Except for packed files AFS system files are in Little Endian.


Un AFS se compose de '''4 parties''' :
An AFS file can be diveded in '''4 parts''':
# Le '''header'''
# The '''header''':
#* 4 octets : magic number = "AFS\x00" ou "AFS\x20"
#* 4 bytes: magic number = "AFS\x00" or "AFS\x20"
#* 4 octets : nombre total de fichiers
#* 4 bytes: total number of packed files
# La '''Table Of Content''' (TOC) :
# The '''Table Of Content''' (TOC):
#* un tableau avec pour chaque fichier :
#* It's an array of couples:
#** 4 octets : offset fichier
#** 4 bytes: file offset
#** 4 octets : taille fichier
#** 4 bytes: file length
#* A la suite de ce tableau, 3 cas sont alors possibles :
#* After this array we can found 3 configurations:
#** On trouve l'offset du filename directory (4 octets) et sa taille (4 octets).
#** We find the offset of the Filename Directory (FD) (4 bytes) and it's length (4 bytes).
#** On trouve un padding (NULL bytes) puis l'offset du filename directory (4 octets) et sa taille (4 octets).
#** We find a padding (NULL bytes) and then the offset of the FD (4 bytes) and it's length (4 bytes).
#** On a tout simplement pas de filename directory (ni offset ni taille).
#** There is no FD (no offset nor length).
# La partie qui contient '''l'ensemble des fichiers'''
# The files area '''containing all packed files'''
# Le '''Filename Directory''' (FD) qui se constitue, pour chaque fichier, de :
# Le '''Filename Directory''' (FD) where we found for each file:
#* 32 octets : nom du fichier paddé avec des NULL bytes
#* 32 bytes: file name or path padded with NULL bytes
#* 2 octets : année
#* 2 bytes: years
#* 2 octets : mois
#* 2 bytes: months
#* 2 octets : jour
#* 2 bytes: days
#* 2 octets : heure
#* 2 bytes: hours
#* 2 octets : minute
#* 2 bytes: minutes
#* 2 octets : seconde
#* 2 bytes: secondes
#* 4 octets : taille du fichier dans certains AFS, dans d'autres on retrouve une suite de file_offset, file_len, file_offset, file_len ... pour chaque entrée du FD, prenant le début du TOC dans l'ordre.
#* 4 bytes: in some AFS we found the length of the file, in some others we found file_offset, file_len, file_offset, file_len ... for every file entry of the FD taking TOC entries in the order. And finaly in some AFS this field has a fixed value or random values.


Le FD n'est pas obligatoirement présent dans le fichier AFS. Quand le FD est présent, on peut retrouver des fichiers portant un même nom et partageant des zones mémoires différentes. Le nom des fichiers peut aussi être un path relatif "../data/fichier" comme le démontre le jeu "Kidou Senshi Gundam - Gundam vs. Z Gundam (Japan)".
The FD is not present in all AFS. When present we can find multiple files with same names and sharing sames datas areas or not. The filename can also contains relative or absolutes file paths "../data/file" like found in the game "Kidou Senshi Gundam - Gundam vs. Z Gundam (Japan)".


L'AFS est géré par l'exécutable principal (boot.dol). Théoriquement, les fichiers peuvent alors être récupérés de 3 manières pouvant être mélangées les unes les autres :
The AFS is handled by the main executable (boot.dol). So in theory files could be retrieved by 3 differents ways that could also be mixed:
* Récupération par index, c'est à dire par la position de l'offset du fichier dans la TOC.
* Get the file by index: the index of the offset/length in the TOC.
* Récupération par le nom dans le FD.
* Get the file by name in the FD.
* Récupération par un offset relatif à un endroit de la mémoire / du DVD / de l'AFS. Cette méthode est d'autant plus plausible du fait de l'alignement identique des [[MDT (Gotcha Force)|MDT]]/[[PZZ (Gotcha Force)|PZZ]] et de l'AFS (0x800). La récupération de la taille se fera alors facilement selon différentes méthodes (par le biais des headers de fichiers par exemple quand ils le permettent).
* Get the file by a relative offset from start of the AFS / somewhere in memory / DVD. This method is conceivable since align is the same for multiple file format packed in the DVD: [[MDT (Gotcha Force)|MDT]]/[[PZZ (Gotcha Force)|PZZ]] and AFS (0x800). The retrievial of the length would be easy using different methods (headers and so on.).


L'application [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] (Virtual World RE) permet de manipuler le format de fichiers AFS.
The Virtual World RE [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] allow rebuilding the AFS by adding a folder tree and changing every parameters with 4 rebuild strategies: auto, index, offset, mixed.


[[Catégorie:Format de fichier]]
[[Category:File format]]
[[Catégorie:Gotcha Force]]
[[Category:Gotcha Force]]

Revision as of 12:04, 23 August 2022

← Gotcha Force

The AFS file format allow to pack a group of files sometimes in folders in one unique file. There is no compression. Each element (packed files or AFS system files) are aligned to block of 0x800 bytes. Except for packed files AFS system files are in Little Endian.

An AFS file can be diveded in 4 parts:

  1. The header:
    • 4 bytes: magic number = "AFS\x00" or "AFS\x20"
    • 4 bytes: total number of packed files
  2. The Table Of Content (TOC):
    • It's an array of couples:
      • 4 bytes: file offset
      • 4 bytes: file length
    • After this array we can found 3 configurations:
      • We find the offset of the Filename Directory (FD) (4 bytes) and it's length (4 bytes).
      • We find a padding (NULL bytes) and then the offset of the FD (4 bytes) and it's length (4 bytes).
      • There is no FD (no offset nor length).
  3. The files area containing all packed files
  4. Le Filename Directory (FD) where we found for each file:
    • 32 bytes: file name or path padded with NULL bytes
    • 2 bytes: years
    • 2 bytes: months
    • 2 bytes: days
    • 2 bytes: hours
    • 2 bytes: minutes
    • 2 bytes: secondes
    • 4 bytes: in some AFS we found the length of the file, in some others we found file_offset, file_len, file_offset, file_len ... for every file entry of the FD taking TOC entries in the order. And finaly in some AFS this field has a fixed value or random values.

The FD is not present in all AFS. When present we can find multiple files with same names and sharing sames datas areas or not. The filename can also contains relative or absolutes file paths "../data/file" like found in the game "Kidou Senshi Gundam - Gundam vs. Z Gundam (Japan)".

The AFS is handled by the main executable (boot.dol). So in theory files could be retrieved by 3 differents ways that could also be mixed:

  • Get the file by index: the index of the offset/length in the TOC.
  • Get the file by name in the FD.
  • Get the file by a relative offset from start of the AFS / somewhere in memory / DVD. This method is conceivable since align is the same for multiple file format packed in the DVD: MDT/PZZ and AFS (0x800). The retrievial of the length would be easy using different methods (headers and so on.).

The Virtual World RE afstool.py allow rebuilding the AFS by adding a folder tree and changing every parameters with 4 rebuild strategies: auto, index, offset, mixed.