ReactOS 0.4.15-dev-7842-g558ab78
psctx.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/ps/i386/psctx.c
5 * PURPOSE: Process Manager: Set/Get Context for i386
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9/* INCLUDES *******************************************************************/
10
11#include <ntoskrnl.h>
12#define NDEBUG
13#include <debug.h>
14
15/* FUNCTIONS ******************************************************************/
16
17VOID
20 IN PVOID NonVolatileContext,
22{
23 PAGED_CODE();
24
25 /* Convert the trap frame to a context */
27}
28
29VOID
32 OUT PVOID NonVolatileContext,
35{
36 PAGED_CODE();
37
38 /* Convert the context to a trap frame structure */
39 KeContextToTrapFrame(Context, NULL, TrapFrame, Context->ContextFlags, Mode);
40}
41
42VOID
45 IN OUT PKNORMAL_ROUTINE* NormalRoutine,
46 IN OUT PVOID* NormalContext,
49{
50 PGET_SET_CTX_CONTEXT GetSetContext;
55 PKTRAP_FRAME TrapFrame = NULL;
56 PAGED_CODE();
57
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;
64
65 /* If this is a kernel-mode request, grab the saved trap frame */
66 if (Mode == KernelMode) TrapFrame = Thread->Tcb.TrapFrame;
67
68 /* If we don't have one, grab it from the stack */
69 if (!TrapFrame)
70 {
71 /* Trap frame is right under our initial stack */
72 TrapFrame = KeGetTrapFrame(&Thread->Tcb);
73 }
74
75 /* Check if it's a set or get */
76 if (Apc->SystemArgument1)
77 {
78 /* Set the Context */
79 PspSetContext(TrapFrame, NULL, Context, Mode);
80 }
81 else
82 {
83 /* Get the Context */
84 PspGetContext(TrapFrame, NULL, Context);
85 }
86
87 /* Notify the Native API that we are done */
89}
90
91/* EOF */
#define PAGED_CODE()
VOID NTAPI PspGetContext(IN PKTRAP_FRAME TrapFrame, IN PVOID NonVolatileContext, IN OUT PCONTEXT Context)
Definition: psctx.c:19
VOID NTAPI PspSetContext(OUT PKTRAP_FRAME TrapFrame, OUT PVOID NonVolatileContext, IN PCONTEXT Context, IN KPROCESSOR_MODE Mode)
Definition: psctx.c:28
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
_In_ ULONG Mode
Definition: hubbusif.h:303
#define KernelMode
Definition: asm.h:34
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
Definition: ketypes.h:744
#define KeGetTrapFrame(Thread)
Definition: ke.h:208
VOID NTAPI KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN OUT PCONTEXT Context)
Definition: context.c:169
VOID NTAPI KeContextToTrapFrame(PCONTEXT Context, PKEXCEPTION_FRAME ExeptionFrame, PKTRAP_FRAME TrapFrame, ULONG ContextFlags, KPROCESSOR_MODE PreviousMode)
VOID NTAPI PspGetOrSetContextKernelRoutine(IN PKAPC Apc, IN OUT PKNORMAL_ROUTINE *NormalRoutine, IN OUT PVOID *NormalContext, IN OUT PVOID *SystemArgument1, IN OUT PVOID *SystemArgument2)
Definition: psctx.c:38
KTHREAD Tcb
Definition: pstypes.h:1103
CONTEXT Context
Definition: ps.h:87
KEVENT Event
Definition: ps.h:85
KPROCESSOR_MODE Mode
Definition: ps.h:86
Definition: ketypes.h:547
PKTRAP_FRAME TrapFrame
Definition: ketypes.h:1774
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define OUT
Definition: typedefs.h:40
#define IO_NO_INCREMENT
Definition: iotypes.h:598
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:688
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:689