__segmentlimit
Section spécifique à Microsoft
Génère l’instruction lsl
(Limite du segment de charge).
Syntaxe
unsigned long __segmentlimit(
unsigned long a
);
Paramètres
a
[in] Constante qui spécifie le sélecteur de segment.
Valeur retournée
Limite de segment du sélecteur de segment spécifié par un, si le sélecteur est valide et visible au niveau d’autorisation actuel.
Spécifications
Intrinsic | Architecture |
---|---|
__segmentlimit |
x86, x64 |
Fichier<d’en-tête intrin.h>
Notes
Si la limite de segment ne peut pas être récupérée, cette instruction échoue. En cas d’échec, cette instruction efface l’indicateur ZF et la valeur de retour n’est pas définie.
Cette routine est disponible uniquement en tant qu'intrinsèque.
Exemple
#include <stdio.h>
#ifdef _M_IX86
typedef unsigned int READETYPE;
#else
typedef unsigned __int64 READETYPE;
#endif
#define EFLAGS_ZF 0x00000040
#define KGDT_R3_DATA 0x0020
#define RPL_MASK 0x3
extern "C"
{
unsigned long __segmentlimit (unsigned long);
READETYPE __readeflags();
}
#pragma intrinsic(__readeflags)
#pragma intrinsic(__segmentlimit)
int main(void)
{
const unsigned long initsl = 0xbaadbabe;
READETYPE eflags = 0;
unsigned long sl = initsl;
printf("Before: segment limit =0x%x eflags =0x%x\n", sl, eflags);
sl = __segmentlimit(KGDT_R3_DATA + RPL_MASK);
eflags = __readeflags();
printf("After: segment limit =0x%x eflags =0x%x eflags.zf = %s\n", sl, eflags, (eflags & EFLAGS_ZF) ? "set" : "clear");
// If ZF is set, the call to lsl succeeded; if ZF is clear, the call failed.
printf("%s\n", eflags & EFLAGS_ZF ? "Success!": "Fail!");
// You can verify the value of sl to make sure that the instruction wrote to it
printf("sl was %s\n", (sl == initsl) ? "unchanged" : "changed");
return 0;
}
Before: segment limit =0xbaadbabe eflags =0x0
After: segment limit =0xffffffff eflags =0x256 eflags.zf = set
Success!
sl was changed
FIN de la section spécifique à Microsoft