Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur et XPK - interrogation des compresseurs
(Article écrit par Frédéric Delacroix et extrait d'Amiga News - février 1997)
|
|
Avant toute chose, je vous présente mes meilleurs voeux pour 1997. Ce mois-ci, nous poursuivons notre découverte d'XPK. Ce sera toutefois
plus simple que les deux mois précédents, je vous présenterai une utilisation élémentaire de la fonction XpkQuery().
La bibliothèque
Comme cela a déjà été expliqué sommairement dans les articles sur la bibliothèque
rexxxpk.library, le coeur du système XPK vu "de l'extérieur" est constitué de la bibliothèque xpkmaster.library. On
l'ouvre normalement, comme n'impoite quelle autre bibliothèque, version n°2. Parmi les fonctions proposées, on trouve les fonctions
de compression et décompression de données (par l'intermédiaire d'un fichier, de mémoire tampon, d'un gestionnaire (hook)...)
XpkPack() et XpkUnpack() (ces fonctions ont été utilisées dans l'article
du mois dernier).
On trouve également les fonctions XpkOpen(), XpkClose(), XpkRead() et XpkWrite(),
destinées à gérer de manière transparente sur des fichiers compressés les opérations normalement effectuées par les fonctions
correspondantes de la dos.library (vous suivez ?).
Enfin, la fonction XpkExamine() 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 XpkQuery() (il existe également les fonctions non
documentées XpkPackerInfo() et XpkSeek(), à ne pas utiliser).
L'interrogation
Cette fonction XpkQuery(), située au décalage -84, est entièrement contrôlée par une liste de marqueurs ("tags"), sur laquelle un pointeur doit être donné
dans le registre A0. Trois marqueurs sont spécifiques à cette fonction.
Le marqueur XPK_PackersQuery (attention à l'orthographe !) vous retourne, dans une structure XpkPackerList
(pointée par le champ ti_Data du marqueur) la liste de tous les compresseurs connus sur votre système. Cette structure est constituée d'un
mot long indiquant le nombre de ces compresseurs (limité à 100) et d'un tableau de 100 structures de 6 octets destinées à contenir le
nom de chaque compresseur (on peut regretter cet aspect rigide de la conception de XpkQuery(), mais il a l'avantage d'accélérer
les choses).
Le marqueur XPK_PackerQuery, quant à lui, indique que vous désirez des informations sur un compresseur particulier dont
vous connaissez déjà le nom. Le champ ti_Data pointe alors sur une structure XpkPackerInfo qui est remplie par la
fonction. Vous devez également utiliser le marqueur XPK_PackMethod pour préciser le nom du compresseur sur lequel
vous voulez des informations. La structure XpkPackerInfo contient toutes les caractéristiques du compresseur indiqué, comme
son nom, sa description, des drapeaux indiquant par exemple si la compression se fait à perte, si un cryptage est possible, la taille des
blocs utilisés...
Enfin, le marqueur XPK_ModeQuery donne des informations plus précises encore : lorsque ce marqueur est utilisé, la fonction
stocke dans la structure XpkMode pointée par le champ ti_Data du marqueur les caractéristiques du mode du compresseur indiqué :
vitesse de compression, de décompression, taux de compression sur un fichier modèle, mémoire utilisée... Pour cette interrogation,
l'efficacité (le mode) du compresseur (qui est un nombre entre 0 et 100, précisé par le marqueur XPK_PackMode
ou une extension au nom du compresseur) est divisé en différentes tranches : par exemple de 0 a 10, 10 à 20, etc. En l'absence de
XPK_PackMode, le mode par défaut du compresseur est examiné. Pour avoir la liste de tous les modes, on peut faire une boucle
en partant du mode 0 et en continuant au mode (XpkMode.Upto+1) (Cf. description de la structure XpkMode).
En retour, la fonction XpkQuery() nous gratifie d'un code d'erreur en D0, 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 à un exemple.
Un exemple
Très simple en vérité, cet exemple se contente d'afficher la liste des compresseurs capables de cryptage, il utilise le marqueur
XPK_PackerQuery et examine le champ xpi_Flags de la structure Packerlnfo résultante à la recherche du drapeau
XPIF_ENCRYPTION. Pour l'assemblage correct de ce programme, HiSoft Devpac 3.50 est nécessaire.
|