Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

214 lines
4.1 KiB

/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
Register.c
Abstract:
This module contains code to allow us to get and set registers that could
be 16 bits or 32 bits, depending on whether a 16 bit dpmi app is running.
Author:
Dave Hastings (daveh) 12-Dec-1992
Revision History:
--*/
//
// Note: We undef the following constant so that we will get the function
// versions of the register functions. We can not put a macro into
// a function pointer
//
#include <precomp.h>
#pragma hdrstop
#undef LINKED_INTO_MONITOR
#include <softpc.h>
//
// Internal functions
//
ULONG
IgetCX(
VOID
);
ULONG
IgetDX(
VOID
);
ULONG
IgetDI(
VOID
);
ULONG
IgetSI(
VOID
);
ULONG
IgetBX(
VOID
);
ULONG
IgetAX(
VOID
);
ULONG
IgetSP(
VOID
);
//
// Register manipulation functions (for register that might be 16 or 32 bits)
//
GETREGISTERFUNCTION GetCXRegister = IgetCX;
GETREGISTERFUNCTION GetDXRegister = IgetDX;
GETREGISTERFUNCTION GetDIRegister = IgetDI;
GETREGISTERFUNCTION GetSIRegister = IgetSI;
GETREGISTERFUNCTION GetBXRegister = IgetBX;
GETREGISTERFUNCTION GetAXRegister = IgetAX;
GETREGISTERFUNCTION GetSPRegister = IgetSP;
SETREGISTERFUNCTION SetCXRegister = (SETREGISTERFUNCTION) setCX;
SETREGISTERFUNCTION SetDXRegister = (SETREGISTERFUNCTION) setDX;
SETREGISTERFUNCTION SetDIRegister = (SETREGISTERFUNCTION) setDI;
SETREGISTERFUNCTION SetSIRegister = (SETREGISTERFUNCTION) setSI;
SETREGISTERFUNCTION SetBXRegister = (SETREGISTERFUNCTION) setBX;
SETREGISTERFUNCTION SetAXRegister = (SETREGISTERFUNCTION) setAX;
SETREGISTERFUNCTION SetSPRegister = (SETREGISTERFUNCTION) setSP;
VOID
DpmiInitRegisterSize(
VOID
)
/*++
Routine Description:
This routine sets up the function pointers.
Arguments:
None.
Return Value:
None.
--*/
{
if (CurrentAppFlags & DPMI_32BIT) {
GetCXRegister = getECX;
GetDXRegister = getEDX;
GetDIRegister = getEDI;
GetSIRegister = getESI;
GetBXRegister = getEBX;
GetAXRegister = getEAX;
GetSPRegister = IgetSP;
SetCXRegister = setECX;
SetDXRegister = setEDX;
SetDIRegister = setEDI;
SetSIRegister = setESI;
SetBXRegister = setEBX;
SetAXRegister = setEAX;
SetSPRegister = setESP;
} else {
//
// Note: we have to call an internal function, because the actual
// function only returns 16 bits, the others are undefined
//
GetCXRegister = IgetCX;
GetDXRegister = IgetDX;
GetDIRegister = IgetDI;
GetSIRegister = IgetSI;
GetBXRegister = IgetBX;
GetAXRegister = IgetAX;
GetSPRegister = IgetSP;
//
// Note: we take advantage of the fact that the compiler always
// pushes 32 bits on the stack
//
SetCXRegister = (SETREGISTERFUNCTION) setCX;
SetDXRegister = (SETREGISTERFUNCTION) setDX;
SetDIRegister = (SETREGISTERFUNCTION) setDI;
SetSIRegister = (SETREGISTERFUNCTION) setSI;
SetBXRegister = (SETREGISTERFUNCTION) setBX;
SetAXRegister = (SETREGISTERFUNCTION) setAX;
SetSPRegister = (SETREGISTERFUNCTION) setSP;
}
}
ULONG
IgetCX(
VOID
)
{
return (ULONG)getCX();
}
ULONG
IgetDX(
VOID
)
{
return (ULONG)getDX();
}
ULONG
IgetDI(
VOID
)
{
return (ULONG)getDI();
}
ULONG
IgetSI(
VOID
)
{
return (ULONG)getSI();
}
ULONG
IgetBX(
VOID
)
{
return (ULONG)getBX();
}
ULONG
IgetAX(
VOID
)
{
return (ULONG)getAX();
}
ULONG
IgetSP(
VOID
)
{
//
// Note: this routine returns the #of bits based on the size (b bit)
// of ss. If we don't, bad things happen
if (Ldt[(getSS() & ~0x7)/sizeof(LDT_ENTRY)].HighWord.Bits.Default_Big) {
return getESP();
} else {
return (ULONG)getSP();
}
}