2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/ps/i386/pxctx.c
5 * PURPOSE: Process Manager: Set/Get Context for i386
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES *******************************************************************/
15 /* FUNCTIONS ******************************************************************/
19 PspGetContext(IN PKTRAP_FRAME TrapFrame
,
20 IN PVOID NonVolatileContext
,
21 IN OUT PCONTEXT Context
)
25 /* Convert the trap frame to a context */
26 KeTrapFrameToContext(TrapFrame
, NULL
, Context
);
31 PspSetContext(OUT PKTRAP_FRAME TrapFrame
,
32 OUT PVOID NonVolatileContext
,
34 IN KPROCESSOR_MODE Mode
)
38 /* Convert the context to a trap frame structure */
39 KeContextToTrapFrame(Context
, NULL
, TrapFrame
, Context
->ContextFlags
, Mode
);
44 PspGetOrSetContextKernelRoutine(IN PKAPC Apc
,
45 IN OUT PKNORMAL_ROUTINE
* NormalRoutine
,
46 IN OUT PVOID
* NormalContext
,
47 IN OUT PVOID
* SystemArgument1
,
48 IN OUT PVOID
* SystemArgument2
)
50 PGET_SET_CTX_CONTEXT GetSetContext
;
55 PKTRAP_FRAME TrapFrame
= NULL
;
58 /* Get the Context Structure */
59 GetSetContext
= CONTAINING_RECORD(Apc
, GET_SET_CTX_CONTEXT
, Apc
);
60 Context
= &GetSetContext
->Context
;
61 Event
= &GetSetContext
->Event
;
62 Mode
= GetSetContext
->Mode
;
63 Thread
= Apc
->SystemArgument2
;
65 /* If this is a kernel-mode request, grab the saved trap frame */
66 if (Mode
== KernelMode
) TrapFrame
= Thread
->Tcb
.TrapFrame
;
68 /* If we don't have one, grab it from the stack */
71 /* Trap frame is right under our initial stack */
72 TrapFrame
= KeGetTrapFrame(&Thread
->Tcb
);
75 /* Check if it's a set or get */
76 if (Apc
->SystemArgument1
)
79 PspSetContext(TrapFrame
, NULL
, Context
, Mode
);
84 PspGetContext(TrapFrame
, NULL
, Context
);
87 /* Notify the Native API that we are done */
88 KeSetEvent(Event
, IO_NO_INCREMENT
, FALSE
);