VC6下编译进Ring0代码的疑惑(6)
int Freq;
RING0PROC BeepOn()
{
ENTERRING0;
BYTE b;
if ((Freq >= 20) && (Freq <= 20000))
{
Freq = 1193181 / Freq;
b = _inp(0x61);
if ((b & 3) == 0)
{
_outp(0x61, (BYTE) (b | 3));
_outp(0x43, 0xb6);
}
_outp(0x42, (BYTE) Freq);
_outp(0x42, (BYTE) (Freq >> 8));
};
LEAVERING0;
};
RING0PROC BeepOff()
{
ENTERRING0;
BYTE b;
b= (_inp(0x61) & 0xfc);
_outp(0x61, b);
LEAVERING0;
};
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
ZeroMemory(&r0Data,sizeof(struct _RING0DATA));
VirtualLock((PVOID)&r0Data,sizeof(struct _RING0DATA));
ExecRing0Proc((ULONG)Ring0Proc1,0x100);
ExecRing0Proc((ULONG)Ring0Proc2,0x100);
VirtualUnlock((PVOID)&r0Data,sizeof(struct _RING0DATA));
char* msg=new char[100];
sprintf(msg,"CR0 = %x CR2 = %x CR3 = %x ", r0Data.mcr0,r0Data.mcr2,r0Data.mcr3);
MessageBox(NULL,msg,NULL,NULL);
delete [] msg;
Freq=5000;
ExecRing0Proc((ULONG)BeepOn,0x100);
Sleep(1000);
Freq=3000;
ExecRing0Proc((ULONG)BeepOn,0x100);
Sleep(1000);
ExecRing0Proc((ULONG)BeepOff,0x100);
MessageBox(NULL,"com3",NULL,NULL);
return 0;
}