VC6下编译进Ring0代码的疑惑(5)
Sleep(0);
_asm call fword ptr [farcall];
MessageBox(NULL,"com",NULL,NULL);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
VirtualUnlock((PVOID)Entry,seglen);
//Clear callgate
*(ULONG *)cg=0;
*((ULONG *)cg+1)=0;
ZwClose(hSection);
MessageBox(NULL,"com2",NULL,NULL);
return TRUE;
}
struct _RING0DATA
{
DWORD mcr0,mcr2,mcr3;
unsigned short BaseMemory;
unsigned short ExtendedMemory;
}r0Data;
RING0PROC Ring0Proc1()
{
ENTERRING0;
_asm {
mov eax, cr0
mov r0Data.mcr0, eax;
mov eax, cr2
mov r0Data.mcr2, eax;
mov eax, cr3
mov r0Data.mcr3, eax;
}
LEAVERING0;
}
RING0PROC Ring0Proc2()
{
ENTERRING0;
_outp( 0x70, 0x15 );
_asm
{
mov ax,0
in al,71h
mov r0Data.BaseMemory,ax
}
_outp( 0x70, 0x16 );
r0Data.BaseMemory += _inp(0x71) << 8;
_outp( 0x70, 0x17 );
r0Data.ExtendedMemory = _inp( 0x71 );
_outp( 0x70, 0x18 );
r0Data.ExtendedMemory += _inp(0x71) << 8;
LEAVERING0;
}