Découvrez le MMORPG RaiderZ
Cassegrain

 partage
Outil de création crclist pour patcher officiel (Python)

3 messages dans ce sujet

Bonsoir,

 

Un petit outil que j'ai codé il y a quelques mois en python car mon anti virus n’appréciait pas un exécutable qui faisait le même genre de boulot.

 

Voici donc un compileur / décompileur .lz pour le patcher officiel qui créé également le crclist avec toutes ses fonctionnalités.

 

 

Utilisation:

 

 

L'outil est codé en python, il se lance donc soit en console soit avec un .bat.

Il prend 4 arguments.

  1. Dossier qui contient les fichiers sur lesquels l'action de compression ou décompression doit être effectuée
  2. Dossier qui contiendra les fichiers une fois l'action réalisée
  3. Nom de l'executable qui compresse les fichiers
  4. Action de l'outil ("pack" pour compresser ou "unpack" pour décompresser)

PatchCrc.bat:

REM "Path to Python Executable" "Path to Python Script" "Path to Input Directory" "Path to Output Directory" "Path to LZ converter" "Action (pack / unpack)"
"D:\Programmes\Python26\python.exe" "PatchCrc.py" "crc" "crclz" "mt2lz.exe" "pack"
pause

 

Explications:

 

 

La première ligne est un commentaire, pour se souvenir des arguments pour lancer l'outil.

La deuxième exécute le programme avec l'action de compression avec l'exécutable mt2lz.exe des fichiers qui se trouvent dans le dossier crc en mettant le résultat de l'opération dans le dossier crclz.

La 3ème ligne permet de ne pas fermer la fenêtre à la fin de l'exécution du programme.

 

 

Informations supplémentaires:

 

L'outil n'est pas récursif, il ne gèrera donc que les fichiers dans le dossier indiqué et n'ira pas dans les sous dossiers.

 

Le fichier crcList.txt est créé dans le dossier où l'outil est lancé et ai écrasé à chaque lancement de l'outil.

Si vous voulez faire plusieurs dossiers d'un coup avec un seul .bat, il faudra donc changer le mode d'ouverture du fichier (ligne 26), de "w" pour write en "a" pour append.

 

Le fichier crclist contient toutes les informations dont le patcher peut se servir, je n'ai pas trouvé d'autre tool qui le faisait les voici dans l'ordre des tabulations:

  • Signature crc32
  • Taille en byte
  • Date de dernière modification du fichier 1
  • Date de dernière modification du fichier 2 (fixe)
  • Chemin et nom du fichier

Attention, pour la date 1 et 2, lorsque j'ai codé cet outil je ne savais pas en quel format elle était.

J'ai donc fait pas mal de calculs pour arriver à reproduire la bonne date au format du patcher.

La valeur de date2 est fixe. Tout le calcul est réalisé sur Date1, et 1 sur Date1 équivaut à environ 3 minutes il me semble.

Du coup il peut y avoir un petit décalage de 3 minutes parfois, mais ça ne pose bien sûr aucun problème.

 

 

Screenshot:

 

185723patchTool.jpg

 

 

Téléchargement:

 

Inclus dans l'archive:

  • PatchCrc.py
  • PatchCrc.bat
  • mt2lz.ex
  • Fichiers de test
  • Python26 portable (qui se trouve dans le dossier extern/bin des sources, mais vous pouvez utiliser votre propre version si vous le souhaitez en changeant le chemin de l'exécutable dans le .bat comme expliqué au dessus.)

Virus total:

  • mt2lz.exe:

    Contenu Masqué


  • python26.exe:

    Contenu Masqué


  • python26.dll:

    Contenu Masqué


Liens:

  • Mega (rar):

    Contenu Masqué


  • Mega (zip):

    Contenu Masqué


Source du .py uniquement:

import sys
import os
import binascii
import subprocess

def DoPatchFromDir(inDir, outDir, lzexeDir, doAction):
curDir = os.getcwd() + "\\"
lzexeDir = os.path.join(curDir, lzexeDir)
inDir = os.path.join(curDir, inDir) + "\\"
outDir = os.path.join(curDir, outDir) + "\\"
fileDir = None
fileDirNew = None
print("// Infos:\nAction = %s\ninDir = \"%s\"\noutDir = \"%s\"\n" % (doAction, inDir, outDir))

if not os.path.isdir(inDir):
	print("!!! Fatal Error : Input directory does not exist\n")
	return
if not os.path.isdir(outDir):
	print("Warning : Output directory does not exist")
	print("Warning : Creating output directory \"%s\"...\n" % (outDir))
	os.mkdir(outDir)

if doAction == "pack":

	print("+ Opening crcList...")
	crcList = open(curDir + "crlist", "w")

	print("++ Scaning input directory \"%s\"..." % (inDir))
	for file in os.listdir(inDir):
		fileDir = os.path.join(inDir, file)
		print("\n+++ Found file \"%s\"" % (file))
		if os.path.isfile(fileDir):
			fileDirNew = os.path.join(outDir, file + ".lz")
			print("++++ Converting file \"%s\"..." % (file))
			subprocess.call([lzexeDir, "pack", fileDir, fileDirNew])
			print("+++++ Writing crcList for file \"%s\"..." % (file))
			crcList.write("%s %s %d %s %s\n" % (getCrc(fileDir), os.stat(fileDir).st_size, getTime(os.stat(fileDir).st_mtime), "2147483648", file))
		else:
			print("+++ Warning : Skipping Directory %s\n" % (file))

	crcList.close()

elif doAction == "unpack":

	print("+ Scaning input directory \"%s\"..." % (inDir))
	for file in os.listdir(inDir):
		fileDir = os.path.join(inDir, file)
		print("\n++ Found file %s" % (file))
		if os.path.isfile(fileDir):
			if file[-3:] == ".lz":
				fileDirNew = os.path.join(outDir, file[:-3])
			else:
				fileDirNew = os.path.join(outDir, file)
			print("+++ Converting file %s..." % (file))
			subprocess.call([lzexeDir, "unpack", fileDir, fileDirNew])
		else:
			print("++ Warning : Skipping Directory %s\n" % (file))

def getCrc(fileName):
prev = binascii.crc32(open(fileName, "rb").read())
return format(prev & 0xFFFFFFFF, '08x')

def getTime(modifiedTime):
return ((modifiedTime - 1442291965) / 429.5) + 30470000

if __name__ == "__main__":
if len(sys.argv) < 5:
	print "USAGE:"
	print "\t%s [input Directory] [Output Directory] [Converter to lz Directory] [Action (pack / unpack)]" % sys.argv[0]
else:
	DoPatchFromDir(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])

 

 

 

Bonne chance !

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour le partage !

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Partage validé, merci de ton investissement !

 

Je déplace,

0

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant