__segmentlimit
Microsoft 전용
(부하 세그먼트 제한) 명령을 생성합니다 lsl
.
구문
unsigned long __segmentlimit(
unsigned long a
);
매개 변수
a
[in] 세그먼트 선택기를 지정하는 상수입니다.
반환 값
선택기가 유효하고 현재 사용 권한 수준에서 표시되는 경우 a로 지정된 세그먼트 선택기의 세그먼트 제한입니다.
요구 사항
Intrinsic | 아키텍처 |
---|---|
__segmentlimit |
x86, x64 |
헤더 파일<intrin.h>
설명
세그먼트 제한을 검색할 수 없으면 이 명령이 실패합니다. 실패하면 이 명령은 ZF 플래그를 지우고 반환 값은 정의되지 않습니다.
이 루틴은 내장 루틴으로만 사용할 수 있습니다.
예시
#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
Microsoft 전용 종료