NtSetContextThread

NTSTATUS __stdcall NtSetContextThread(VOID *ThreadHandle, _CONTEXT *ThreadContext){
  _ETHREAD *CurrentThread; 
  INT8 PreviousMode; 
  int v5; 
  PEPROCESS v6; 
  PETHREAD v7; 
  int v9; 
  PETHREAD Thread; 
  _EVENT_DATA_DESCRIPTOR UserData; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Thread = 0i64;
  PreviousMode = CurrentThread->Tcb.PreviousMode;
  v5 = ObReferenceObjectByHandle(
         ThreadHandle,
         0x10ui64,
         (_OBJECT_TYPE *)PsThreadType,
         PreviousMode,
         (VOID **)&Thread,
         0i64);
  if( v5 >= 0 )
  {
    v6 = IoThreadToProcess(CurrentThread);
    v7 = Thread;
    if( (v6->Flags2 & 0x20000) != 0 && v6 == IoThreadToProcess(Thread) )
    {
      v5 = -1073740278;
    }
    else if( (v7->Tcb._bf_0 & 0x400) != 0 || v7->PicoContext )
    {
      v5 = -1073741816;
    }
    else
    {
      v5 = PspSetContextThreadInternal(v7, ThreadContext, PreviousMode, PreviousMode, 1u);
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)v7);
  }
  UserData.Reserved = 0;
  UserData.Ptr = (unsigned __int64)&v9;
  v9 = v5;
  UserData.Size = 4;
  EtwWrite(*(&ExBootDevicesRemovedEvent + 379), &KERNEL_AUDIT_API_SETCONTEXTTHREAD, 0, 1u, &UserData);
  return v5;
}

Referenced by:

No references.