|
Accueil-->VxD W9x en ASM - Chapitre 5
Un exemple de VxD : MessageBox1 IntroductionDans le chapitre précédent, vous avez appris la technique de programmation d'un VxD. Il maintenant temps de passer à la pratique. Dans ce chapitre, nous créerons un VxD statique simple qui affichera une boîte de message chaque fois qu'une VM sera créée ou détruite. 2 Interception des événements liés à la création ou la destruction d'une VM2.1 GénéralitésQuand une VM est créée, la VMM envoie le message de contrôle Create_VM à tout les VxD. Quand une VM est terminée normalement, la VMM envoie VM_TERMINATE et VM_TERMINATE2 à tous les VxD. Notre travail est facile : Traiter Create_VM et les messages VM_TERMINATE2 dans notre procédure de contrôle du VxD. Quand notre VxD reçoit ces deux messages de contrôle, il affiche une boîte de message sur l'écran. Quand notre VxD reçoit Create_VM ou le message VM_TERMINATE2, ebx contient le handle de la VM. Un handle de VM peut être considéré comme un identificateur unique de la VM. Chaque VM a son ID unique (la handle de VM). Vous pouvez employer le handle de VM de la même manière que vous employez un processus ID, en le passant comme un paramètre aux services qui en ont besoin. En détail, un handle de VM est en réalité l'adresse 32 bits linéaire du bloc de contrôle de VM (VMCB). Le VM Control Block est une structure qui contient plusieurs éléments importants de la VM. Il est défini par
cb_s STRUC C’est le flag d'état de bit que vous pouvez examiner pour découvrir l'état de la VM.
C’est l'adresse linéaire de départ du miroir de la VM dans la
région de système partagée (> 3 Go). Ce concept exige une
explication. Sous Windows 9x, un VxD ne doit pas toucher directement à la
région V86. Au lieu de cela le VMM mappe la région V86 tout entière
de chaque VM dans la région système partagée. Quand un VxD veut
modifier la mémoire dans la région V86 de la VM, il doit en fait agir sur
le secteur linéaire haut de la VM. Par exemple, si la mémoire vidéo
est à 0B8000h et que votre VxD doit intervenir sur secteur, il doit ajouter
CB_HIGH_LINEAR à 0B8000h et intervenir sur cette adresse miroir et non sur
l'adresse primaire. Contient l'adresse de la structure de registres client. Lastructure de registres du client contient les valeurs de tous les registres du mode V86 soumis à une interruption ou de l'application en mode protégé dans la VM. Si votre VxD veut connaître ou modifier l'état du programme V86 ou de l'application, il peut modifier les membres de la structure de registres client et les changements seront retransmis à l'application quand la VMM reprend son exécution. Est l'identificateur numérique de la VM. Le VMM assigne ce numéro quand il crée la VM. L’ID de la VM système a pour valeur 1. Contient la chaîne "VMcb". Ce membre est employé dans la vérification du handle de VM. 3 Affichage d'une boite de message3.1 GénéralitésUn VxD peut employer des services du Virtual Shell Device pour communiquer aux utilisateurs. Le service que nous emploierons dans cet exemple est SHELL_Message. SHELL_Message est un service basé registres. Voici leurs significations. Handle de VM responsable du message Flags de Message box. Regardez shell.inc. Ils ont comme préfixes MB_. Adresse 32-bit linéaire du message à afficher Adresse 32-bit linéaire du titre de la boite de message Adresse 32-bit linéaire de la fonction callback ou cas ou vous désirer connaître les réponses utilisateurs à la boite de message. NULL si vous les ignorez. Référence des données à passer au callback (si vous en spécifiez une dans esi) Le carry flag est désarmé si l’appel est correct. Le carry flag est armé dans le cas contraire 4 Code
.386p 5 Analyse5.1 Message de contrôle
Begin_control_dispatch MESSAGE Le VxD utilise deux messages de contrôle, Create_VM et VM_TERMINATE2. Quand le message de contrôle Create_VM est reçu, il appelle la procédure OnVMCreate. Quand il reçoit le message VM_TERMINATE2, il appelle OnVMClose. 2 Données
VxD_PAGEABLE_DATA_SEG Nous mettons les données dans le segment paginable. 5.3 La procédure OnVMCreate
BeginProc OnVMCreate La procédure OnVMCreate est créée en employant les macros BeginProc et EndProc. Les paramètres du service SHELL_MESSAGE sont transmis par les registres. Comme nous voulons afficher la boîte de message dans la VM système, nous ne pouvons pas employer la valeur de ebx (qui est le handle de la VM créée). Au lieu de cela, nous employons un service du VMM, Get_Sys_VM_Handle, pour obtenir le handle de la VM système. Ce service retourne le handle dans ebx. Nous mettons les adresses du message et du titre dans ecx et edi respectivement. Nous ne voulons pas connaître la réponse de l'utilisateur, donc nous mettons à zéro esi et edx. Quand tous les paramètres sont dans les registres appropriés, nous appelons SHELL_MESSAGE pour afficher la boîte de message. 5.4 La procédure OnVMClose
BeginProc OnVMClose La procédure OnVMClose est la simplicité en soi. Puisqu'elle emploie un code identique à OnVMCreate, elle initialise ecx avec l'adresse du nouveau message et saute ensuite au code à l'intérieur de OnVMCreate. 6 Fichier de définition de module
VXD MESSAGE 7 Processus d'assemblage
ml -coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32 message.asm 8 Installation du VxDdevice=message.vxd 9 Test du VxDCréez une boîte DOS. Vous verrez la boîte de message, montrant le message, "Une VM est créée". Quand vous fermez la boîte de DOS, une boîte de message apparaît avec le message, "Une VM est détruite".
Page:
1
2
3
4
5
6
7
8
9
Copyright © Jean-Pierre Fayeulle |