Les clients DPMI sont chargés en mode réel . Pour passer en mode protégé ,le client doit appeler Int 2FH Fonction 1687H pour tester la présence d'un hôte DPMI et obtenir l'addresse du point d'entrée mode réel-mode protégé. la fonction 1687H renvoie des informations sur les possibilités de l'hôte DPMI et la taille d'une zone de données privées qui est utilisée par l'hôte pour obtenir les structures de données specifiques du client. Après allocation de cette zone en mode réel (DOS Int 21H Fonction 48H), le client genère un FAR CALL vers le point d'entrée avec les paramètres suivants:
AX | flags | |
Bit | Signification | |
---|---|---|
0 | 0 = application 16-bit | |
1 = application 32-bit | ||
1-15 | Reservé,doit etre zero | |
ES | segment mode réel des données privées de l'hôte DPMI(doit etre au moins de même taille que celle retournée dans SI par Int 2FH Fonction 1687H; ES est ignoré si la taille est nulle. |
Si le Flag Carry est posé au retour,le changement de mode a echoué, le client est toujours en mode réel, et le registre AX contient un des codes d'érreur suivants:
8011H | descripteur indisponible (ne peut allouer de descripteurs pour CS, DS, ES, SS, PSP, et le pointeur d'environnement) |
8021H | valeur invalide(programme 32-bit specifié mais non supporté) |
Si le changement de mode reussit, la routine renvoie en mode protégé, flag carry à 0 avec les résultats suivants:
CS | sélecteur 16-bit ,base CS en mode réel et limite à 64Ko |
SS | sélecteur,base SS en mode réel et limite à 64Ko |
DS | selecteur,base DS en mode réel et limite à 64Ko |
ES | sélecteur du PSP avec une limite à 100h |
FS | 0 (Si 80386 ou supérieur) |
GS | 0 (Si 80386 ou supérieur) |
Tous les autres registres sont préservés sauf pour les clients 32-bit, le mot fort de ESP est forcé à zéro. Les clients 32-bit s'exécutent initialement avec un segment de code 16-bit, mais tous les appels a l'int 31H nécessitent des pointeurs 48-bit,et les descripteurs de pile et de données doivent être 32-bit (le Big bit est posé dans les descripteurs). Notez que si DS=SS au moment de l'appel au changement de mode,seul un descripteur sera alloué, et le même sélecteur retourné dans DS et SS. Le client est autorisé a modifier ou libérer les descripteurs CS, DS et SS alloués par l'appel au changement de mode.
Le pointeur d'environnement dans le PSP du client est automatiquement converti en un sélecteur pendant le changement de mode. Si le client souhaite libérer la memoire occupée par l'environnement, cela doit être fait avant de passer en mode protégé et mettre à zero le mot a PSP:2CH (adresse de segment de l'environnement). Le client peut changer l'environnement dans le PSP après le passage en mode protégé mais il doit le restaurer dans le sélecteur cree par l'hôte DPMI avant la fin du programme. Le client ne doit PAS modifier ou libérer le PSP ou les descripteurs d'environnement fournis par l'hôte DPMI.
Exemple: Le code suivant illustre comment un client DPMI peut obtenir l'addresse du point d'entrée au changement de mode, allouer les donnees privées de l'hote DPMI, et passer en mode protégé
modesw dd 0 ; pointeur far du point d'entree ; au changement de mode . . . mov ax,1687h ; obtient l'addresse int 2fh ; or ax,ax ; sort si pas d'hote DPMI jnz error mov word ptr modesw,di ; sauve pointeur far mov word ptr modesw+2,es ; or si,si ;verifie la taille de la zone de donnees privee jz @@1 ; jump si elle n'existe pas mov bx,si ; alloue zone privee DPMI int 21h ; transfere au DOS jc error ; jump, si allocation a echoue mov es,ax ; ES=segment de la zone de donnnee @@1: mov ax,0 ; bit 0=0 indique 16-bit app call modesw ; passe en mode protege jc error ; jump si echoue ; sinon nous sommes en mode protege!! . . .