ExpNtUpdateWnfStateData
__int64 __fastcall ExpNtUpdateWnfStateData(
INT64 *a1,
INT64 a2,
unsigned int a3,
__int128 *a4,
__int64 a5,
INT64 a6,
INT64 a7,
int a8){
_ETHREAD *CurrentThread;
CHAR v9;
unsigned __int64 v10;
int NameInstance;
unsigned __int64 v12;
__int64 v13;
unsigned __int64 v14;
INT64 v15;
_ETHREAD *v16;
_EPROCESS *v17;
_WNF_STATE_NAME_STRUCT v18;
_WNF_SCOPE_INSTANCE *v19;
int v20;
unsigned int v21;
int v22;
_WNF_STATE_NAME_REGISTRATION *v24;
int v25;
UINT64 *v26;
_BYTE *v27;
_BYTE *v28;
__int64 v29;
INT64 v30;
INT64 v31;
PSID Sid;
INT64 v33;
int v34;
_DWORD Privileges[3];
int v36;
_WNF_STATE_NAME_STRUCT InternalStateName;
PVOID P;
int v39;
PSID v40;
UINT8 AccessGranted[8];
_WNF_SCOPE_INSTANCE *ScopeInstance;
VOID *Data;
_EPROCESS *Process;
INT64 CapturedScopeData[2];
INT64 v46;
INT64 v47;
__int128 v48;
Privileges[0] = a3;
Data = (VOID *)a2;
InternalStateName = 0i64;
v48 = 0i64;
v40 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v9 = *((_BYTE *)KeGetCurrentThread() + 562);
P = 0i64;
ScopeInstance = 0i64;
*(_QWORD *)&Privileges[1] = 0i64;
LODWORD(v10) = 0;
*(_OWORD *)CapturedScopeData = 0i64;
*(_QWORD *)AccessGranted = a4;
NameInstance = ExpCaptureWnfStateName((const _WNF_STATE_NAME *)a1, &InternalStateName, v9);
if( NameInstance < 0 )
goto LABEL_26;
v39 = (*(unsigned __int64 *)&InternalStateName >> 4) & 3;
v10 = (*(unsigned __int64 *)&InternalStateName >> 6) & 0xF;
v34 = (*(unsigned __int64 *)&InternalStateName >> 6) & 0xF;
if( v9 )
{
if( (_DWORD)v13 && (v14 + v13 > 0x7FFFFFFF0000i64 || v14 + v13 < v14) )
MEMORY[0x7FFFFFFF0000] = 0;
if( v12 )
{
if( v12 >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
v48 = *(_OWORD *)v12;
*(_QWORD *)AccessGranted = &v48;
}
}
NameInstance = ExpWnfCaptureScopeInstanceId(
(*(unsigned __int64 *)&InternalStateName >> 6) & 0xF,
(UINT64 *)a5,
v9,
&v40,
(INT64)CapturedScopeData);
if( NameInstance < 0 )
goto LABEL_26;
if( v9 )
{
v36 = 0;
if( a5 )
{
NameInstance = ExpWnfCheckCrossScopeAccess(InternalStateName);
if( NameInstance < 0 )
goto LABEL_26;
}
}
else
{
v36 = 1;
}
if( v9 )
{
v16 = (_ETHREAD *)KeGetCurrentThread();
v17 = (_EPROCESS *)*((_QWORD *)v16 + 23);
Process = v17;
LODWORD(v10) = v34;
if( v34 == 3 && (!v40 || v17 == *(_EPROCESS **)v40) )
goto LABEL_44;
}
else
{
v16 = 0i64;
v17 = (_EPROCESS *)PsInitialSystemProcess;
Process = (_EPROCESS *)PsInitialSystemProcess;
}
if( (_DWORD)v10 == 5 && a8 )
{
if( (_DWORD)a7 )
{
LABEL_44:
NameInstance = -1073741811;
goto LABEL_26;
}
v46 = *(_QWORD *)&InternalStateName ^ 0x41C64E6DA3BC0074i64;
LODWORD(v33) = Privileges[0];
NameInstance = ExpCrossVmWnfPush(v15, 1ui64, (INT64)&v46, 0xFFFFFFFFui64, (INT64)Data, v33);
if( NameInstance != -1073741822 )
goto LABEL_26;
}
NameInstance = ExpWnfResolveScopeInstance(
(struct _EX_RUNDOWN_REF **)&ScopeInstance,
(__int64)v17,
(__int64)v16,
v10,
v40);
if( NameInstance < 0 )
goto LABEL_26;
v18 = InternalStateName;
v19 = ScopeInstance;
v20 = ExpWnfLookupNameInstance(ScopeInstance, InternalStateName, (_WNF_NAME_INSTANCE **)&Privileges[1]);
NameInstance = v20;
if( v20 != -1073741772 || v39 == 3 )
{
if( v20 < 0 )
goto LABEL_26;
v21 = Privileges[0];
ExpWnfValidatePubSubPreconditions(
(UNICODE_STRING *)2,
(SECURITY_SUBJECT_CONTEXT *)(*(_QWORD *)&Privileges[1] + 56i64),
(PRIVILEGE_SET *)Privileges[0],
AccessGranted[0]);
NameInstance = v22;
if( v22 < 0 )
goto LABEL_26;
}
else
{
NameInstance = ExpWnfLookupPermanentName(v18, (_WNF_STATE_NAME_REGISTRATION **)&P);
if( NameInstance < 0 )
goto LABEL_26;
v24 = (_WNF_STATE_NAME_REGISTRATION *)P;
ExpWnfValidatePubSubPreconditions(
(UNICODE_STRING *)2,
(SECURITY_SUBJECT_CONTEXT *)P,
(PRIVILEGE_SET *)Privileges[0],
AccessGranted[0]);
NameInstance = v25;
if( v25 < 0 )
goto LABEL_26;
NameInstance = ExpWnfCreateNameInstance(v19, v18, v24, Process, (_WNF_NAME_INSTANCE **)&Privileges[1]);
ExFreePoolWithTag(v24, 0x20666E57u);
P = 0i64;
if( NameInstance < 0 )
goto LABEL_26;
v21 = Privileges[0];
}
LODWORD(Sid) = a7;
NameInstance = ExpWnfWriteStateData(*(_WNF_NAME_INSTANCE **)&Privileges[1], Data, v21, (unsigned int)a6, (UINT64)Sid);
if( NameInstance >= 0 )
{
if( (_DWORD)v10 == 5 )
{
v47 = *(_QWORD *)&InternalStateName ^ 0x41C64E6DA3BC0074i64;
v26 = (UINT64 *)(*(_QWORD *)&Privileges[1] + 80i64);
LODWORD(v27) = KeAbPreAcquire((PVOID)(*(_QWORD *)&Privileges[1] + 80i64), 0i64, 0i64);
v28 = v27;
if( _InterlockedCompareExchange64((volatile signed __int64 *)v26, 17i64, 0i64) )
ExfAcquirePushLockSharedEx(v26, v27, v26);
if( v28 )
v28[26] |= 1u;
v29 = 0i64;
if( *(_QWORD *)(*(_QWORD *)&Privileges[1] + 88i64) != 1i64 )
v29 = *(_QWORD *)(*(_QWORD *)&Privileges[1] + 88i64);
if( v29 )
{
v30 = v29 + 16;
v31 = *(unsigned int *)(v29 + 8);
}
else
{
v30 = 0i64;
v31 = 0i64;
}
LODWORD(v33) = v31;
ExpCrossVmWnfPush(v31, 0i64, (INT64)&v47, *(unsigned int *)(*(_QWORD *)&Privileges[1] + 96i64), v30, v33);
if( _InterlockedCompareExchange64((volatile signed __int64 *)v26, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)v26);
KeAbPostRelease(v26);
LODWORD(v10) = v34;
}
ExpWnfNotifyNameSubscribers(*(INT64 *)&Privileges[1], 1ui64, 1i64, v9 != 0);
NameInstance = 0;
}
LABEL_26:
if( *(_QWORD *)&Privileges[1] )
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(*(_QWORD *)&Privileges[1] + 8i64));
if( ScopeInstance )
ExReleaseRundownProtection(&ScopeInstance->RunRef);
if( P )
ExFreePoolWithTag(P, 0x20666E57u);
KeLeaveCriticalRegion();
ExpWnfReleaseCapturedScopeInstanceId(v10, (PVOID *)CapturedScopeData, v9);
return(unsigned int)NameInstance;
}Referenced by:
ExWnfCrossVmCallback
NtUpdateWnfStateData
PfSnPowerBoostUpdate