mirror of
https://github.com/reactos/reactos.git
synced 2024-08-18 09:28:36 +00:00
- Change ULONG to ULONG_PTR for StackLimit.
- Move code from KiUpdateSystemTime to KeUpdateSystemTime. - Move code from KiUpdateProcessThreadTime to KeUpdateRunTime. - Honour thread quantums while scheduling. svn path=/trunk/; revision=11488
This commit is contained in:
parent
75d9d45c27
commit
095f2900e8
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: kdb.c,v 1.32 2004/10/27 13:33:59 blight Exp $
|
/* $Id: kdb.c,v 1.33 2004/10/30 23:48:55 navaraf Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/dbg/kdb.c
|
* FILE: ntoskrnl/dbg/kdb.c
|
||||||
|
@ -875,7 +875,7 @@ DbgProcessListCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
DbgPrintBackTrace(PULONG Frame, ULONG StackBase, ULONG StackLimit)
|
DbgPrintBackTrace(PULONG Frame, ULONG_PTR StackBase, ULONG_PTR StackLimit)
|
||||||
{
|
{
|
||||||
PVOID Address;
|
PVOID Address;
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ typedef struct _KPRCB {
|
||||||
PVOID DpcThread;
|
PVOID DpcThread;
|
||||||
struct _KEVENT *DpcEvent;
|
struct _KEVENT *DpcEvent;
|
||||||
UCHAR ThreadDpcEnable;
|
UCHAR ThreadDpcEnable;
|
||||||
UCHAR QuantumEnd;
|
BOOLEAN QuantumEnd;
|
||||||
UCHAR PrcbPad50;
|
UCHAR PrcbPad50;
|
||||||
UCHAR IdleSchedule;
|
UCHAR IdleSchedule;
|
||||||
ULONG DpcSetEventRequest;
|
ULONG DpcSetEventRequest;
|
||||||
|
|
|
@ -67,14 +67,8 @@ KiIpiServiceRoutine(
|
||||||
IN PKEXCEPTION_FRAME ExceptionFrame
|
IN PKEXCEPTION_FRAME ExceptionFrame
|
||||||
);*/
|
);*/
|
||||||
|
|
||||||
VOID
|
VOID STDCALL KeUpdateSystemTime(PKTRAP_FRAME TrapFrame, KIRQL Irql);
|
||||||
STDCALL
|
VOID STDCALL KeUpdateRunTime(PKTRAP_FRAME TrapFrame, KIRQL Irql);
|
||||||
KeUpdateSystemTime(
|
|
||||||
IN PKTRAP_FRAME TrapFrame,
|
|
||||||
IN ULONG Increment
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID KiUpdateSystemTime (KIRQL oldIrql, struct _KIRQ_TRAPFRAME* Tf);
|
|
||||||
|
|
||||||
KIRQL KeAcquireDispatcherDatabaseLock(VOID);
|
KIRQL KeAcquireDispatcherDatabaseLock(VOID);
|
||||||
VOID KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID);
|
VOID KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID);
|
||||||
|
@ -154,15 +148,6 @@ KeBugCheckWithTf(ULONG BugCheckCode,
|
||||||
VOID
|
VOID
|
||||||
KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG ExceptionNr, ULONG cr2);
|
KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG ExceptionNr, ULONG cr2);
|
||||||
|
|
||||||
VOID
|
|
||||||
KiUpdateProcessThreadTime(KIRQL pldIrql, struct _KIRQ_TRAPFRAME* Tf);
|
|
||||||
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
KeUpdateRunTime(
|
|
||||||
IN PKTRAP_FRAME TrapFrame
|
|
||||||
);
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
STDCALL
|
STDCALL
|
||||||
KeFlushCurrentTb(VOID);
|
KeFlushCurrentTb(VOID);
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: ps.h,v 1.71 2004/10/13 01:42:14 ion Exp $
|
/* $Id: ps.h,v 1.72 2004/10/30 23:48:56 navaraf Exp $
|
||||||
*
|
*
|
||||||
* FILE: ntoskrnl/ke/kthread.c
|
* FILE: ntoskrnl/ke/kthread.c
|
||||||
* PURPOSE: Process manager definitions
|
* PURPOSE: Process manager definitions
|
||||||
|
@ -81,7 +81,7 @@ typedef struct _KTHREAD
|
||||||
/* List of mutants owned by the thread */
|
/* List of mutants owned by the thread */
|
||||||
LIST_ENTRY MutantListHead; /* 10 */
|
LIST_ENTRY MutantListHead; /* 10 */
|
||||||
PVOID InitialStack; /* 18 */
|
PVOID InitialStack; /* 18 */
|
||||||
ULONG StackLimit; /* 1C */
|
ULONG_PTR StackLimit; /* 1C */
|
||||||
|
|
||||||
/* Pointer to the thread's environment block in user memory */
|
/* Pointer to the thread's environment block in user memory */
|
||||||
PTEB Teb; /* 20 */
|
PTEB Teb; /* 20 */
|
||||||
|
@ -111,7 +111,7 @@ typedef struct _KTHREAD
|
||||||
CHAR BasePriority; /* 68 */
|
CHAR BasePriority; /* 68 */
|
||||||
UCHAR DecrementCount; /* 69 */
|
UCHAR DecrementCount; /* 69 */
|
||||||
UCHAR PriorityDecrement; /* 6A */
|
UCHAR PriorityDecrement; /* 6A */
|
||||||
UCHAR Quantum; /* 6B */
|
CHAR Quantum; /* 6B */
|
||||||
KWAIT_BLOCK WaitBlock[4]; /* 6C */
|
KWAIT_BLOCK WaitBlock[4]; /* 6C */
|
||||||
PVOID LegoData; /* CC */
|
PVOID LegoData; /* CC */
|
||||||
ULONG KernelApcDisable; /* D0 */
|
ULONG KernelApcDisable; /* D0 */
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: dpc.c,v 1.40 2004/10/23 14:52:51 blight Exp $
|
/* $Id: dpc.c,v 1.41 2004/10/30 23:48:56 navaraf Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -81,11 +81,27 @@ KiDispatchInterrupt(VOID)
|
||||||
PKDPC current;
|
PKDPC current;
|
||||||
KIRQL oldlvl;
|
KIRQL oldlvl;
|
||||||
PKPCR Pcr;
|
PKPCR Pcr;
|
||||||
|
PKTHREAD CurrentThread;
|
||||||
|
PKPROCESS CurrentProcess;
|
||||||
|
|
||||||
ASSERT_IRQL(DISPATCH_LEVEL);
|
ASSERT_IRQL(DISPATCH_LEVEL);
|
||||||
|
|
||||||
Pcr = KeGetCurrentKPCR();
|
Pcr = KeGetCurrentKPCR();
|
||||||
|
|
||||||
|
if (Pcr->PrcbData.QuantumEnd)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* FIXME: Various special cases should be handled here. The scripts
|
||||||
|
* from David B. Probert that describe it under KiQuantumEnd.
|
||||||
|
*/
|
||||||
|
CurrentThread = /* Pcr->PcrbData.CurrentThread */ KeGetCurrentThread();
|
||||||
|
CurrentProcess = CurrentThread->ApcState.Process;
|
||||||
|
CurrentThread->Quantum = CurrentProcess->ThreadQuantum;
|
||||||
|
Pcr->PrcbData.QuantumEnd = FALSE;
|
||||||
|
PsDispatchThread(THREAD_STATE_READY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (Pcr->PrcbData.DpcData[0].DpcQueueDepth == 0)
|
if (Pcr->PrcbData.DpcData[0].DpcQueueDepth == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: irq.c,v 1.48 2004/10/22 20:32:49 ekohl Exp $
|
/* $Id: irq.c,v 1.49 2004/10/30 23:48:56 navaraf Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ke/i386/irq.c
|
* FILE: ntoskrnl/ke/i386/irq.c
|
||||||
|
@ -303,12 +303,6 @@ KiInterruptDispatch2 (ULONG vector, KIRQL old_level)
|
||||||
|
|
||||||
DPRINT1("I(0x%.08x, 0x%.08x)\n", vector, old_level);
|
DPRINT1("I(0x%.08x, 0x%.08x)\n", vector, old_level);
|
||||||
|
|
||||||
if (vector == 0)
|
|
||||||
{
|
|
||||||
KiUpdateSystemTime(old_level, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
/*
|
||||||
* Iterate the list until one of the isr tells us its device interrupted
|
* Iterate the list until one of the isr tells us its device interrupted
|
||||||
*/
|
*/
|
||||||
|
@ -322,7 +316,6 @@ KiInterruptDispatch2 (ULONG vector, KIRQL old_level)
|
||||||
isr = CONTAINING_RECORD(current,KINTERRUPT,Entry);
|
isr = CONTAINING_RECORD(current,KINTERRUPT,Entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
KiInterruptDispatch (ULONG Vector, PKIRQ_TRAPFRAME Trapframe)
|
KiInterruptDispatch (ULONG Vector, PKIRQ_TRAPFRAME Trapframe)
|
||||||
|
@ -335,16 +328,8 @@ KiInterruptDispatch (ULONG Vector, PKIRQ_TRAPFRAME Trapframe)
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
KIRQL old_level;
|
KIRQL old_level;
|
||||||
|
|
||||||
#ifdef DBG
|
|
||||||
|
|
||||||
KTRAP_FRAME KernelTrapFrame;
|
KTRAP_FRAME KernelTrapFrame;
|
||||||
|
|
||||||
KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame);
|
|
||||||
KeGetCurrentThread()->TrapFrame = &KernelTrapFrame;
|
|
||||||
|
|
||||||
#endif /* DBG */
|
|
||||||
|
|
||||||
DbgPrint("V(0x%.02x)", Vector);
|
DbgPrint("V(0x%.02x)", Vector);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -368,10 +353,18 @@ KiInterruptDispatch (ULONG Vector, PKIRQ_TRAPFRAME Trapframe)
|
||||||
*/
|
*/
|
||||||
Ke386EnableInterrupts();
|
Ke386EnableInterrupts();
|
||||||
|
|
||||||
|
if (Vector == 0)
|
||||||
|
{
|
||||||
|
KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame);
|
||||||
|
KeUpdateSystemTime(&KernelTrapFrame, PROFILE_LEVEL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Actually call the ISR.
|
* Actually call the ISR.
|
||||||
*/
|
*/
|
||||||
KiInterruptDispatch2(Vector, old_level);
|
KiInterruptDispatch2(Vector, old_level);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Disable interrupts
|
* Disable interrupts
|
||||||
|
@ -466,7 +459,8 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe)
|
||||||
|
|
||||||
if (irq == 0)
|
if (irq == 0)
|
||||||
{
|
{
|
||||||
KiUpdateSystemTime(old_level, Trapframe);
|
KeIRQTrapFrameToTrapFrame(Trapframe, &KernelTrapFrame);
|
||||||
|
KeUpdateSystemTime(&KernelTrapFrame, PROFILE_LEVEL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -483,15 +477,6 @@ KiInterruptDispatch (ULONG irq, PKIRQ_TRAPFRAME Trapframe)
|
||||||
}
|
}
|
||||||
#endif /* KDBG */
|
#endif /* KDBG */
|
||||||
|
|
||||||
/*
|
|
||||||
* Maybe do a reschedule as well.
|
|
||||||
*/
|
|
||||||
if (old_level < DISPATCH_LEVEL && irq == 0)
|
|
||||||
{
|
|
||||||
KeLowerIrql(APC_LEVEL);
|
|
||||||
PsDispatchThread(THREAD_STATE_READY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End the system interrupt.
|
* End the system interrupt.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: kthread.c,v 1.55 2004/10/22 20:30:47 ekohl Exp $
|
/* $Id: kthread.c,v 1.56 2004/10/30 23:48:56 navaraf Exp $
|
||||||
*
|
*
|
||||||
* FILE: ntoskrnl/ke/kthread.c
|
* FILE: ntoskrnl/ke/kthread.c
|
||||||
* PURPOSE: Microkernel thread support
|
* PURPOSE: Microkernel thread support
|
||||||
|
@ -87,7 +87,7 @@ KeReleaseThread(PKTHREAD Thread)
|
||||||
/* FIXME - lock the process */
|
/* FIXME - lock the process */
|
||||||
RemoveEntryList(&Thread->ThreadListEntry);
|
RemoveEntryList(&Thread->ThreadListEntry);
|
||||||
|
|
||||||
if (Thread->StackLimit != (ULONG)&init_stack)
|
if (Thread->StackLimit != (ULONG_PTR)&init_stack)
|
||||||
{
|
{
|
||||||
MmLockAddressSpace(MmGetKernelAddressSpace());
|
MmLockAddressSpace(MmGetKernelAddressSpace());
|
||||||
MmFreeMemoryArea(MmGetKernelAddressSpace(),
|
MmFreeMemoryArea(MmGetKernelAddressSpace(),
|
||||||
|
@ -189,17 +189,17 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First)
|
||||||
{
|
{
|
||||||
KEBUGCHECK(0);
|
KEBUGCHECK(0);
|
||||||
}
|
}
|
||||||
Thread->InitialStack = (char*)KernelStack + MM_STACK_SIZE;
|
Thread->InitialStack = (PCHAR)KernelStack + MM_STACK_SIZE;
|
||||||
Thread->StackBase = (char*)KernelStack + MM_STACK_SIZE;
|
Thread->StackBase = (PCHAR)KernelStack + MM_STACK_SIZE;
|
||||||
Thread->StackLimit = (ULONG)KernelStack;
|
Thread->StackLimit = (ULONG_PTR)KernelStack;
|
||||||
Thread->KernelStack = (char*)KernelStack + MM_STACK_SIZE;
|
Thread->KernelStack = (PCHAR)KernelStack + MM_STACK_SIZE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Thread->InitialStack = (PVOID)&init_stack_top;
|
Thread->InitialStack = (PCHAR)&init_stack_top;
|
||||||
Thread->StackBase = (PVOID)&init_stack_top;
|
Thread->StackBase = (PCHAR)&init_stack_top;
|
||||||
Thread->StackLimit = (ULONG)&init_stack;
|
Thread->StackLimit = (ULONG_PTR)&init_stack;
|
||||||
Thread->KernelStack = (PVOID)&init_stack_top;
|
Thread->KernelStack = (PCHAR)&init_stack_top;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -228,7 +228,7 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First)
|
||||||
Thread->NpxState = 0;
|
Thread->NpxState = 0;
|
||||||
|
|
||||||
Thread->Saturation = 0;
|
Thread->Saturation = 0;
|
||||||
Thread->Priority = 0;
|
Thread->Priority = Process->BasePriority;
|
||||||
InitializeListHead(&Thread->ApcState.ApcListHead[0]);
|
InitializeListHead(&Thread->ApcState.ApcListHead[0]);
|
||||||
InitializeListHead(&Thread->ApcState.ApcListHead[1]);
|
InitializeListHead(&Thread->ApcState.ApcListHead[1]);
|
||||||
Thread->ApcState.Process = Process;
|
Thread->ApcState.Process = Process;
|
||||||
|
@ -244,10 +244,10 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First)
|
||||||
Thread->WaitListEntry.Flink = NULL;
|
Thread->WaitListEntry.Flink = NULL;
|
||||||
Thread->WaitListEntry.Blink = NULL;
|
Thread->WaitListEntry.Blink = NULL;
|
||||||
Thread->WaitTime = 0;
|
Thread->WaitTime = 0;
|
||||||
Thread->BasePriority = 0;
|
Thread->BasePriority = Process->BasePriority;
|
||||||
Thread->DecrementCount = 0;
|
Thread->DecrementCount = 0;
|
||||||
Thread->PriorityDecrement = 0;
|
Thread->PriorityDecrement = 0;
|
||||||
Thread->Quantum = 0;
|
Thread->Quantum = Process->ThreadQuantum;
|
||||||
memset(Thread->WaitBlock, 0, sizeof(KWAIT_BLOCK)*4);
|
memset(Thread->WaitBlock, 0, sizeof(KWAIT_BLOCK)*4);
|
||||||
Thread->LegoData = 0;
|
Thread->LegoData = 0;
|
||||||
|
|
||||||
|
@ -304,10 +304,9 @@ crashes. I'm disabling it again, until we fix the APC implementation...
|
||||||
|
|
||||||
Thread->ApcStateIndex = OriginalApcEnvironment;
|
Thread->ApcStateIndex = OriginalApcEnvironment;
|
||||||
|
|
||||||
/* FIXME: not all thread are ApcQueueable! */
|
|
||||||
Thread->ApcQueueable = TRUE;
|
Thread->ApcQueueable = TRUE;
|
||||||
|
|
||||||
Thread->AutoAlignment = 0;
|
Thread->AutoAlignment = Process->AutoAlignment;
|
||||||
KeInitializeApc(&Thread->SuspendApc,
|
KeInitializeApc(&Thread->SuspendApc,
|
||||||
Thread,
|
Thread,
|
||||||
OriginalApcEnvironment,
|
OriginalApcEnvironment,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: timer.c,v 1.84 2004/10/24 16:49:49 weiden Exp $
|
/* $Id: timer.c,v 1.85 2004/10/30 23:48:56 navaraf Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -628,9 +628,164 @@ KeExpireTimers(PKDPC Dpc,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VOID INIT_FUNCTION
|
||||||
|
KeInitializeTimerImpl(VOID)
|
||||||
|
/*
|
||||||
|
* FUNCTION: Initializes timer irq handling
|
||||||
|
* NOTE: This is only called once from main()
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
TIME_FIELDS TimeFields;
|
||||||
|
|
||||||
|
DPRINT("KeInitializeTimerImpl()\n");
|
||||||
|
InitializeListHead(&AbsoluteTimerListHead);
|
||||||
|
InitializeListHead(&RelativeTimerListHead);
|
||||||
|
KeInitializeSpinLock(&TimerListLock);
|
||||||
|
KeInitializeSpinLock(&TimerValueLock);
|
||||||
|
KeInitializeDpc(&ExpireTimerDpc, KeExpireTimers, 0);
|
||||||
|
/*
|
||||||
|
* Calculate the starting time for the system clock
|
||||||
|
*/
|
||||||
|
HalQueryRealTimeClock(&TimeFields);
|
||||||
|
RtlTimeFieldsToTime(&TimeFields, &SystemBootTime);
|
||||||
|
|
||||||
|
SharedUserData->TickCountLow = 0;
|
||||||
|
SharedUserData->TickCountMultiplier = 167783691; // 2^24 * 1193182 / 119310
|
||||||
|
SharedUserData->InterruptTime.High2Part = 0;
|
||||||
|
SharedUserData->InterruptTime.LowPart = 0;
|
||||||
|
SharedUserData->InterruptTime.High1Part = 0;
|
||||||
|
SharedUserData->SystemTime.High2Part = SystemBootTime.u.HighPart;
|
||||||
|
SharedUserData->SystemTime.LowPart = SystemBootTime.u.LowPart;
|
||||||
|
SharedUserData->SystemTime.High1Part = SystemBootTime.u.HighPart;
|
||||||
|
|
||||||
|
TimerInitDone = TRUE;
|
||||||
|
DPRINT("Finished KeInitializeTimerImpl()\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
VOID
|
VOID
|
||||||
KiUpdateSystemTime(KIRQL oldIrql,
|
FASTCALL
|
||||||
PKIRQ_TRAPFRAME Tf)
|
KeSetTimeUpdateNotifyRoutine(
|
||||||
|
IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: On Windows this function takes exactly one parameter and EBP is
|
||||||
|
* guaranteed to point to KTRAP_FRAME. The function is used only
|
||||||
|
* by HAL, so there's no point in keeping that prototype.
|
||||||
|
*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
KeUpdateRunTime(
|
||||||
|
IN PKTRAP_FRAME TrapFrame,
|
||||||
|
IN KIRQL Irql
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PKPCR Pcr;
|
||||||
|
PKTHREAD CurrentThread;
|
||||||
|
PKPROCESS CurrentProcess;
|
||||||
|
#if 0
|
||||||
|
ULONG DpcLastCount;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Pcr = KeGetCurrentKPCR();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure no counting can take place until Processes and Threads are
|
||||||
|
* running!
|
||||||
|
*/
|
||||||
|
if ((PsInitialSystemProcess == NULL) || (Pcr->PrcbData.IdleThread == NULL) ||
|
||||||
|
(KiTimerSystemAuditing == 0))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("KernelTime %u, UserTime %u \n", Pcr->PrcbData.KernelTime, Pcr->PrcbData.UserTime);
|
||||||
|
|
||||||
|
CurrentThread = /* Pcr->PcrbData.CurrentThread */ KeGetCurrentThread();
|
||||||
|
CurrentProcess = CurrentThread->ApcState.Process;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cs bit 0 is always set for user mode if we are in protected mode.
|
||||||
|
* V86 mode is counted as user time.
|
||||||
|
*/
|
||||||
|
if (TrapFrame->Cs & 0x1 ||
|
||||||
|
TrapFrame->Eflags & X86_EFLAGS_VM)
|
||||||
|
{
|
||||||
|
InterlockedIncrement((PLONG)&CurrentThread->UserTime);
|
||||||
|
InterlockedIncrement((PLONG)&CurrentProcess->UserTime);
|
||||||
|
InterlockedIncrement((PLONG)&Pcr->PrcbData.UserTime);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Irql > DISPATCH_LEVEL)
|
||||||
|
{
|
||||||
|
Pcr->PrcbData.InterruptTime++;
|
||||||
|
}
|
||||||
|
else if (Irql == DISPATCH_LEVEL)
|
||||||
|
{
|
||||||
|
Pcr->PrcbData.DpcTime++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InterlockedIncrement((PLONG)&CurrentThread->KernelTime);
|
||||||
|
InterlockedIncrement((PLONG)&CurrentProcess->KernelTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
DpcLastCount = Pcr->PrcbData.DpcLastCount;
|
||||||
|
Pcr->PrcbData.DpcLastCount = Pcr->PrcbData.DpcCount;
|
||||||
|
Pcr->PrcbData.DpcRequestRate = ((Pcr->PrcbData.DpcCount - DpcLastCount) +
|
||||||
|
Pcr->PrcbData.DpcRequestRate) / 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (Pcr->PrcbData.DpcData[0].DpcQueueDepth > 0 &&
|
||||||
|
Pcr->PrcbData.DpcRoutineActive == FALSE &&
|
||||||
|
Pcr->PrcbData.DpcInterruptRequested == FALSE)
|
||||||
|
{
|
||||||
|
HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Do DPC rate adjustments */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we're at end of quantum request software interrupt. The rest
|
||||||
|
* is handled in KiDispatchInterrupt.
|
||||||
|
*/
|
||||||
|
if ((CurrentThread->Quantum -= 3) < 0)
|
||||||
|
{
|
||||||
|
if (CurrentThread != Pcr->PrcbData.IdleThread)
|
||||||
|
{
|
||||||
|
Pcr->PrcbData.QuantumEnd = TRUE;
|
||||||
|
HalRequestSoftwareInterrupt(DISPATCH_LEVEL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: On Windows this function takes exactly zero parameters and EBP is
|
||||||
|
* guaranteed to point to KTRAP_FRAME. Also [esp+0] contains an IRQL.
|
||||||
|
* The function is used only by HAL, so there's no point in keeping
|
||||||
|
* that prototype.
|
||||||
|
*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
KeUpdateSystemTime(
|
||||||
|
IN PKTRAP_FRAME TrapFrame,
|
||||||
|
IN KIRQL Irql
|
||||||
|
)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Handles a timer interrupt
|
* FUNCTION: Handles a timer interrupt
|
||||||
*/
|
*/
|
||||||
|
@ -666,157 +821,17 @@ KiUpdateSystemTime(KIRQL oldIrql,
|
||||||
SharedUserData->SystemTime.LowPart = Time.u.LowPart;
|
SharedUserData->SystemTime.LowPart = Time.u.LowPart;
|
||||||
SharedUserData->SystemTime.High1Part = Time.u.HighPart;
|
SharedUserData->SystemTime.High1Part = Time.u.HighPart;
|
||||||
|
|
||||||
|
/* FIXME: Here we should check for remote debugger break-ins */
|
||||||
|
|
||||||
KiReleaseSpinLock(&TimerValueLock);
|
KiReleaseSpinLock(&TimerValueLock);
|
||||||
|
|
||||||
/* Update process and thread times */
|
/* Update process and thread times */
|
||||||
KiUpdateProcessThreadTime(oldIrql, Tf);
|
KeUpdateRunTime(TrapFrame, Irql);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Queue a DPC that will expire timers
|
* Queue a DPC that will expire timers
|
||||||
*/
|
*/
|
||||||
KeInsertQueueDpc(&ExpireTimerDpc, (PVOID)Tf->Eip, 0);
|
KeInsertQueueDpc(&ExpireTimerDpc, (PVOID)TrapFrame->Eip, 0);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
|
||||||
KeInitializeTimerImpl(VOID)
|
|
||||||
/*
|
|
||||||
* FUNCTION: Initializes timer irq handling
|
|
||||||
* NOTE: This is only called once from main()
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
TIME_FIELDS TimeFields;
|
|
||||||
|
|
||||||
DPRINT("KeInitializeTimerImpl()\n");
|
|
||||||
InitializeListHead(&AbsoluteTimerListHead);
|
|
||||||
InitializeListHead(&RelativeTimerListHead);
|
|
||||||
KeInitializeSpinLock(&TimerListLock);
|
|
||||||
KeInitializeSpinLock(&TimerValueLock);
|
|
||||||
KeInitializeDpc(&ExpireTimerDpc, KeExpireTimers, 0);
|
|
||||||
/*
|
|
||||||
* Calculate the starting time for the system clock
|
|
||||||
*/
|
|
||||||
HalQueryRealTimeClock(&TimeFields);
|
|
||||||
RtlTimeFieldsToTime(&TimeFields, &SystemBootTime);
|
|
||||||
|
|
||||||
SharedUserData->TickCountLow = 0;
|
|
||||||
SharedUserData->TickCountMultiplier = 167783691; // 2^24 * 1193182 / 119310
|
|
||||||
SharedUserData->InterruptTime.High2Part = 0;
|
|
||||||
SharedUserData->InterruptTime.LowPart = 0;
|
|
||||||
SharedUserData->InterruptTime.High1Part = 0;
|
|
||||||
SharedUserData->SystemTime.High2Part = SystemBootTime.u.HighPart;
|
|
||||||
SharedUserData->SystemTime.LowPart = SystemBootTime.u.LowPart;
|
|
||||||
SharedUserData->SystemTime.High1Part = SystemBootTime.u.HighPart;
|
|
||||||
|
|
||||||
TimerInitDone = TRUE;
|
|
||||||
DPRINT("Finished KeInitializeTimerImpl()\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
VOID
|
|
||||||
KiUpdateProcessThreadTime(KIRQL oldIrql, PKIRQ_TRAPFRAME Tf)
|
|
||||||
{
|
|
||||||
PKTHREAD CurrentThread;
|
|
||||||
PEPROCESS ThreadsProcess;
|
|
||||||
PKPCR Pcr;
|
|
||||||
|
|
||||||
Pcr = KeGetCurrentKPCR();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure no counting can take place until Processes and Threads are
|
|
||||||
* running!
|
|
||||||
*/
|
|
||||||
if ((PsInitialSystemProcess == NULL) || (Pcr->PrcbData.IdleThread == NULL) ||
|
|
||||||
(KiTimerSystemAuditing == 0))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("KernelTime %u, UserTime %u \n", Pcr->PrcbData.KernelTime, Pcr->PrcbData.UserTime);
|
|
||||||
|
|
||||||
if (oldIrql > DISPATCH_LEVEL)
|
|
||||||
{
|
|
||||||
Pcr->PrcbData.InterruptTime++;
|
|
||||||
}
|
|
||||||
else if (oldIrql == DISPATCH_LEVEL)
|
|
||||||
{
|
|
||||||
Pcr->PrcbData.DpcTime++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CurrentThread = KeGetCurrentThread();
|
|
||||||
ThreadsProcess = ((PETHREAD)CurrentThread)->ThreadsProcess;
|
|
||||||
/*
|
|
||||||
* Cs bit 0 is always set for user mode if we are in protected mode.
|
|
||||||
* V86 mode is counted as user time.
|
|
||||||
*/
|
|
||||||
if (Tf->Cs & 0x1 ||
|
|
||||||
Tf->Eflags & X86_EFLAGS_VM)
|
|
||||||
{
|
|
||||||
#ifdef MP
|
|
||||||
InterlockedIncrement((PLONG)&ThreadsProcess->Pcb.UserTime);
|
|
||||||
#else
|
|
||||||
ThreadsProcess->Pcb.UserTime++;
|
|
||||||
#endif
|
|
||||||
CurrentThread->UserTime++;
|
|
||||||
Pcr->PrcbData.UserTime++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#ifdef MP
|
|
||||||
InterlockedIncrement((PLONG)&ThreadsProcess->Pcb.KernelTime);
|
|
||||||
#else
|
|
||||||
ThreadsProcess->Pcb.KernelTime++;
|
|
||||||
#endif
|
|
||||||
CurrentThread->KernelTime++;
|
|
||||||
Pcr->PrcbData.KernelTime++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
FASTCALL
|
|
||||||
KeSetTimeUpdateNotifyRoutine(
|
|
||||||
IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
KeUpdateRunTime(
|
|
||||||
IN PKTRAP_FRAME TrapFrame
|
|
||||||
)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql = PASSIVE_LEVEL;
|
|
||||||
|
|
||||||
/* These are equivalent... we should just remove the Ki and stick it here... */
|
|
||||||
KiUpdateProcessThreadTime(OldIrql, (PKIRQ_TRAPFRAME)TrapFrame);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
KeUpdateSystemTime(
|
|
||||||
IN PKTRAP_FRAME TrapFrame,
|
|
||||||
IN ULONG Increment
|
|
||||||
)
|
|
||||||
{
|
|
||||||
KIRQL OldIrql = PASSIVE_LEVEL;
|
|
||||||
|
|
||||||
/* These are equivalent... we should just remove the Ki and stick it here... */
|
|
||||||
KiUpdateSystemTime(OldIrql, (PKIRQ_TRAPFRAME)TrapFrame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: pagefile.c,v 1.51 2004/10/09 12:17:53 gvg Exp $
|
/* $Id: pagefile.c,v 1.52 2004/10/30 23:48:56 navaraf Exp $
|
||||||
*
|
*
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/mm/pagefile.c
|
* FILE: ntoskrnl/mm/pagefile.c
|
||||||
|
@ -494,7 +494,7 @@ MmDumpToPagingFile(ULONG BugCode,
|
||||||
UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)];
|
UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)];
|
||||||
PMDL Mdl = (PMDL)MdlBase;
|
PMDL Mdl = (PMDL)MdlBase;
|
||||||
PETHREAD Thread = PsGetCurrentThread();
|
PETHREAD Thread = PsGetCurrentThread();
|
||||||
ULONG StackSize;
|
ULONG_PTR StackSize;
|
||||||
PULONG MdlMap;
|
PULONG MdlMap;
|
||||||
LONGLONG NextOffset = 0;
|
LONGLONG NextOffset = 0;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
@ -531,8 +531,8 @@ MmDumpToPagingFile(ULONG BugCode,
|
||||||
Headers->BugCheckParameters[2] = BugCodeParameter3;
|
Headers->BugCheckParameters[2] = BugCodeParameter3;
|
||||||
Headers->BugCheckParameters[3] = BugCodeParameter4;
|
Headers->BugCheckParameters[3] = BugCodeParameter4;
|
||||||
Headers->FaultingStackBase = (PVOID)Thread->Tcb.StackLimit;
|
Headers->FaultingStackBase = (PVOID)Thread->Tcb.StackLimit;
|
||||||
Headers->FaultingStackSize = StackSize =
|
Headers->FaultingStackSize =
|
||||||
(ULONG)((char*)Thread->Tcb.StackBase - Thread->Tcb.StackLimit);
|
StackSize = (ULONG_PTR)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit);
|
||||||
Headers->PhysicalMemorySize = MmStats.NrTotalPages * PAGE_SIZE;
|
Headers->PhysicalMemorySize = MmStats.NrTotalPages * PAGE_SIZE;
|
||||||
|
|
||||||
/* Initialize the dump device. */
|
/* Initialize the dump device. */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
; $Id: ntoskrnl.def,v 1.196 2004/10/18 20:56:22 navaraf Exp $
|
; $Id: ntoskrnl.def,v 1.197 2004/10/30 23:48:57 navaraf Exp $
|
||||||
;
|
;
|
||||||
; reactos/ntoskrnl/ntoskrnl.def
|
; reactos/ntoskrnl/ntoskrnl.def
|
||||||
;
|
;
|
||||||
|
@ -644,7 +644,7 @@ KeStackAttachProcess@8
|
||||||
KeSynchronizeExecution@12
|
KeSynchronizeExecution@12
|
||||||
KeTerminateThread@4
|
KeTerminateThread@4
|
||||||
KeTickCount DATA
|
KeTickCount DATA
|
||||||
KeUpdateRunTime@4
|
KeUpdateRunTime@8
|
||||||
KeUpdateSystemTime@8
|
KeUpdateSystemTime@8
|
||||||
KeUnstackDetachProcess@4
|
KeUnstackDetachProcess@4
|
||||||
KeUserModeCallback@20
|
KeUserModeCallback@20
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: process.c,v 1.146 2004/10/24 20:37:27 weiden Exp $
|
/* $Id: process.c,v 1.147 2004/10/30 23:48:57 navaraf Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -673,6 +673,8 @@ NtCreateProcess(OUT PHANDLE ProcessHandle,
|
||||||
KProcess->LdtDescriptor[0] = 0;
|
KProcess->LdtDescriptor[0] = 0;
|
||||||
KProcess->LdtDescriptor[1] = 0;
|
KProcess->LdtDescriptor[1] = 0;
|
||||||
InitializeListHead(&KProcess->ThreadListHead);
|
InitializeListHead(&KProcess->ThreadListHead);
|
||||||
|
KProcess->ThreadQuantum = 6;
|
||||||
|
KProcess->AutoAlignment = 0;
|
||||||
MmInitializeAddressSpace(Process,
|
MmInitializeAddressSpace(Process,
|
||||||
&Process->AddressSpace);
|
&Process->AddressSpace);
|
||||||
Process->UniqueProcessId = InterlockedIncrement((LONG *)&PiNextProcessUniqueId); /* TODO */
|
Process->UniqueProcessId = InterlockedIncrement((LONG *)&PiNextProcessUniqueId); /* TODO */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: w32call.c,v 1.16 2004/10/22 20:45:46 ekohl Exp $
|
/* $Id: w32call.c,v 1.17 2004/10/30 23:48:57 navaraf Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -36,7 +36,7 @@ void* _alloca(size_t size);
|
||||||
|
|
||||||
typedef struct _NTW32CALL_SAVED_STATE
|
typedef struct _NTW32CALL_SAVED_STATE
|
||||||
{
|
{
|
||||||
ULONG SavedStackLimit;
|
ULONG_PTR SavedStackLimit;
|
||||||
PVOID SavedStackBase;
|
PVOID SavedStackBase;
|
||||||
PVOID SavedInitialStack;
|
PVOID SavedInitialStack;
|
||||||
PVOID CallerResult;
|
PVOID CallerResult;
|
||||||
|
@ -76,7 +76,7 @@ NtCallbackReturn (PVOID Result,
|
||||||
PVOID* CallerResult;
|
PVOID* CallerResult;
|
||||||
PVOID InitialStack;
|
PVOID InitialStack;
|
||||||
PVOID StackBase;
|
PVOID StackBase;
|
||||||
ULONG StackLimit;
|
ULONG_PTR StackLimit;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PNTW32CALL_SAVED_STATE State;
|
PNTW32CALL_SAVED_STATE State;
|
||||||
PKTRAP_FRAME SavedTrapFrame;
|
PKTRAP_FRAME SavedTrapFrame;
|
||||||
|
@ -244,7 +244,7 @@ NtW32Call (IN ULONG RoutineIndex,
|
||||||
{
|
{
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
PVOID NewStack;
|
PVOID NewStack;
|
||||||
ULONG StackSize;
|
ULONG_PTR StackSize;
|
||||||
PKTRAP_FRAME NewFrame;
|
PKTRAP_FRAME NewFrame;
|
||||||
PULONG UserEsp;
|
PULONG UserEsp;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
|
@ -258,7 +258,7 @@ NtW32Call (IN ULONG RoutineIndex,
|
||||||
Thread = PsGetCurrentThread();
|
Thread = PsGetCurrentThread();
|
||||||
|
|
||||||
/* Set up the new kernel and user environment. */
|
/* Set up the new kernel and user environment. */
|
||||||
StackSize = (ULONG)((char*)Thread->Tcb.StackBase - Thread->Tcb.StackLimit);
|
StackSize = (ULONG_PTR)(Thread->Tcb.StackBase - Thread->Tcb.StackLimit);
|
||||||
KeAcquireSpinLock(&CallbackStackListLock, &oldIrql);
|
KeAcquireSpinLock(&CallbackStackListLock, &oldIrql);
|
||||||
if (IsListEmpty(&CallbackStackListHead))
|
if (IsListEmpty(&CallbackStackListHead))
|
||||||
{
|
{
|
||||||
|
@ -305,7 +305,7 @@ NtW32Call (IN ULONG RoutineIndex,
|
||||||
SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame;
|
SavedState.SavedTrapFrame = Thread->Tcb.TrapFrame;
|
||||||
SavedState.SavedCallbackStack = Thread->Tcb.CallbackStack;
|
SavedState.SavedCallbackStack = Thread->Tcb.CallbackStack;
|
||||||
Thread->Tcb.InitialStack = Thread->Tcb.StackBase = (char*)NewStack + StackSize;
|
Thread->Tcb.InitialStack = Thread->Tcb.StackBase = (char*)NewStack + StackSize;
|
||||||
Thread->Tcb.StackLimit = (ULONG)NewStack;
|
Thread->Tcb.StackLimit = (ULONG_PTR)NewStack;
|
||||||
Thread->Tcb.KernelStack = (char*)NewStack + StackSize - sizeof(KTRAP_FRAME);
|
Thread->Tcb.KernelStack = (char*)NewStack + StackSize - sizeof(KTRAP_FRAME);
|
||||||
KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack;
|
KeGetCurrentKPCR()->TSS->Esp0 = (ULONG)Thread->Tcb.InitialStack;
|
||||||
KePushAndStackSwitchAndSysRet((ULONG)&SavedState, Thread->Tcb.KernelStack);
|
KePushAndStackSwitchAndSysRet((ULONG)&SavedState, Thread->Tcb.KernelStack);
|
||||||
|
|
Loading…
Reference in a new issue