ExpNtDeleteWnfStateData
INT64 __fastcall ExpNtDeleteWnfStateData(INT64 *a1, UINT64 *a2, INT64 a3){
_ETHREAD *CurrentThread;
CHAR v5;
CHAR v6;
_WNF_STATE_NAME_STRUCT v7;
unsigned __int64 v8;
unsigned __int64 v9;
int v10;
_EPROCESS *v11;
int v12;
INT64 v13;
int v15;
NTSTATUS v16;
INT64 v17;
int v18;
int v19;
_WNF_NAME_INSTANCE *NameInstance;
_WNF_SCOPE_INSTANCE *ScopeInstance;
int v22;
int v23;
_WNF_STATE_NAME_STRUCT StateName;
int v25[2];
PVOID P;
void *Sid[2];
INT64 CapturedScopeData[2];
INT64 v29;
INT64 v30;
v23 = a3;
StateName = 0i64;
Sid[0] = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v5 = *((_BYTE *)KeGetCurrentThread() + 562);
P = 0i64;
ScopeInstance = 0i64;
NameInstance = 0i64;
v19 = 0;
*(_OWORD *)CapturedScopeData = 0i64;
v18 = ExpCaptureWnfStateName((const _WNF_STATE_NAME *)a1, &StateName, v5);
if( v18 >= 0 )
{
v7 = StateName;
v8 = (*(unsigned __int64 *)&StateName >> 4) & 3;
v22 = (*(unsigned __int64 *)&StateName >> 4) & 3;
v9 = (*(unsigned __int64 *)&StateName >> 6) & 0xF;
v19 = (*(unsigned __int64 *)&StateName >> 6) & 0xF;
v18 = ExpWnfCaptureScopeInstanceId(v9, a2, v6, Sid, (INT64)CapturedScopeData);
if( v18 >= 0 )
{
if( v5 )
{
v10 = 0;
if( a2 )
{
v18 = ExpWnfCheckCrossScopeAccess(v7);
if( v18 < 0 )
goto LABEL_21;
}
}
else
{
v10 = 1;
}
if( v5 )
{
v29 = (INT64)KeGetCurrentThread();
v11 = *(_EPROCESS **)(v29 + 184);
v7 = StateName;
LODWORD(v8) = v22;
LODWORD(v9) = v19;
}
else
{
v29 = 0i64;
v11 = (_EPROCESS *)PsInitialSystemProcess;
}
*(_QWORD *)v25 = v11;
if( (_DWORD)v9 != 5
|| !v23
|| (v30 = *(_QWORD *)&v7 ^ 0x41C64E6DA3BC0074i64,
LODWORD(v17) = 0,
v15 = ExpCrossVmWnfPush(0x41C64E6DA3BC0074i64, 1ui64, (INT64)&v30, 0i64, 0i64, v17),
v18 = v15,
(int)(v15 + 0x80000000) < 0)
|| v15 == -1073741822 )
{
v18 = ExpWnfResolveScopeInstance((struct _EX_RUNDOWN_REF **)&ScopeInstance, *(__int64 *)v25, v29, v9, Sid[0]);
if( v18 >= 0 )
{
v12 = ExpWnfLookupNameInstance(ScopeInstance, v7, &NameInstance);
v18 = v12;
if( v12 != -1073741772 || (_DWORD)v8 == 3 )
{
if( v12 >= 0 )
{
if( v10
|| (v18 = ExpWnfCheckCallerAccess(NameInstance->StateNameInfo.SecurityDescriptor, 2ui64), v18 >= 0) )
{
if( (_DWORD)v8 != 3 || NameInstance->CreatorProcess == *(_EPROCESS **)v25 )
{
if( (*(_WORD *)&v7 & 0x400) == 0
|| (v16 = ExpWnfDeletePermanentStateData((INT64)ScopeInstance, *(_QWORD *)&v7),
v18 = v16,
((v16 + 0x80000000) & 0x80000000) != 0)
|| v16 == -1073741772 )
{
ExpWnfDeleteStateData((INT64)NameInstance);
if( (_DWORD)v9 == 5 )
{
v29 = *(_QWORD *)&v7 ^ 0x41C64E6DA3BC0074i64;
LODWORD(v17) = 0;
ExpCrossVmWnfPush(v13, 0i64, (INT64)&v29, 0i64, 0i64, v17);
}
goto LABEL_20;
}
}
else
{
v18 = -1073741790;
}
}
}
}
else
{
v18 = ExpWnfLookupPermanentName(v7, (_WNF_STATE_NAME_REGISTRATION **)&P);
if( v18 >= 0 )
{
if( v10 || (v18 = ExpWnfCheckCallerAccess(*((PVOID *)P + 2), 2ui64), v18 >= 0) )
{
if( (*(_WORD *)&v7 & 0x400) == 0
|| (v18 = ExpWnfDeletePermanentStateData((INT64)ScopeInstance, *(_QWORD *)&v7), v18 == -1073741772) )
{
LABEL_20:
v18 = 0;
}
}
}
}
}
}
}
}
LABEL_21:
if( NameInstance )
ExReleaseRundownProtection(&NameInstance->RunRef);
if( ScopeInstance )
ExReleaseRundownProtection(&ScopeInstance->RunRef);
if( P )
ExFreePoolWithTag(P, 0x20666E57u);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
ExpWnfReleaseCapturedScopeInstanceId(v19, (PVOID *)CapturedScopeData, v5);
return(unsigned int)v18;
}Referenced by:
ExWnfCrossVmCallback
NtDeleteWnfStateData