KV86_FRAME V86Frame;
} KV8086_STACK_FRAME, *PKV8086_STACK_FRAME;
+/* Diable interrupts and return whether they were enabled before */
+FORCEINLINE
+BOOLEAN
+KeDisableInterrupts(VOID)
+{
+ ULONG Flags;
+ BOOLEAN Return;
+
+ /* Get EFLAGS and check if the interrupt bit is set */
+ Flags = __readeflags();
+ Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
+
+ /* Disable interrupts */
+ _disable();
+ return Return;
+}
+
+/* Restore previous interrupt state */
+FORCEINLINE
+VOID
+KeRestoreInterrupts(BOOLEAN WereEnabled)
+{
+ if (WereEnabled) _enable();
+}
+
//
// Registers an interrupt handler with an IDT vector
//
extern ULONG KeI386EFlagsAndMaskV86;
extern ULONG KeI386EFlagsOrMaskV86;
extern BOOLEAN KeI386VirtualIntExtensions;
-extern KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR];
+extern KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR+1];
extern KDESCRIPTOR KiIdtDescriptor;
extern BOOLEAN KiI386PentiumLockErrataPresent;
extern ULONG KeI386NpxPresent;
extern VOID __cdecl KiTrap13(VOID);
extern VOID __cdecl KiFastCallEntry(VOID);
extern VOID NTAPI ExpInterlockedPopEntrySListFault(VOID);
+extern VOID NTAPI ExpInterlockedPopEntrySListResume(VOID);
extern VOID __cdecl CopyParams(VOID);
extern VOID __cdecl ReadBatch(VOID);
extern VOID __cdecl FrRestore(VOID);
//
// Trap Macros
//
-#include "../trap_x.h"
+#include "trap_x.h"
//
// Returns a thread's FPU save area
(EFLAGS_INTERRUPT_MASK | (Eflags & EFLAGS_USER_SANITIZE)));
}
-//
-// Gets a DR register from a CONTEXT structure
-//
-FORCEINLINE
-PVOID
-KiDrFromContext(IN ULONG Dr,
- IN PCONTEXT Context)
-{
- return *(PVOID*)((ULONG_PTR)Context + KiDebugRegisterContextOffsets[Dr]);
-}
-
-//
-// Gets a DR register from a KTRAP_FRAME structure
-//
-FORCEINLINE
-PVOID*
-KiDrFromTrapFrame(IN ULONG Dr,
- IN PKTRAP_FRAME TrapFrame)
-{
- return (PVOID*)((ULONG_PTR)TrapFrame + KiDebugRegisterTrapOffsets[Dr]);
-}
-
//
// Sanitizes a Debug Register
//
//
// Performs a system call
//
-NTSTATUS
-FORCEINLINE
-KiSystemCallTrampoline(IN PVOID Handler,
- IN PVOID Arguments,
- IN ULONG StackBytes)
-{
- NTSTATUS Result;
/*
* This sequence does a RtlCopyMemory(Stack - StackBytes, Arguments, StackBytes)
*
*/
#ifdef __GNUC__
+NTSTATUS
+FORCEINLINE
+KiSystemCallTrampoline(IN PVOID Handler,
+ IN PVOID Arguments,
+ IN ULONG StackBytes)
+{
+ NTSTATUS Result;
+
__asm__ __volatile__
(
"subl %1, %%esp\n"
"r"(Handler)
: "%esp", "%esi", "%edi"
);
+ return Result;
+}
#elif defined(_MSC_VER)
+NTSTATUS
+FORCEINLINE
+KiSystemCallTrampoline(IN PVOID Handler,
+ IN PVOID Arguments,
+ IN ULONG StackBytes)
+{
__asm
{
mov ecx, StackBytes
- mov edx, Arguments
- mov ebx, Handler
+ mov esi, Arguments
+ mov eax, Handler
sub esp, ecx
mov edi, esp
- mov esi, edx
shr ecx, 2
rep movsd
- call ebx
- mov Result, eax
+ call eax
}
+ /* Return with result in EAX */
+}
#else
#error Unknown Compiler
#endif
- return Result;
-}
//
// Checks for pending APCs
//
// Converts a base thread to a GUI thread
//
+#ifdef __GNUC__
NTSTATUS
FORCEINLINE
KiConvertToGuiThread(VOID)
* on its merry way.
*
*/
-#ifdef __GNUC__
__asm__ __volatile__
(
- "movl %%ebp, %1\n"
- "subl %%esp, %1\n"
- "call _PsConvertToGuiThread@0\n"
- "addl %%esp, %1\n"
- "movl %1, %%ebp\n"
- "movl %%eax, %0\n"
- : "=r"(Result), "=r"(StackFrame)
+ "movl %%ebp, %1\n\t"
+ "subl %%esp, %1\n\t"
+ "call _PsConvertToGuiThread@0\n\t"
+ "addl %%esp, %1\n\t"
+ "movl %1, %%ebp"
+ : "=a"(Result), "=r"(StackFrame)
:
: "%esp", "%ecx", "%edx", "memory"
);
+ return Result;
+}
#elif defined(_MSC_VER)
- NTSTATUS NTAPI PsConvertToGuiThread(VOID);
- __asm
- {
- mov StackFrame, ebp
- sub StackFrame, esp
- call PsConvertToGuiThread
- add StackFrame, esp
- mov ebp, StackFrame
- mov Result, eax
- }
+NTSTATUS
+NTAPI
+KiConvertToGuiThread(VOID);
#else
#error Unknown Compiler
#endif
- return Result;
-}
//
// Switches from boot loader to initial kernel stack
{
extern ULONGLONG BootCyclesEnd, BootCycles;
BootCyclesEnd = __rdtsc();
- DbgPrint("Boot took %I64d cycles!\n", BootCyclesEnd - BootCycles);
- DbgPrint("Interrupts: %d System Calls: %d Context Switches: %d\n",
+ DbgPrint("Boot took %I64u cycles!\n", BootCyclesEnd - BootCycles);
+ DbgPrint("Interrupts: %u System Calls: %u Context Switches: %u\n",
KeGetCurrentPrcb()->InterruptCount,
KeGetCurrentPrcb()->KeSystemCalls,
KeGetContextSwitches(KeGetCurrentPrcb()));
}
+FORCEINLINE
+PULONG
+KiGetUserModeStackAddress(void)
+{
+ return &(KeGetCurrentThread()->TrapFrame->HardwareEsp);
+}
+
#endif