PsSetProcessWin32Process

NTSTATUS __stdcall PsSetProcessWin32Process(VOID *Process, VOID *Win32Process, VOID *PrevWin32Process){
  _ETHREAD *CurrentThread; 
  NTSTATUS v4; 
  _EX_PUSH_LOCK *v8; 
  VOID **PoolWithTag; 
  _WORK_QUEUE_ITEM *v11; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  v8 = (_EX_PUSH_LOCK *)((char *)Process + 1080);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Process + 135, 0i64);
  if( Win32Process )
  {
    if( (*((_DWORD *)Process + 281) & 8) != 0 || *((_QWORD *)Process + 161) )
    {
      v4 = -1073741558;
    }
    else
    {
      *((_QWORD *)Process + 161) = Win32Process;
      if( ((*((_QWORD *)Process + 302) | (*((_QWORD *)Process + 302) >> 30)) & 0x3FFFFFFFi64) != 0 )
      {
        PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x28ui64, 1698982228i64);
        v11 = (_WORK_QUEUE_ITEM *)PoolWithTag;
        if( PoolWithTag )
        {
          ObfReferenceObjectWithTag(Process, 0x624A7350ui64);
          v11[1].List.Flink = (_LIST_ENTRY *)Process;
          v11->WorkerRoutine = (void(__fastcall *)(void *))PspTimerDelayWorkerRoutine;
          v11->Parameter = v11;
          v11->List.Flink = 0i64;
          ExQueueWorkItem(v11, NormalWorkQueue);
        }
      }
    }
  }
  else if( *((VOID **)Process + 161) == PrevWin32Process )
  {
    *((_QWORD *)Process + 161) = 0i64;
  }
  else
  {
    v4 = -1073741823;
  }
  if( (_InterlockedExchangeAdd64(&v8->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v8);
  KeAbPostRelease(v8);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  return v4;
}

Referenced by:

No references.