Exemple de modèle I

Top  Previous  Next

Voici un exemple d'un modèle commenté de l'analyse d'un fichier AVI.

<?xml version="1.0" encoding="utf-8"?>

<!-- Une section modèle. Le nom du modèle est AVI File. -->

<template name="AVI File">

  <!-- A template signature section. Alignment is 1. -->

<signature align="1">

      <!-- A 4-byte signature at offset 0x00. -->

    <field offset="0x00">52 49 46 46</field> <!-- ANSI: RIFF -->

      <!-- A 4-byte signature at offset 0x08. -->

    <field offset="0x08">41 56 49 20</field> <!-- ANSI: LIST -->

</signature>

 

  <!-- Une section données. Son nom est AVI File. C'est la section données principale. Elle n'est pas affichée comme une section dans l'arbre de syntaxe (son nom est ignoré). -->

<section name="AVI File">

      <!-- The first 4 bytes are read and shown as an ANSI  string. -->

    <field type="char" size="4" name="Signature: RIFF" var="signature"/>

      <!--  The current position is moved to the beginning of the file. -->

    <goto offset="-4"/>

      <!-- Les 4 premiers octets dans le fichier sont lus et affichés comme un entier non signé. La signature de la variable interne récupère la valeur du champ. -->

      <field type="uint32" base="hex" name="Signature RIFF as unsigned integer in hex format" var="signature"/>

 

      <!-- Un test contre la condition (signature == RIFF) -->

    <if test="signature == 0x46464952"> <!-- ANSI: RIFF -->

          <!-- Les 4 prochains octets sont lus et affichés comme un entier non signé. La dataSize de la variable interne récupère la valeur  du champ. -->

        <field type="uint32" name="Size of the data in file" var="dataSize"/>

          <!-- Une nouvelle variable interne endOfFile est créée et le champ expr évalue sa valeur.-->

        <setvar var="endOfFile" expr="offset + dataSize - 8"/>

          <!-- The next 4 bytes is read and shown as an ANSI string. -->

        <field type="char" size="4" name="File type"/>

 

          <!-- Une nouvelle valeur nommée DATA est créée -->

        <section name="DATA">

              <!-- Une nouvelle variable interne chunksOffset est créée, le champ expr évaluant sa valeur. Cette variable récupère la valeur absolue du décalage du modèle. -->

            <setvar var="chunksOffset" expr="start_position"/>

 

              <!-- Une boucle est créée. Sa condition est réglée dans le champ test (pendant que la variable endOfFile est plus grande que la position actuelle). -->

            <repeat test="endOfFile > offset">

                  <!-- 4 bytes are read and shown as an ANSI string. -->

                <field type="char" size="4" name="Signature"/>

                  <!-- The current position is moved backwards by 4 bytes. -->

                <goto offset="-4"/>

                  <!-- Les mêmes 4 octets sont lus et affichés comme un entier non signé. La signature de la variable interne récupère cette valeur. -->

                <field type="uint32" name="Signature as unsigned integer" var="signature"/>

 

                  <!-- Un test contre la condition (signature == LIST) -->

                <if test="signature == 1414744396"> <!-- ANSI: LIST -->

                      <!-- The section is shown. Its name is LIST -->

                    <section name="LIST">

                          <!--  The current position is moved backward by 4 bytes. -->

                        <goto offset="-4"/>

                          <!-- Les 4 octets sont lus et affichés comme un entier hexadécimal non signé. Ce champ a des attributs offset et assigned-template. Si l'utilisateur double-clique sur ce champ, le modèle AVI File LIST sera invoqué et la position du modèle actuel sera déplacée à l'adresse spécifiée dans as-offset.-->

                        <field type="uint32" base="hex" name="Signature LIST as unsigned integer in hex format" as-offset="start_position + offset - 4" assigned-template="AVI File LIST"/>

                          <!-- Les 4 prochains octets sont lus et affichés comme un entier non signé. La variable listSize récupère sa valeur.  -->

                        <field type="uint32" name="Size of the data in the list" var="listSize"/>

                          <!-- The 4 bytes are read and shown as an ANSI string. -->

                        <field type="char" size="4" name="List type"/>

                          <!-- The current position is moved backward by 4 bytes. -->

                        <goto offset="-4"/>

                          <!-- Les mêmes 4 octets sont affichés comme un entier hexadécimal non lu. La variable listType récupère sa valeur.-->

                        <field type="uint32" base="hex" name="List type as unsigned integer in hex format" var="listType"/>

 

                          <!-- Un test contre la condition (type == movi) -->

                        <if test="listType == 0x69766f6d"> <!-- ANSI: movi -->

                              <!-- La variable chunksOffset récupère la valeur évaluée dans l'attribut expr. -->

                            <setvar var="chunksOffset" expr="start_position + offset - 4"/>

                        </if>

 

                          <!-- The current position is moved to the address evaluated in the address attribute. -->

                        <goto address="offset + listSize - 4"/>

                    </section>

                </if>

 

                  <!-- Un test contre la condition (signature == JUNK) -->

                <if test="signature == 1263424842"> <!-- ANSI: JUNK -->

                      <!--  Cette section est affichée avec le nom JUNK. -->

                    <section name="JUNK">

                          <!-- Les 4 prochains octets sont lus et affichés comme un entier non signé. La variable interne junkSize récupère sa valeur. -->

                        <field type="uint32" name="Size of the data of the junk" var="junkSize"/>

                          <!-- La position actuelle est déplacée par les octets junkSize suivants.  -->

                        <goto offset="junkSize"/>

                    </section>

              </if>

 

                  <!-- Un test contre la condition (signature == idx1) -->

                <if test="signature == 829973609"> <!-- ANSI: idx1 -->

                      <!--  La section est affichée avec le nom idx1. -->

                    <section name="idx1">

                          <!-- Les 4 octets suivants sont lus et affichés comme un entier non signé. La variable interne idxSize récupère sa valeur. -->

                        <field type="uint32" name="Size of the data of the idx1" var="idxSize"/>

                          <!-- cette section est affichée avec le nom First AVIINDEXENTRY. -->

                        <section name="First AVIINDEXENTRY">

                              <!-- The 4 bytes are read and shown as an ANSI string. -->

                            <field type="char" size="4" name="Chunck id"/>

                              <!-- The next 4 bytes are read and shown as an unsigned hexadecimal integer. -->

                            <field type="uint32" base="hex" name="Flags"/>

                              <!-- Les 4 octets suivants sont lus et affichés comme un entier hexadécimal non signé. L'attribut du décalage est évalué pour ce champ comme une somme de la variable chunksOffset et avec la valeur de ce champ.  -->

                            <field type="uint32" base="hex" name="Chunk offset" as-offset="chunksOffset + this"/>

                              <!-- The next 4 bytes are read and shown as an unsigned integer. -->

                            <field type="uint32" name="Chunk size"/>

                        </section>

                          <!-- La position actuelle est déplacée par les octets idxSiz redirigés. -->

                        <goto offset="idxSize"/>

                    </section>

                </if>

 

                  <!-- Un test contre la condition. &amp;&amp; is a logical AND (&&) -->

                <if test="signature != 1414744396 &amp;&amp; signature != 1263424842 &amp;&amp; signature != 829973609">

                      <!-- Une section vide est affichée. Son nom est Unknown signature found -->

                    <section name="Unknown signature found">

                    </section>

                      <!-- La position actuelle est déplacée à l'adresse réglée dans la variable endOfFile. -->

                    <goto address="endOfFile"/>

              </if>

            </repeat>

        </section>

    </if>

</section>

</template>