PopCreateUserPowerRequest

NTSTATUS __stdcall PopCreateUserPowerRequest(VOID **PowerRequest, UINT8 SpecialRequest, _DIAGNOSTIC_CONTEXT *Context){
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  NTSTATUS result; 
  _PO_POWER_REQUEST *v9; 
  unsigned int SessionId; 
  __int64 v11; 
  UINT8 SystemAppIdentifier; 
  _PO_POWER_REQUEST *PowerRequesta; 

  PowerRequesta = 0i64;
  SystemAppIdentifier = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Process = CurrentThread->Tcb.ApcState.Process;
  if( SpecialRequest )
  {
    PsQueryProcessAttributes(CurrentThread->Tcb.ApcState.Process, &SystemAppIdentifier, 0i64);
    if( SystemAppIdentifier )
      return -1073741637;
  }
  result = PopCreatePowerRequestObject(&PowerRequesta, Context);
  if( result >= 0 )
  {
    v9 = PowerRequesta;
    *((_BYTE *)PowerRequesta + 136) = SpecialRequest;
    if( !SpecialRequest )
      *((_QWORD *)v9 + 15) = Process;
    SessionId = MmGetSessionIdEx(Context->Process);
    if( SpecialRequest )
      v9[5] = 8;
    else
      v9[5] = SessionIsInteractive(SessionId) != 0 ? 63 : 30;
    PopAcquirePowerRequestPushLock(1u);
    LOBYTE(v11) = SpecialRequest;
    PopInsertPowerRequestObject(v9, v11);
    if( *(&stru_140C23628 + 6016) && v9[22] )
      PopUmpoSendPowerRequestCreate((unsigned int)v9[7]);
    if( !SpecialRequest )
      PopUmpoSendPowerRequestOverrideQuery(v9);
    PopReleaseRwLock((_POP_RW_LOCK *)((char *)&stru_140C23628 + 5864));
    PopDiagTracePowerRequestCreate(0, v9);
    result = 0;
    *PowerRequest = v9;
  }
  return result;
}

Referenced by:

NtSetThreadExecutionState
PopPowerRequestCreateInfo