97 lines
1.8 KiB
C
97 lines
1.8 KiB
C
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
procswap.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the platform dependent kernel function to swap
|
|
processes.
|
|
|
|
Author:
|
|
|
|
David N. Cutler (davec) 10-Jun-2000
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "ki.h"
|
|
|
|
BOOLEAN
|
|
KiSwapProcess (
|
|
IN PKPROCESS NewProcess,
|
|
IN PKPROCESS OldProcess
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function swaps the address space to another process by flushing the
|
|
the translation buffer and establishings a new directory table base. It
|
|
also swaps the I/O permission map to the new process.
|
|
|
|
N.B. There is code similar to this code in swap context.
|
|
|
|
N.B. This code is executed at DPC level.
|
|
|
|
Arguments:
|
|
|
|
NewProcess - Supplies a pointer to the new process object.
|
|
|
|
Oldprocess - Supplies a pointer to the old process object.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
PKSPIN_LOCK_QUEUE LockQueue;
|
|
PKPRCB Prcb;
|
|
PKTSS64 TssBase;
|
|
|
|
//
|
|
// Acquire the context swap lock and update the active processor
|
|
// masks for the new and old process.
|
|
//
|
|
|
|
Prcb = KeGetCurrentPrcb();
|
|
|
|
#if !defined(NT_UP)
|
|
|
|
LockQueue = &Prcb->LockQueue[LockQueueContextSwapLock];
|
|
KeAcquireQueuedSpinLockAtDpcLevel(LockQueue);
|
|
OldProcess->ActiveProcessors ^= Prcb->SetMember;
|
|
|
|
ASSERT((OldProcess->ActiveProcessors & Prcb->SetMember) == 0);
|
|
|
|
NewProcess->ActiveProcessors ^= Prcb->SetMember;
|
|
|
|
ASSERT((NewProcess->ActiveProcessors & Prcb->SetMember) != 0);
|
|
|
|
KeReleaseQueuedSpinLockFromDpcLevel(LockQueue);
|
|
|
|
#endif // !defined(NT_UP)
|
|
|
|
//
|
|
// Set the offset of the I/O permissions map for the new process and
|
|
// load the new directory table base.
|
|
//
|
|
|
|
TssBase = KeGetPcr()->TssBase;
|
|
TssBase->IoMapBase = NewProcess->IopmOffset;
|
|
WriteCR3(NewProcess->DirectoryTableBase[0]);
|
|
return TRUE;
|
|
}
|