Change la Taille d'un Bloc de Mémoire Linéaire
![[1.0]](../10.gif)
Change la taille d'un bloc de mémoire precedemment alloué avec
la fonction Alloue Bloc de Mémoire Linéaire(Int
31H Fonction 0504H).
Appel avec

AX = 0505H
ESI = handle du bloc de mémoire
ECX = nouvelle taille du bloc (octets, doit être non-nulle)
EDX = flags
Bit | Signification |
0 | 0 = crée pages non engagées |
1 = crée pages engagées |
1 | 0 = ne met pas à jour les descripteurs |
1 = mise à jour du descripteur requise |
2-31 | reservé, doit être zéro |
et, si le bit 1 de EDX est posé (=1):
ES:EBX = selecteur:offset d'un buffer contenant un tableau
de selecteurs, 1 mot (16 bits) par selecteur
EDI = nombre de selecteurs dans le tableau
Retourne

si la fonction réussit
Carry flag = 0
EBX = nouvelle adresse linéaire du bloc de mémoire
ESI = nouveau handle du bloc de mémoire
si la fonction échoue
Carry flag = 1
AX = code d'erreur
8001H | fonction non supportée (hôte 16-bit) |
8012H | mémoire linéaire indisponible |
8013H | mémoire physique indisponible |
8014H | backing store indisponible |
8016H | handle indisponible |
8021H | valeur invalide (ECX = 0) |
8023H | handle invalide(in ESI) |
Notes
- Un hôte DPMI 1.0 qui est uniquement 16-bit ne supportera pas
cette fonction.
- Un client 16-bit d'un hôte DPMI 32-bit 1.0 peut utiliser
cette fonction.
- Au retour de cette fonction, le précédent handle du bloc de mémoire
est invalide et ne doit pas être utilisé.
- Si cette fonction échoue, la taille du bloc et son adresse
ne sont pas modifiés.
- Si la taille du bloc est augmentée , les nouvelles pages sont engagées
ou non engagées conformément à la valeur du bit 0 dans EDX, et l'adresse
linéaire du bloc peut changer. Si la taille du bloc est diminuée,
les pages à la fin du bloc sont libérées, et l'adresse de base du bloc
reste inchangée.
- Si l'adresse linéaire du bloc est changée par cette fonction,
et que la fonction a été appelée avec le bit 1 de EDX posé (=1), l'hôte DPMI
met à jour les descripteurs pour chacun des segments dans la liste de mise à jour
qui tombent dans le bloc. Les descripteurs des segments qui ne tombent pas
dans le bloc ne sont pas modifiés. Les segments agrandis tombent dans
le bloc si la base du segment est dans le bloc. Les segments rétrécis
tombent dans le bloc si ( base du segment + limite - 1) est dans le bloc.
Dans tous les cas , la base du segment
est modifiée par la distance que le bloc parcours, et la limite du segment
n'est pas changée. Le mouvement du bloc de mémoire et la mise à jour
des descripteurs est menée atomiquement; c.a.d. que l'hôte ne passe aucune
interruptions matérielle au client pendant la mise à jour.
- L'Int 31H Fonction 0503H,qui change également
les blocs de mémoire linéaire ,n'aligne pas nécessairement
les blocs à la page et ne peut créer de pages non engagées ou mettre à jour
les descripteurs.