__segmentlimit
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]
Microsoft 固有の仕様 →
lsl (読み込みセグメントの制限) 命令を生成します。
unsigned long __segmentlimit(
unsigned long a
);
パラメーター
- [入力] a
セグメントのセレクターを指定する定数。
戻り値
セレクターに現在のアクセス許可レベルでは参照できる a, で指定されるセグメントのセレクター セグメントの制限。
必要条件
組み込み |
アーキテクチャ |
---|---|
__segmentlimit |
x86x64 |
ヘッダー ファイル <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;
}