|
Accueil-->VxD W9x en ASM - Chapitre 6
L’interface DeviceIoControl1 IntroductionNous parlerons de VxD dynamiques dans ce chapitre. Plus particulièrement, nous apprendrons comment les créer, les charger et les employer. 2 Interfaces de VxD2.1 GénéralitésLes VxD fournissent 4 interfaces :
2.2 L’interfaçe Win32 DeviceIoControlNous connaissons déjà les services VxD. Les interfaces V86 et PMI sont les fonctions qui sont accessibles depuis les applications V86 et celles en mode protégé. Comme les applications V86 et celles en mode protégé sont 16-bit, nous ne pouvons pas employer ces deux interfaces depuis une application win32. Avec Windows 9x, Microsoft ajoute une interface complémentaire pour que les applications win32 puissent appeler ces services de VxD : DeviceIoControl Interface. 2.3 L’interfaçe DeviceIoControl2.3.1 Préanbule Pour rester simple, l'interface DeviceIoControl est une façon pour les applications win32 d'appeler des fonctions à l'intérieur de VxD. Ne confondez pas les fonctions appelées via DeviceIoControl avec les services VxD, ça n'est pas la même chose. Par exemple,la fonction N°1 de DeviceIoControl n'est pas identique au service N°1 du VxD. Vous devez imaginer les fonctions de DeviceIoControl comme un groupe séparé de fonctions, prévues pour les applications win32 seulement. Puisque c'est une interface, il y a deux côtés : 2.3.2 Côté application win32 Il doit appeler CreateFile pour ouvrir ou charger le VxD d'abord. Si l'appel est réussi, le VxD sera mis en mémoire et CreateFile retournera le handle du VxD dans eax. Ensuite vous appelez la fonction API DeviceIoControl pour choisir la fonction à exécuter. DeviceIoControl a la syntaxe suivante :
DeviceIoControl PROTO hDevice:DWORD,\
2.3.3 Du côté VxD Le VxD doit traiter le message w32_deviceIoControl. Quand le VxD reçoit le message w32_deviceIoControl, il met dans les registres les valeurs suivantes :
DIOCParams STRUC Dans la structure DIOCParams, vous avez toute l'information que l'application win32 a passé à votre VxD. Votre VxD doit au moins traiter DIOC_OPEN. DOC_OPEN est un code passé dans dwIoControlCode que VWIN32 enverra à votre VxD quand une application win32 appelle CreateFile pour ouvrir votre VxD. Si votre VxD est prêt, il doit retourner 0 dans eax et l'appel de CreateFile sera correct. Si votre VxD n'est pas prêt, il doit retourner une valeur non nulle dans eax pour que CreateFile échoue. En plus de DIOC_OPEN, votre VxD recevra le code DIOC_CloseHandle quand l'application win32 refermera le handle 3 Squelette minimum d’un VxD dynamique chargeable par CreateFile3.1 Code ASM
.386p 3.2 Fichier de définition de module
VXD DYNAVXD DYNAMIC 4 Exemple complet4.1 L’application win32Ci-dessous le code source de l'application win32 qui charge le VxD dynamique et appelle une fonction du VxD via l'API DeviceIoControl.
;VxDLoader.asm 4.2 Le VxD dynamique appelé
;ShellMsg.asm 5 AnalyseNous commençons par VxDLoader.asm.
invoke CreateFile, addr
VxDName,0,0,0,0,FILE_FLAG_DELETE_ON_CLOSE,0 Nous appelons CreateFile pour charger le VxD dynamique. Notez le flag FILE_FLAG_DELETE_ON_CLOSE. Ce flag indique à Windows de décharger le VxD quand le handle de VxD alloué par CreateFile est refermé. Si CreateFile réussi, nous stockons le handle de VxD pour utilisation future.
invoke MessageBox, NULL,addr Success, addr appName, MB_OK+MB_ICONINFORMATION Le programme affiche une boîte de message quand le VxD est chargé ou déchargé. Il appelle DeviceIoControl avec dwIoControlCode = 1 et passe l'adresse de InBuffer dans le paramètre lpInBuffer et la taille de InBuffer[8] dans nInBufferSize. InBuffer est un tableau de dword de deux éléments : chaque élément est l'adresse d'une chaîne de caractères.
MsgTitle db "Exemple DeviceIoControl",0 Maintenant regardons le VxD. Il traite seulement le message w32_deviceIoControl . Quand le message w32_deviceIoControl est envoyé, la procédure OnDeviceIoControl est appelée.
BeginProc OnDeviceIoControl OnDeviceIoControl traite le code de DIOC_OPEN en retournant 0 dans eax.
.elseif [esi].dwIoControlCode==1 La procédure traite aussi le code de contrôle 1. La première chose qu'elle fait est d'extraire les données dans lpvInBuffer qui sont les deux dword passés via lpInBuffer de l'API DeviceIoControl. Elle range l'adresse du tableau de dword dans edi pour extraction. Le premier dword est l'adresse du titre de la boîte de message. Le second dword est l'adresse du texte de la boîte de message.
VMMCall _lstrlen, <[edi]> Elle calcule la longueur du titre de la boîte de message en appelant le service VMM _lstrlen. La valeur retournée dans eax par _lstrlen est la longueur de la chaîne. Nous augmentons la longueur de 1 pour tenir compte du caractère NULL de fin de chaîne. Ensuite nous allouons, en appelant _HeapAllocate, un bloc de mémoire assez grand pour contenir la chaîne avec son caractère NULL Le flag HEAPZEROINIT indique à HeapAllocate d'initialiser à 0 le bloc de mémoire. _HeapAllocate retourne l'adresse du bloc de mémoire dans eax. Nous copions alors la chaîne depuis l'espace d'adressage de l'application win32 dans le bloc mémoire alloué. Nous faisons la même opération sur la chaîne de caractères que nous emploierons comme texte de boîte de message.
mov edi, pTitle Nous stockons les adresses du titre et du message respectivement dans edi et ecx. Mettez le flag désiré dans eax, obtenez le handle de la VM système en appelant Get_Sys_VM_Handle et appelez ensuite SHELL_SysModal_Message. SHELL_SysModal_Message est la version modale système de SHELL_Message. Cela gèle le système tant que l’utilisateur n’a pas répondu à la boite de message.
VMMCall _HeapFree, pTitle,0 Au retour de SHELL_SysModal_Message, nous pouvons libérer le bloc de mémoire en appelant _HeapFree. 6 ConclusionL'interface DeviceIoControl est idéale pour rajouter une extension ring 0 à une application win32.
Page:
1
2
3
4
5
6
7
8
9
Copyright © Jean-Pierre Fayeulle |