VOID KiSaveProcessorState ( IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame ) /*++ Routine Description: This function saves the processor state from the specified exception and trap frames, and saves the processor control state. Arguments: TrapFrame - Supplies a pointer to a trap frame. ExceptionFrame - Supplies a pointer to an exception frame. Return Value: None. --*/ { #if !defined(NT_UP) PKPRCB Prcb; // // Get the address of the current processor block, move the specified // register state from specified trap and exception frames to the current // processor context structure, and save the processor control state. // Prcb = KeGetCurrentPrcb(); Prcb->ProcessorState.ContextFrame.ContextFlags = CONTEXT_FULL; KeContextFromKframes(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame); KiSaveProcessorControlState(&Prcb->ProcessorState); #else UNREFERENCED_PARAMETER(TrapFrame); UNREFERENCED_PARAMETER(ExceptionFrame); #endif return; }
VOID KiSaveProcessorState ( IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame ) /*++ Routine Description: This function moves processor register state from the specified trap and exception frames to the processor context structure in the current processor block. Arguments: TrapFrame - Supplies a pointer to a trap frame. ExceptionFrame - Supplies a pointer to an exception frame. Return Value: None. --*/ { PKPRCB Prcb; // // Get the address of the current processor block and move the // specified register state from specified trap and exception // frames to the current processor context structure. // Prcb = KeGetCurrentPrcb(); Prcb->ProcessorState.ContextFrame.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; KeContextFromKframes(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame); // // Save the current processor control state. // Prcb->ProcessorState.SpecialRegisters.KernelDr6 = Prcb->ProcessorState.ContextFrame.Dr6; KiSaveProcessorControlState(&Prcb->ProcessorState); return; }
VOID Ke386SetIOPL( IN PKPROCESS Process ) /*++ Routine Description: Gives IOPL to the specified process. All threads created from this point on will get IOPL. The current process will get IOPL. Must be called from context of thread and process that are to have IOPL. Iopl (to be made a boolean) in KPROCESS says all new threads to get IOPL. Iopl (to be made a boolean) in KTHREAD says given thread to get IOPL. N.B. If a kernel mode only thread calls this procedure, the result is (a) poinless and (b) will break the system. Arguments: Process - Pointer to the process == IGNORED!!! Return Value: none --*/ { PKTHREAD Thread; PKPROCESS Process2; PKTRAP_FRAME TrapFrame; CONTEXT Context; // // get current thread and Process2, set flag for IOPL in both of them // Thread = KeGetCurrentThread(); Process2 = Thread->ApcState.Process; Process2->Iopl = 1; Thread->Iopl = 1; // // Force IOPL to be on for current thread // TrapFrame = (PKTRAP_FRAME)((PUCHAR)Thread->InitialStack - ALIGN_UP(sizeof(KTRAP_FRAME),KTRAP_FRAME_ALIGN) - sizeof(FX_SAVE_AREA)); Context.ContextFlags = CONTEXT_CONTROL; KeContextFromKframes(TrapFrame, NULL, &Context); Context.EFlags |= (EFLAGS_IOPL_MASK & -1); // IOPL == 3 KeContextToKframes(TrapFrame, NULL, &Context, CONTEXT_CONTROL, UserMode); return; }