ReactOS  0.4.15-dev-1018-g0695ecb
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 
17 VOID
18 NTAPI
20  IN PVOID NonVolatileContext,
22 {
23  PAGED_CODE();
24 
25  /* Convert the trap frame to a context */
26  KeTrapFrameToContext(TrapFrame, NULL, Context);
27 }
28 
29 VOID
30 NTAPI
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 
42 VOID
43 NTAPI
45  IN OUT PKNORMAL_ROUTINE* NormalRoutine,
46  IN OUT PVOID* NormalContext,
49 {
50  PGET_SET_CTX_CONTEXT GetSetContext;
51  PKEVENT Event;
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 */
VOID NTAPI KeContextToTrapFrame(PCONTEXT Context, PKEXCEPTION_FRAME ExeptionFrame, PKTRAP_FRAME TrapFrame, ULONG ContextFlags, KPROCESSOR_MODE PreviousMode)
#define IN
Definition: typedefs.h:39
_In_ ULONG Mode
Definition: hubbusif.h:303
KTHREAD Tcb
Definition: pstypes.h:1045
PKTRAP_FRAME TrapFrame
Definition: ketypes.h:1664
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
VOID NTAPI PspGetContext(IN PKTRAP_FRAME TrapFrame, IN PVOID NonVolatileContext, IN OUT PCONTEXT Context)
Definition: psctx.c:20
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define FALSE
Definition: types.h:117
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:45
_In_ PVOID _In_ ULONG Event
Definition: iotypes.h:439
smooth NULL
Definition: ftsmooth.c:416
VOID NTAPI KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN OUT PCONTEXT Context)
Definition: context.c:147
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:675
KPROCESSOR_MODE Mode
Definition: ps.h:80
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
Definition: ketypes.h:535
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:675
KEVENT Event
Definition: ps.h:79
VOID NTAPI PspSetContext(OUT PKTRAP_FRAME TrapFrame, OUT PVOID NonVolatileContext, IN PCONTEXT Context, IN KPROCESSOR_MODE Mode)
Definition: psctx.c:32
#define OUT
Definition: typedefs.h:40
struct tagContext Context
Definition: acpixf.h:1034
#define IO_NO_INCREMENT
Definition: iotypes.h:570
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
Definition: ketypes.h:632
CONTEXT Context
Definition: ps.h:81
#define KeGetTrapFrame(Thread)
Definition: ke.h:145
#define PAGED_CODE()