RUBRIOUE ASSEMBLEUR par Frederic Delacroix - Fidonet 2:322/20.8
Interrogation
des
compresseurs
Avant toute chose. je vous pre-sente mes meilleurs voeux pour 97. Ce mois-ci, nous poursuivons notre dćcouverte d'XPK. Ce sera toutefois plus simple que les deux mois prśce-dents, je vous prósenterai une utili-sation ślśmentaire de la fonction XpkQuery().
Comme cela a d6j£ etś expliquś sommaire-ment dans les arlicles sur la bibliothśque rexxxpk.library, le coeur du systóme XPK vu "de l,extśrieurJ' est constrtuś de la bibliotheque [1mxpkmaster.library(0m. On l’ouvre normale-ment. comme nimporte quelle autre bibliothś- , que. version n’2. Parmi les fonctions proposees. on 1rouve les fonctions de compression el dś-compression de donnees (par rmtermśdiaire « d’un fichier, de mćmoire tampon. d'un gestion-naire (hook)...)
[1mXpkPack()[0m
et
[1 mXpkUnpack()[Om
(ces fonctions ont etć utilisees dans I article du mois dernier).
On trouve śgalement les fonctions
(1 mXpkOpen()[Om
[1mXpkClose()[0m,
[1mXpkRead()(0m et
[1 mXpkWrite()[Om.
destinees k gćrer de maniere transparente sur des fichiers compresses les opśrations normalement effectuśes par les fonctions cor-respondantes de la dos.library (vous suivez?).
[1 mXpkExamlne()[Om
a pour róle de donner des informations sur
un fichier (en particulier le compresseur utilisś) et. pour le cas qui nous intśresse aujourd hui. . il y a la fonction [1mXpkQuery()[0m
(il existe ógalement les fonctions non docu-mentćes
XpkPackerlnfo() et XpkSeek(),
k ne pas utiliser).
Cette fonction XpkQuery(), situóe a l offset • 84. est entiórement contrólće par une listę de tags, sur laquelle un pointeur doit elre donnś dans le registre AO. Trois tags sont spścifiques k cette fonction.
[1 mXPK_PackersQuery[Om
(attention k 1’orthographe!) vous retourne, dans une slructure [1 mXpkPackerLlst(Om (pointee par le champ ti Data du tag) la listę de tous les compresseurs connus sur votre systeme. Cette structure est constituśe d un mot long indiquant le nombre de ces compresseurs (iimitś a 100) el d'un tableau de 100 1 structures de 6 octets destinśes k contenir le nom de chaque compresseur (on peut regret- ' ter cet aspect rigide de la conception de \ XpkOuery(), mais il a l'avantage daccślśrer les choses).
[1 mXPK PackerQuery[Om,
quant k lui, indique que vous dćsirez des informations sur un compresseur particulier dont vous connaissez dej£ le nom. Le champ ti Data pointę alors sur une structure [1 mXpkPackerlnfo[Om qui est remplie par la fonction. Vous devez śgalement utiliser le tag [1mXPK PackMethod[0m pour prściser le nom du compresseur sur le-quel vous voulez des informations. La structure XpkPackerlnfo contient toutes les carac-tśristiques du compresseur indiquś. comme son nom, sa description, des drapeaux indi-quant par exemple si la compression se fait a
perte, si un cryptage est possibie. la taille des blocs utilises...
[1mXPK ModeQuery[0m
donnę des informations plus precises en-core: lorsque ce tag est utilise, la fonction stocke dans la structure
[1mXpkMode[0m
pointee par le champ ti_Data du tag les ca-ractśristiques du modę du compresseur indi-quś: vitesse de compression. de decompres-sion, taux de compression sur un fichier modele, mśmoire utilisóe... Pour cette interrogation, 1'efficacitś (le modę) du compresseur (qui est un nombre entre 0 et 100, prścisś par le tag
[1mXPK PackMode[0m
ou une extension au nom du compresseur) est divise en differentes tranches: par exem-ple de 0 a 10, 10 k 20, etc. En 1'absence de XPK_PackMode, le modę par dśfaut du compresseur est examinś Pour avoir la listę de lous les modes, on peut faire une boucle en partant du modę 0 et en continuant au modę
(XpkMode.Upto+1)
(cf description de la structure XpkMode).
Er retour, la fonction XpkQuery() nous gra-tifie d'un codę d'erreur en DO, ou 0 si tout va bien. Je vous renvoie aux fichiers d'inclusion d’XPK pour plus d’informations, car il est temps de passer k un exemple
Tr6s simple en vśritś, cet exemple se contente d'afficher la listę des compresseurs capables de cryptage. II utilise le tag
XPK PackerOuery
el examine le champ xpi Flags de la structure Packerlnfo rśsultante k la recherche du drapeau
XPIF ENCRYPTION.
Pour 1'assemblage correct de ce pro-gramme. Hisoft Devpac 3.50 est nócessaire.
Frederic Delacroix
CALL VPrintf,_DOSBase(pc)
NoEncrypt
add.l #6,a2 ; compresseur suivant
Begindbra d3,.Loop
Error move.l DOSBase(pc),a1 CALL CloseLibrary,4.w NoDOS move.l _XPKBase(pc).a1 CALL CloseLibrary NoXPK moveq #0,d0 rls
even
Packers.Tags
dc.ł XPK,PackersQuery.PackerList
dc.l TAG..DONE
i
Packertist dcb.b xpl_SIZEOF.O Packerlnfo Tags
dc.l XPK..PackerQuery,Packerln1o
dc.l XPK PackMethod.O ; complśiś plus tard
dc.l TAG DONE
Packerlnfo dcb.b xpi_SIZEOF,0
i Printf.Data dc l 0
XPKBase dc.l 0 „DOSBase dc.l 0 _XPKName XPKNAME DOSNAME
Printf Fml dc.b"%s".10,0
opt AMIGA
IMPORT exec.exoc IMPORT exec.exec„lib IMPORT utility.utility IMPORT Macro,exec include libraries/xpk.i
Start move.l 4,w,a6 OPENLIB XPK,2 move.l d0._XPKBase beq.s NoXPK
OPENLIB DOS.37 ; Kickstart 2.04 move.l dO,_DOSBase beq.s NoDOS
lea Packers Tags(pc),a0 CALL XpkQuery. XPKBase(pc) tst.l dO bne.s Error
lea PackerList(pc).a2
move.l (a2)+,d3; nombre de compresseurs bra.s .Begin
Loop lea Packerlnfo.Tags(pc),aO move.l a2,12(a0) ; nom du compresseur
CALL XpkQuery,_XPKBase(pc) tst.l dO bne.s Error
and.l #XPKIF ENCRYPTION.Packer!nfo+xpLFIags beq s .NoEncrypt move.l #Printf.Data.d2
move I a2,Printf Data ; imprimer le nom de ce packer move.l #Printf.Fmt.d1
AmigaNews Fevrier 1997 N* 98 55