16 #define KiVdmGetInstructionSize(x) ((x) & 0xFF) 17 #define KiVdmGetPrefixFlags(x) ((x) & 0xFFFFFF00) 54 ULONG Esp, V86EFlags, TrapEFlags;
61 TrapEFlags = TrapFrame->EFlags;
74 V86EFlags |= TrapEFlags;
78 Esp = (TrapFrame->HardwareSegSs << 4) + (
USHORT)TrapFrame->HardwareEsp;
95 TrapFrame->HardwareEsp = Esp - (TrapFrame->HardwareSegSs << 4);
107 ULONG Esp, V86EFlags, EFlags, TrapEFlags;
110 Esp = (TrapFrame->HardwareSegSs << 4) + (
USHORT)TrapFrame->HardwareEsp;
127 TrapFrame->HardwareEsp = Esp - (TrapFrame->HardwareSegSs << 4);
139 TrapEFlags = TrapFrame->EFlags;
158 TrapFrame->EFlags |= V86EFlags;
184 TrapEFlags = TrapFrame->EFlags;
206 Esp = (TrapFrame->HardwareSegSs << 4) + TrapFrame->HardwareEsp;
221 TrapFrame->HardwareEsp = (
USHORT)Esp;
224 Eip = (TrapFrame->SegCs << 4) + TrapFrame->Eip;
270 ULONG Esp, V86EFlags, EFlags, TrapEFlags, Eip;
273 Esp = (TrapFrame->HardwareSegSs << 4) + TrapFrame->HardwareEsp;
279 TrapFrame->Eip = *(
PULONG)Esp;
280 TrapFrame->SegCs = *(
PUSHORT)(Esp + 4);
283 TrapFrame->HardwareEsp += 12;
286 EFlags = *(
PULONG)(Esp + 8);
291 TrapFrame->Eip = *(
PUSHORT)Esp;
292 TrapFrame->SegCs = *(
PUSHORT)(Esp + 2);
295 TrapFrame->HardwareEsp += 6;
312 TrapEFlags = TrapFrame->EFlags;
313 TrapFrame->EFlags = (TrapFrame->EFlags &
EFLAGS_VIP) | EFlags;
323 Eip = (TrapFrame->SegCs << 4) + TrapFrame->Eip;
332 DPRINT(
"FIXME: Check for VDM interrupts\n");
385 Eip = (TrapFrame->SegCs << 4) + TrapFrame->Eip;
459 TrapFrame->Eip &= 0xFFFF;
460 TrapFrame->HardwareEsp &= 0xFFFF;
478 StackFrameUnaligned = TrapFrame->Esi;
481 NpxFrame = &StackFrame->
NpxArea;
502 return StackFrameUnaligned;
534 TrapFrame->
Esi = StackFrameUnaligned;
563 Thread->InitialStack = V86Frame;
631 *Trampoline++ = 0xCD;
663 VdmProcessObjects->
VdmTib = VdmTib;
721 Process->IopmOffset = MapOffset;
723 TargetProcessors =
Process->ActiveProcessors;
726 KeGetPcr()->TSS->IoMapBase = MapOffset;
749 pt = &(
KeGetPcr()->TSS->IoMaps[MapNumber-1].IoMap);
VOID NTAPI KeContextToTrapFrame(PCONTEXT Context, PKEXCEPTION_FRAME ExeptionFrame, PKTRAP_FRAME TrapFrame, ULONG ContextFlags, KPROCESSOR_MODE PreviousMode)
NTSTATUS NTAPI NtVdmControl(IN ULONG ControlCode, IN PVOID ControlData)
#define KiCallVdmPrefixHandler(x)
#define EFLAGS_ALIGN_CHECK
#define ROUND_UP(n, align)
#define KiCallVdmHandler(x)
struct _KV8086_STACK_FRAME * PKV8086_STACK_FRAME
VOID NTAPI KeRevertToUserAffinityThread(VOID)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_INTERRUPT_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFINTERRUPT * Interrupt
void __cdecl _enable(void)
VOID NTAPI Ke386SetIOPL(VOID)
BOOLEAN FASTCALL KiVdmOpcodePOPF(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
VOID NTAPI Ki386AdjustEsp0(IN PKTRAP_FRAME TrapFrame)
void * _AddressOfReturnAddress(void)
#define KiVdmGetInstructionSize(x)
VOID FASTCALL KiEnterV86Mode(IN ULONG_PTR StackFrameUnaligned)
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE _In_ SIZE_T ContextSize
DECLSPEC_NORETURN VOID FASTCALL KiEoiHelper(IN PKTRAP_FRAME TrapFrame)
#define RtlMoveMemory(Destination, Source, Length)
VOID NTAPI KeSetSystemAffinityThread(IN KAFFINITY Affinity)
BOOLEAN FASTCALL KiVdmOpcodeCLI(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
#define FIXED_NTVDMSTATE_LINEAR_PC_AT
__INTRIN_INLINE uintptr_t __readeflags(void)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define EFLAGS_NESTED_TASK
#define EFLAGS_USER_SANITIZE
#define PsGetCurrentProcess
struct _KTHREAD * CurrentThread
BOOLEAN NTAPI Ke386SetIoAccessMap(IN ULONG MapNumber, IN PKIO_ACCESS_MAP IopmBuffer)
BOOLEAN FASTCALL KiVdmOpcodeSTI(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
#define KiVdmGetPrefixFlags(x)
BOOLEAN FASTCALL KiVdmOpcodePrefix(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
#define KiVdmClearVdmEFlags(x)
VOID NTAPI KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN OUT PCONTEXT Context)
KIO_ACCESS_MAP * PKIO_ACCESS_MAP
FORCEINLINE PFX_SAVE_AREA KiGetThreadNpxArea(IN PKTHREAD Thread)
struct _Vdm_Tib * PVDM_TIB
#define IO_ACCESS_MAP_NONE
ULONG KeI386EFlagsOrMaskV86
ULONG KeI386EFlagsAndMaskV86
const PULONG KiNtVdmState
struct _FX_SAVE_AREA FX_SAVE_AREA
_Must_inspect_result_ _In_ ULONG Flags
BOOLEAN FASTCALL KiVdmOpcodeINTnn(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
struct _EXCEPTION_REGISTRATION_RECORD FAR * ExceptionList
#define KiFillTrapFrameDebug(x)
#define ExAllocatePoolWithTag(hernya, size, tag)
BOOLEAN KeI386VirtualIntExtensions
VOID NTAPI Ki386SetupAndExitToV86Mode(OUT PTEB VdmTeb)
BOOLEAN FASTCALL KiVdmOpcodePUSHF(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
VOID FASTCALL Ki386BiosCallReturnAddress(IN PKTRAP_FRAME TrapFrame)
BOOLEAN NTAPI Ke386QueryIoAccessMap(IN ULONG MapNumber, IN PKIO_ACCESS_MAP IopmBuffer)
BOOLEAN NTAPI Ke386IoSetAccessProcess(IN PKPROCESS Process, IN ULONG MapNumber)
NTSTATUS NTAPI Ke386CallBios(IN ULONG Int, OUT PCONTEXT Context)
#define EXCEPTION_CHAIN_END
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define KiComputeIopmOffset(MapNumber)
BOOLEAN FASTCALL KiVdmHandleOpcode(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
#define FIELD_OFFSET(t, f)
BOOLEAN NTAPI VdmDispatchBop(IN PKTRAP_FRAME TrapFrame)
BOOLEAN FASTCALL Ki386HandleOpcodeV86(IN PKTRAP_FRAME TrapFrame)
BOOLEAN FASTCALL KiVdmOpcodeIRET(IN PKTRAP_FRAME TrapFrame, IN ULONG Flags)
#define KiVdmSetVdmEFlags(x)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
struct tagContext Context
void __cdecl _disable(void)
FORCEINLINE VOID KiSetTebBase(PKPCR Pcr, PVOID TebAddress)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
#define ExFreePoolWithTag(_P, _T)
#define KeGetCurrentThread
#define KeGetTrapFrame(Thread)
KIIO_ACCESS_MAP IoMaps[IOPM_COUNT]
#define EFLAGS_INTERRUPT_MASK
ULONG_PTR FASTCALL KiExitV86Mode(IN PKTRAP_FRAME TrapFrame)