Accueil > > > INTERNATIONAL PATCHING SYSTEM ( GBA ROM TOOLS ) : APPLIQUER OU CRÉER UN PATCH IPS
INTERNATIONAL PATCHING SYSTEM ( GBA ROM TOOLS ) : APPLIQUER OU CRÉER UN PATCH IPS
Information sur la source
Description
Voila un petit prog tout simple, tiré de mon GBATOols (les patchs pour les roms game boy advance sont tous des IPS) permettant de créer ou d'appliquer un patch ips (system de patch dit universel). En regardant un peu la structure de ces fichiers .ips, on voit qu'elle est plus que simple : "PATCH" & Offset_des_octets_a_modifié_sur_3_octets & Longueur_du_groupe_d_octets & Octets_a_modifié & Offset_des_octets_a_modifié_sur_3_octets & Longueur_du_groupe_d_octets & Octets_a_modifié & (etc..) & EOF Ce qui m'a donc permis d'ecrire ce code en vitesse. Il peut surement être optimisé, je n'ai pas passé beaucoup de temps dessus. J'ai mis un projet exemple dans le zip.
Source
- Private Sub createips(ByVal chemin1 As String, ByVal chemin2 As String, ByVal chemin3 As String)
- Dim ips As String
- Dim ipsz() As Byte
- ' Try
- Dim hbread1 As New BinaryReader(File.OpenRead(chemin1))
- Dim hbread2 As New BinaryReader(File.OpenRead(chemin2))
- Dim smallestfile As Integer
- Dim F_array1(FileLen(chemin1) - 1) As Byte
- Dim F_array2(FileLen(chemin2) - 1) As Byte
- hbread1.BaseStream.Seek(0, SeekOrigin.Begin)
- hbread1.Read(F_array1, 0, FileLen(chemin1))
- hbread1.BaseStream.Flush()
- hbread1.Close()
- hbread2.BaseStream.Seek(0, SeekOrigin.Begin)
- hbread2.Read(F_array2, 0, FileLen(chemin2))
- hbread2.BaseStream.Flush()
- hbread2.Close()
- Dim maxi As Long
- Dim mini As Long
- Dim isastring As Boolean
- Dim n As Long
- Dim intlength As Integer
- Dim tmp As String
- Dim tmp2 As String
- Dim tmpstring As String
-
- If F_array1.GetUpperBound(0) > F_array2.GetUpperBound(0) Then
- maxi = F_array1.GetUpperBound(0)
- mini = F_array2.GetUpperBound(0)
- End If
- If F_array1.GetUpperBound(0) < F_array2.GetUpperBound(0) Then
- 'Si le fichier modifié est + gros que le fichier source
- 'on commence le fichier ips (par la fin) en ecrivant les octets suplémentaire
- 'suivi de la traditionel syntaxe offset sur 3 bytes, length sur 2 bytes
- maxi = F_array2.GetUpperBound(0)
- mini = F_array1.GetUpperBound(0)
- For n = maxi To mini + 1 Step -1
-
- tmpstring = Convert.ToChar(F_array2(n)) & tmpstring
- intlength += 1
- Next
- tmp = convertfrombase10(mini + 1).PadLeft(6, "0")
- tmp2 = convertfrombase10(intlength).PadLeft(4, "0")
- ips = Convert.ToChar(convertfrombase16(tmp.Substring(0, 2))) & _
- Convert.ToChar(convertfrombase16(tmp.Substring(2, 2))) & _
- Convert.ToChar(convertfrombase16(tmp.Substring(4, 2))) & _
- Convert.ToChar(convertfrombase16(tmp2.Substring(0, 2))) & _
- Convert.ToChar(convertfrombase16(tmp2.Substring(2, 2))) & tmpstring
- End If
- If F_array1.GetUpperBound(0) = F_array2.GetUpperBound(0) Then
- maxi = F_array2.GetUpperBound(0)
- mini = F_array2.GetUpperBound(0)
- End If
-
- intlength = 0
-
-
- For n = mini To 0 Step -1
- If F_array1(n) <> F_array2(n) Then 'si les deux octets sont differents :
- If isastring = False Then
- intlength = 1
- tmp2 = convertfrombase10(intlength).PadLeft(4, "0")
- tmp = convertfrombase10(n).PadLeft(6, "0")
- tmpstring = Convert.ToChar(F_array2(n))
- isastring = True
- Else
- 'si isastring = true c'est que le caractere precedent etait different lui aussi
- intlength += 1
- tmp2 = convertfrombase10(intlength).PadLeft(4, "0")
- tmp = convertfrombase10(n).PadLeft(6, "0")
- tmpstring = Convert.ToChar(F_array2(n)) & tmpstring
- End If
- isastring = True
- Else
- If intlength >= 1 Then
- 'on ecrit offset sur 3 bytes, length sur 2 bytes puis l'(les) octet(s)
- 'different(s) au debut de la variable ips (on ecrit le fichier à l'envers)
- ips = Convert.ToChar(convertfrombase16(tmp.Substring(0, 2))) & _
- Convert.ToChar(convertfrombase16(tmp.Substring(2, 2))) & _
- Convert.ToChar(convertfrombase16(tmp.Substring(4, 2))) & _
- Convert.ToChar(convertfrombase16(tmp2.Substring(0, 2))) & _
- Convert.ToChar(convertfrombase16(tmp2.Substring(2, 2))) & tmpstring & ips
- End If
- isastring = False
- intlength = 0
- End If
- Next
- ips = "PATCH" & ips & "EOF"
-
- 'on ecrit au sens propre le fichier
- Dim F_array3(ips.Length - 1) As Byte
- For n = 0 To ips.Length - 1
- F_array3(n) = Convert.ToByte(ips.Chars(n))
- Next
- Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin3))
- hbwrite.BaseStream.Seek(0, SeekOrigin.Begin)
- hbwrite.Write(F_array3, 0, ips.Length)
- hbwrite.BaseStream.Flush()
- hbwrite.Flush()
- hbwrite.Close()
- MsgBox("Ips creation succesful")
- ' Catch ex As Exception
- ' MsgBox(ex.Message)
- ' End Try
- End Sub
-
- Private Sub apply_ips(ByVal chemin1 As String, ByVal chemin2 As String, ByVal chemin3 As String)
- Dim ips As String
- Dim ipsz() As Byte
- Dim n As Integer
- ' Try
- Dim hbread1 As New BinaryReader(File.OpenRead(chemin1))
- Dim hbread2 As New BinaryReader(File.OpenRead(chemin2))
- Dim F_array1(FileLen(chemin1) - 1) As Byte
- Dim F_array2(FileLen(chemin2) - 1) As Byte
- hbread1.BaseStream.Seek(0, SeekOrigin.Begin)
- hbread1.Read(F_array1, 0, FileLen(chemin1))
- hbread1.BaseStream.Flush()
- hbread1.Close()
- hbread2.BaseStream.Seek(0, SeekOrigin.Begin)
- hbread2.Read(F_array2, 0, FileLen(chemin2))
- hbread2.BaseStream.Flush()
- hbread2.Close()
- Dim patch As String
- Dim tmphexoffset As String
- Dim tmphexlength As String
- Dim tmplength As Integer
- Dim tmpoffset As Integer
- Dim tmpstring As String
- Dim m As Integer
- Dim a As Integer
- Dim l As Integer
- patch = Convert.ToChar(F_array2(0)) & Convert.ToChar(F_array2(1)) & Convert.ToChar(F_array2(2)) & Convert.ToChar(F_array2(3)) & Convert.ToChar(F_array2(4))
- If patch = "PATCH" Then
- n = 5
- Do
- 'on lit dans tmphexoffset les 3 prochains octets, qui represente
- 'l'offset des octets à modifier
- tmphexoffset = convertfrombase10(F_array2(n)).PadLeft(2, "0") & convertfrombase10(F_array2(n + 1)).PadLeft(2, "0") & convertfrombase10(F_array2(n + 2)).PadLeft(2, "0")
- 'si on rencontre les 3 octets E O F , on sort de la boucle
- If tmphexoffset = "454f46" And n >= F_array2.Length - 4 Then Exit Do
- 'on lit dans tmphexlength les 2 prochains octets, qui represente
- 'la taille des octets à modifier
- tmphexlength = convertfrombase10(F_array2(n + 3)).PadLeft(2, "0") & convertfrombase10(F_array2(n + 4)).PadLeft(2, "0")
- '(conversions)
- tmplength = convertfrombase16(tmphexlength)
- tmpoffset = convertfrombase16(tmphexoffset)
- tmpstring = ""
- 'on lit maintenant les octets a modifier dans tmpstring
- For m = n + 5 To n + 5 + tmplength - 1
- tmpstring += Convert.ToChar(F_array2(m))
- Next
- l = 0
- 'si les octets sont a ecrire plus loin que la fin du fichier, on agrandi le tableau
- If (tmpoffset + tmplength - 1) > F_array1.Length Then ReDim Preserve F_array1(tmpoffset + tmplength - 1)
- 'on modifie les octets lues precedements dans le tableau de byte du fichier à patcher
- For a = tmpoffset To tmpoffset + tmplength - 1
- F_array1(a) = Convert.ToByte(tmpstring.Chars(l))
- l += 1
- Next
- n = n + 5 + tmplength
- Loop
- 'on ecrit le tableau
- Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin3))
- hbwrite.BaseStream.Seek(0, SeekOrigin.Begin)
- hbwrite.Write(F_array1, 0, F_array1.Length)
- hbwrite.BaseStream.Flush()
- hbwrite.Flush()
- hbwrite.Close()
- Else
- MsgBox("bad ips file")
- End If
- MsgBox("Ips patching succesful")
- ' Catch ex As Exception
- ' MsgBox(ex.Message)
- ' End Try
- End Sub
-
- Public Function convertfrombase16(ByVal hexa As String) As Integer
- Return Convert.ToInt64(hexa, 16) 'converti en type int64(equivalent de long) et en base 10 la valeur de "hexa" à partir d'une base 16
- End Function
-
- Public Function convertfrombase10(ByVal dec As Integer) As String
- Return Convert.ToString(dec, 16) 'converti la valeur Long de "dec" en base 16
- End Function
Private Sub createips(ByVal chemin1 As String, ByVal chemin2 As String, ByVal chemin3 As String)
Dim ips As String
Dim ipsz() As Byte
' Try
Dim hbread1 As New BinaryReader(File.OpenRead(chemin1))
Dim hbread2 As New BinaryReader(File.OpenRead(chemin2))
Dim smallestfile As Integer
Dim F_array1(FileLen(chemin1) - 1) As Byte
Dim F_array2(FileLen(chemin2) - 1) As Byte
hbread1.BaseStream.Seek(0, SeekOrigin.Begin)
hbread1.Read(F_array1, 0, FileLen(chemin1))
hbread1.BaseStream.Flush()
hbread1.Close()
hbread2.BaseStream.Seek(0, SeekOrigin.Begin)
hbread2.Read(F_array2, 0, FileLen(chemin2))
hbread2.BaseStream.Flush()
hbread2.Close()
Dim maxi As Long
Dim mini As Long
Dim isastring As Boolean
Dim n As Long
Dim intlength As Integer
Dim tmp As String
Dim tmp2 As String
Dim tmpstring As String
If F_array1.GetUpperBound(0) > F_array2.GetUpperBound(0) Then
maxi = F_array1.GetUpperBound(0)
mini = F_array2.GetUpperBound(0)
End If
If F_array1.GetUpperBound(0) < F_array2.GetUpperBound(0) Then
'Si le fichier modifié est + gros que le fichier source
'on commence le fichier ips (par la fin) en ecrivant les octets suplémentaire
'suivi de la traditionel syntaxe offset sur 3 bytes, length sur 2 bytes
maxi = F_array2.GetUpperBound(0)
mini = F_array1.GetUpperBound(0)
For n = maxi To mini + 1 Step -1
tmpstring = Convert.ToChar(F_array2(n)) & tmpstring
intlength += 1
Next
tmp = convertfrombase10(mini + 1).PadLeft(6, "0")
tmp2 = convertfrombase10(intlength).PadLeft(4, "0")
ips = Convert.ToChar(convertfrombase16(tmp.Substring(0, 2))) & _
Convert.ToChar(convertfrombase16(tmp.Substring(2, 2))) & _
Convert.ToChar(convertfrombase16(tmp.Substring(4, 2))) & _
Convert.ToChar(convertfrombase16(tmp2.Substring(0, 2))) & _
Convert.ToChar(convertfrombase16(tmp2.Substring(2, 2))) & tmpstring
End If
If F_array1.GetUpperBound(0) = F_array2.GetUpperBound(0) Then
maxi = F_array2.GetUpperBound(0)
mini = F_array2.GetUpperBound(0)
End If
intlength = 0
For n = mini To 0 Step -1
If F_array1(n) <> F_array2(n) Then 'si les deux octets sont differents :
If isastring = False Then
intlength = 1
tmp2 = convertfrombase10(intlength).PadLeft(4, "0")
tmp = convertfrombase10(n).PadLeft(6, "0")
tmpstring = Convert.ToChar(F_array2(n))
isastring = True
Else
'si isastring = true c'est que le caractere precedent etait different lui aussi
intlength += 1
tmp2 = convertfrombase10(intlength).PadLeft(4, "0")
tmp = convertfrombase10(n).PadLeft(6, "0")
tmpstring = Convert.ToChar(F_array2(n)) & tmpstring
End If
isastring = True
Else
If intlength >= 1 Then
'on ecrit offset sur 3 bytes, length sur 2 bytes puis l'(les) octet(s)
'different(s) au debut de la variable ips (on ecrit le fichier à l'envers)
ips = Convert.ToChar(convertfrombase16(tmp.Substring(0, 2))) & _
Convert.ToChar(convertfrombase16(tmp.Substring(2, 2))) & _
Convert.ToChar(convertfrombase16(tmp.Substring(4, 2))) & _
Convert.ToChar(convertfrombase16(tmp2.Substring(0, 2))) & _
Convert.ToChar(convertfrombase16(tmp2.Substring(2, 2))) & tmpstring & ips
End If
isastring = False
intlength = 0
End If
Next
ips = "PATCH" & ips & "EOF"
'on ecrit au sens propre le fichier
Dim F_array3(ips.Length - 1) As Byte
For n = 0 To ips.Length - 1
F_array3(n) = Convert.ToByte(ips.Chars(n))
Next
Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin3))
hbwrite.BaseStream.Seek(0, SeekOrigin.Begin)
hbwrite.Write(F_array3, 0, ips.Length)
hbwrite.BaseStream.Flush()
hbwrite.Flush()
hbwrite.Close()
MsgBox("Ips creation succesful")
' Catch ex As Exception
' MsgBox(ex.Message)
' End Try
End Sub
Private Sub apply_ips(ByVal chemin1 As String, ByVal chemin2 As String, ByVal chemin3 As String)
Dim ips As String
Dim ipsz() As Byte
Dim n As Integer
' Try
Dim hbread1 As New BinaryReader(File.OpenRead(chemin1))
Dim hbread2 As New BinaryReader(File.OpenRead(chemin2))
Dim F_array1(FileLen(chemin1) - 1) As Byte
Dim F_array2(FileLen(chemin2) - 1) As Byte
hbread1.BaseStream.Seek(0, SeekOrigin.Begin)
hbread1.Read(F_array1, 0, FileLen(chemin1))
hbread1.BaseStream.Flush()
hbread1.Close()
hbread2.BaseStream.Seek(0, SeekOrigin.Begin)
hbread2.Read(F_array2, 0, FileLen(chemin2))
hbread2.BaseStream.Flush()
hbread2.Close()
Dim patch As String
Dim tmphexoffset As String
Dim tmphexlength As String
Dim tmplength As Integer
Dim tmpoffset As Integer
Dim tmpstring As String
Dim m As Integer
Dim a As Integer
Dim l As Integer
patch = Convert.ToChar(F_array2(0)) & Convert.ToChar(F_array2(1)) & Convert.ToChar(F_array2(2)) & Convert.ToChar(F_array2(3)) & Convert.ToChar(F_array2(4))
If patch = "PATCH" Then
n = 5
Do
'on lit dans tmphexoffset les 3 prochains octets, qui represente
'l'offset des octets à modifier
tmphexoffset = convertfrombase10(F_array2(n)).PadLeft(2, "0") & convertfrombase10(F_array2(n + 1)).PadLeft(2, "0") & convertfrombase10(F_array2(n + 2)).PadLeft(2, "0")
'si on rencontre les 3 octets E O F , on sort de la boucle
If tmphexoffset = "454f46" And n >= F_array2.Length - 4 Then Exit Do
'on lit dans tmphexlength les 2 prochains octets, qui represente
'la taille des octets à modifier
tmphexlength = convertfrombase10(F_array2(n + 3)).PadLeft(2, "0") & convertfrombase10(F_array2(n + 4)).PadLeft(2, "0")
'(conversions)
tmplength = convertfrombase16(tmphexlength)
tmpoffset = convertfrombase16(tmphexoffset)
tmpstring = ""
'on lit maintenant les octets a modifier dans tmpstring
For m = n + 5 To n + 5 + tmplength - 1
tmpstring += Convert.ToChar(F_array2(m))
Next
l = 0
'si les octets sont a ecrire plus loin que la fin du fichier, on agrandi le tableau
If (tmpoffset + tmplength - 1) > F_array1.Length Then ReDim Preserve F_array1(tmpoffset + tmplength - 1)
'on modifie les octets lues precedements dans le tableau de byte du fichier à patcher
For a = tmpoffset To tmpoffset + tmplength - 1
F_array1(a) = Convert.ToByte(tmpstring.Chars(l))
l += 1
Next
n = n + 5 + tmplength
Loop
'on ecrit le tableau
Dim hbwrite As New BinaryWriter(File.OpenWrite(chemin3))
hbwrite.BaseStream.Seek(0, SeekOrigin.Begin)
hbwrite.Write(F_array1, 0, F_array1.Length)
hbwrite.BaseStream.Flush()
hbwrite.Flush()
hbwrite.Close()
Else
MsgBox("bad ips file")
End If
MsgBox("Ips patching succesful")
' Catch ex As Exception
' MsgBox(ex.Message)
' End Try
End Sub
Public Function convertfrombase16(ByVal hexa As String) As Integer
Return Convert.ToInt64(hexa, 16) 'converti en type int64(equivalent de long) et en base 10 la valeur de "hexa" à partir d'une base 16
End Function
Public Function convertfrombase10(ByVal dec As Integer) As String
Return Convert.ToString(dec, 16) 'converti la valeur Long de "dec" en base 16
End Function
Conclusion
Commentaires...?
Historique
- 29 octobre 2004 14:22:37 :
- .
- 03 novembre 2004 01:35:05 :
- .
- 03 novembre 2004 01:36:56 :
- .
- 12 février 2007 00:52:14 :
- ajout mot clés
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
rom gba sp [ par azerty1819 ]
bonjour à tous,voila mes problemes : mon fils a acheté à la FNAC le "READER SD" de BIGBEN ainsi qu'une carte sd de 1gb afin de pouvoir utiliser sa gam
Detecter l'apparition d'un fichier [ par nablimohavb ]
BonjoursJe travaille sur une application qui fait l'envoie d'un fichier de données vert une machine l'envoie se fait à traver un patch "Patch.exe", le
cd rom virtuel [ par hgrandsart ]
Bonjour tout le monde Voici mon problème, je souhaite créer un lecteur de CD ROM VIRTUEL, pas un Disque dur, ça je sais faire, mais un CD ROM pour en
patch de mon application en vb.net [ par wassimbazmi ]
Bonjour je suis débutant en vb.net je développe une application et je veut faire un patch pour la mise a jour de cette application. ce patch vérif
Allocation mémoire d'une structure passée en pointeur à une DLL C++ [ par Feanor06 ]
Bonjour ! Bon, désolé mais je dois pas être dans le bon thème, mais j'en ai pas trouvé qui collait bien (style "truc de ouf" [^^clinoeil3]). J'ai un
aide pour patch [ par cocaine84 ]
bonjour, voila j'éssai de m'epliquer clairement je veut créer un patch pour counter strike source qui existe dèja. g les fichier mais je c pas quel c
Créer une liste d'objets...puis la trier sur 1 de ses "attributs" en ne prenant pas en compte la différence majuscule/minuscule [ par Jayme65 ]
Bonjour, Je devais créer un tableau à 2 dimensions. Je me suis dit que je pouvais le faire en créant une classe, et en faisant un: List (Of ma classe
Securiser mon logiciel [ par Light666 ]
Bonjour, J'ai créer un logiciel pour l'apprentissage de l'anglais, ce logiciel ce lance avec un patch qui se trouve sur une clé USB. Mon problème : Je
Graver un CD-rom [ par Bidulle ]
Quelqu'un aurait-il une idee????Je dois réaliser un programme qui gravera un repertoire donnée sans trop de manipulationJ'ai bien une idée mais j'aime
recherche du lecteur de CD rom [ par delphine ]
Bonjour,Je voudrais savoir sur quel lecteur se trouve le cd-rom, ceci pour pouvoir examiner le contenu d'un cdmerci d'avance !
|
Derniers Blogs
[FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
VB6 + GRAPHVIZVB6 + GRAPHVIZ par nouirayosra
Cliquez pour lire la suite par nouirayosra
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|