Accueil
Qui suis-je ?
 
Mes livres
Les pompes rotodynamiques
Commander un livre
 
Mes programmes
Nopopup
Aide française
Télécharger
English help
Download
 
Optipump
English help
Download
 
SaveRes
Aide française
Télécharger
English help
Download
 
TTFName
Aide française
Télécharger
 
Mes articles
Composant ASP en C/C++
VxD W9x en ASM
 
Mes photos
Afrique australe
Autres photos
 
 visiteurs.
 pages vues.
 connecté(s).
Accueil-->VxD W9x en ASM - Chapitre 5

Un exemple de VxD : MessageBox

1 Introduction

Dans 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 VM

2.1 Généralités

Quand 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
  CB_VM_Status            DD ?
  CB_High_Linear          DD ?
  CB_Client_Pointer       DD ?
  CB_VMID                 DD ?
  CB_Signature            DD ?
cb_s ENDS

  • CB_VM_Status
  • C’est le flag d'état de bit que vous pouvez examiner pour découvrir l'état de la VM.

  • CB_High_Linear
  • 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.
    Les changements faits au miroir linéaire haut seront reflétés à la VM parce que ces deux secteurs partagent la même entrée d'adresse de page. L'utilisation du miroir linéaire haut est conseillé dans la plupart des cas parce que vous pouvez modifier la VM même si ce n'est pas la VM courante.

  • CB_Client_Pointer
  • 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.

  • CB_VMID
  • 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.

  • CB_Signature
  • Contient la chaîne "VMcb". Ce membre est employé dans la vérification du handle de VM.

    3 Affichage d'une boite de message

    3.1 Généralités

    Un 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.

  • ebx
  • Handle de VM responsable du message

  • eax
  • Flags de Message box. Regardez shell.inc. Ils ont comme préfixes MB_.

  • ecx
  • Adresse 32-bit linéaire du message à afficher

  • edi
  • Adresse 32-bit linéaire du titre de la boite de message

  • esi
  • 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.

  • edx
  • 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
    include vmm.inc
    include shell.inc
    DECLARE_VIRTUAL_DEVICE MESSAGE,1,0, MESSAGE_Control,
    UNDEFINED_DEVICE_ID,
    UNDEFINED_INIT_ORDER
    Begin_control_dispatch MESSAGE
        Control_Dispatch Create_VM, OnVMCreate
        Control_Dispatch VM_Terminate2, OnVMClose
    End_control_dispatch MESSAGE
    VxD_PAGEABLE_DATA_SEG
        MsgTitle db "Boite de message VxD",0
        VMCreated db "Une VM est créée",0
        VMDestroyed db "Une VM est détruite",0
    VxD_PAGEABLE_DATA_ENDS
    VxD_PAGEABLE_CODE_SEG
    BeginProc OnVMCreate
        mov ecx, OFFSET32 VMCreated
    CommonCode:
        VMMCall Get_sys_vm_handle
        mov eax, MB_OK+MB_ICONEXCLAMATION
        mov edi, OFFSET32 MsgTitle
        xor esi, esi
        xor edx, edx
        VxDCall SHELL_Message
        ret
    EndProc OnVMCreate
    BeginProc OnVMClose
        mov ecx,OFFSET32 VMDestroyed
        jmp CommonCode
    EndProc OnVMClose
    VxD_PAGEABLE_CODE_ENDS
    end

    5 Analyse

    5.1 Message de contrôle

    Begin_control_dispatch MESSAGE
        Control_Dispatch Create_VM, OnVMCreate
        Control_Dispatch VM_Terminate2, OnVMClose
    End_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
        MsgTitle db "Boite de message VxD",0
        VMCreated db "Une VM est créée",0
        VMDestroyed db "Une VM est détruite",0
    VxD_PAGEABLE_DATA_ENDS

    Nous mettons les données dans le segment paginable.

    5.3 La procédure OnVMCreate

    BeginProc OnVMCreate
        mov ecx, OFFSET32 VMCreated
    CommonCode:
        VMMCall Get_sys_vm_handle
        mov eax, MB_OK+MB_ICONEXCLAMATION
        mov edi, OFFSET32 MsgTitle
        xor esi, esi
        xor edx, edx
        VxDCall SHELL_Message
        ret
    EndProc 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
        mov ecx,OFFSET32 VMDestroyed
        jmp CommonCode
    EndProc 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
    SEGMENTS
    _LPTEXT          CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _LTEXT           CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _LDATA           CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _TEXT            CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _DATA            CLASS 'LCODE' PRELOAD NONDISCARDABLE
    CONST            CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _TLS             CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _BSS             CLASS 'LCODE' PRELOAD NONDISCARDABLE
    _LMGTABLE        CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
    _LMSGDATA        CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
    _IMSGTABLE       CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
    _IMSGDATA        CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
    _ITEXT           CLASS 'ICODE' DISCARDABLE
    _IDATA           CLASS 'ICODE' DISCARDABLE
    _PTEXT           CLASS 'PCODE' NONDISCARDABLE
    _PMSGTABLE       CLASS 'MCODE' NONDISCARDABLE IOPL
    _PMSGDATA        CLASS 'MCODE' NONDISCARDABLE IOPL
    _PDATA           CLASS 'PDATA' NONDISCARDABLE SHARED
    _STEXT           CLASS 'SCODE' RESIDENT
    _SDATA           CLASS 'SCODE' RESIDENT
    _DBOSTART        CLASS 'DBOCODE'     PRELOAD NONDISCARDABLE CONFORMING
    _DBOCODE         CLASS 'DBOCODE'     PRELOAD NONDISCARDABLE CONFORMING
    _DBODATA         CLASS 'DBOCODE'     PRELOAD NONDISCARDABLE CONFORMING
    _16ICODE         CLASS '16ICODE'     PRELOAD DISCARDABLE
    _RCODE           CLASS 'RCODE'
    EXPORTS
      MESSAGE_DDB  @1

    7 Processus d'assemblage

    ml -coff -c -Cx -DMASM6 -DBLD_COFF -DIS_32 message.asm
    link -vxd -def:message.def message.obj

    8 Installation du VxD

  • Mettez message.vxd dans dossier \system
  • Ajoutez la ligne suivante à l'intérieur de la section [386enh] de system.ini
    device=message.vxd
  • Réamorcez votre ordinateur
  • 9 Test du VxD

    Cré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  6  7  8  9 

    Précédent       Suivant

    Copyright © Jean-Pierre Fayeulle