LDT_ENTRY结构描述了描述符表中的一个条目。此结构仅在基于x86的系统上有效。
typedef struct _LDT_ENTRY { // Ldate
WORD LimitLow;
WORD BaseLow;
工会{
struct {
BYTE BaseMid;
BYTE Flags1;
BYTE Flags2;
BYTE BaseHi;
} Bytes;
struct {
DWORD BaseMid : 8;
DWORD Type : 5;
DWORD Dpl : 2;
DWORD Pres : 1;
DWORD LimitHi : 4;
DWORD Sys : 1;
DWORD Reserved_0 : 1;
DWORD Default_Big : 1;
DWORD Granularity : 1;
DWORD BaseHi : 8;
} Bits;
} HighWord;
} LDT_ENTRY, *PLDT_ENTRY;
会员
LimitLow
包含片段中最后一个字节地址的低16位。
BaseLow
包含片段基地址的低16位。
HighWord
包含描述符的高两个字。这个成员可以被解释为字节或位集合,具体取决于所需的详细程度。
位结构的成员如下:
会员 | 内容 |
BaseMid | 段的基地址的中间位(16-23)。 |
类型 | 指示段的类型的位掩码。该成员可以是以下值之一: |
值 | 含义 |
0 | 只读数据段 |
1 | 读写数据段 |
2 | 未使用的段 |
3 | 读写扩展数据段 |
4 | 仅执行代码段 |
5 | 可执行代码段 |
6 | 仅执行“符合”代码段 |
7 | 可执行可读“符合”代码段 |
ASL | 特权级别的描述符。该成员是0(最特权)到3(最低特权)范围内的整数值。 |
普雷斯 | 现在国旗如果段存在于物理内存中,则该成员为1,否则为0。 |
LimitHi | 段中最后一个字节的地址的高位(16-19)。 |
SYS | 可用于系统程序员的空间。该成员可能用于以某种系统特定的方式标记段。 |
Reserved_0 | 保留。 |
Default_Big | 段的大小如果段是一个数据段,如果段大于64千字节(K),该成员将包含1,如果段小于或等于64K,则该成员将包含0。 |
如果段是代码段,则该成员包含1,如果段是代码段,并使用默认(本机模式)指令集运行。如果代码段是80286代码段,并且以16位偏移和80286兼容指令集运行,则该成员将包含0。 | |
粒度 | 粒度。如果段是字节粒度,则该成员包含0,如果段是页面粒度,则该成员包含0。 |
BaseHi | 段的基址的高位(24-31)。 |
字节结构的成员如下:
会员 | 内容 |
BaseMid | 段的基地址的中间位(16-23)。 |
FLAGS1 | 类型,ASL和普雷斯成员在位结构中的值。 |
Flags2 | #989796155}结构中LimitHi,SYS,Reserved_0,Default_Big和粒度成员的值。 |
BaseHi | 段的基址的高位(24-31)。 |
备注
GetThreadSelectorEntry函数使用描述符表中的条目填充此结构。您可以使用此信息将片段相对地址转换为线性虚拟地址。
段的基址是段中的偏移量0的地址。要计算此值,请合并BaseLow,BaseMid和BaseHi成员。
段的极限是可以在段中寻址的最后一个字节的地址。要计算此值,请组合LimitLow和LimitHi成员。
也可以看看