//通過調用門調用的 函數
void _declspec(naked) GateFun()
{
g_num = 100;
_asm mov [ g_esp ] , esp;
_asm mov ax , ss;
_asm mov word ptr [g_ss],ax
_asm retf;
}
int main()
{
//構造描述符,段選擇子為8.
unsigned long long descript =
createCallGateDescript(8/*8是核心中的代碼段選擇子*/ , ( unsigned int )GateFun , 0 );
// 前4位元組是EIP,後2位元組是CS(0x004b)
// 執行流程:
// 1. 從buff這塊記憶體中取出段選擇子:0x4b
//
// 解釋 SEL T RPL
// 十進制 9 0 3
// 2. 将段選擇子分解,100 1011 ==> 1001 0 11, 得到GDT表中的下标:9
// 3. 取出GDT表中第9項描述符, 是一個調用門描述符.
// 4. 将調用門描述符中的段選擇子加載到CS段寄存器
// 5. 判斷RPL權限是否足夠,足夠的話繼續下一步
char buff[ ] = { 0,0,0,0,0x4b,00 };
_asm call fword ptr ds:[buff];
// 6. 擷取到描述符,解析描述符段選擇子(8),權限足夠的話執行函數。
}