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