NtCreateWnfStateName
INT64 __fastcall NtCreateWnfStateName(
_WNF_STATE_NAME *StateName,
_WNF_STATE_NAME_LIFETIME NameLifetime,
_WNF_DATA_SCOPE DataScope,
INT64 PersistData,
const _WNF_TYPE_ID *TypeId,
INT64 MaximumStateSize,
VOID *SecurityDescriptor,
INT64 a8){
UINT8 v8;
_WNF_STATE_NAME *v11;
__int64 v12;
_ETHREAD *CurrentThread;
INT8 v14;
_WNF_STATE_NAME_STRUCT v15;
_EPROCESS *v16;
int v18;
PSECURITY_DESCRIPTOR SecurityDescriptora;
_WNF_STATE_NAME_STRUCT StateNamea;
_WNF_SCOPE_INSTANCE *ScopeInstance;
const _WNF_TYPE_ID *v22;
_WNF_NAME_INSTANCE *NameInstance[4];
_WNF_STATE_NAME_REGISTRATION StateInfo;
__int128 v25;
v8 = PersistData;
v11 = StateName;
v12 = (__int64)TypeId;
NameInstance[1] = (_WNF_NAME_INSTANCE *)SecurityDescriptor;
v25 = 0i64;
StateNamea = 0i64;
NameInstance[0] = 0i64;
*(&StateInfo.MaxStateSize + 1) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v14 = *((_BYTE *)KeGetCurrentThread() + 562);
ScopeInstance = 0i64;
SecurityDescriptora = 0i64;
v22 = TypeId;
if( !v14 )
{
v18 = SeCaptureSecurityDescriptor(SecurityDescriptor, 0, PagedPool, 1u, &SecurityDescriptora);
if( v18 < 0 )
goto LABEL_18;
LABEL_3:
ExpWnfSpecializeSecurityDescriptor(SecurityDescriptora);
if( (unsigned int)NameLifetime > WnfTemporaryStateName
|| NameLifetime == WnfWellKnownStateName
|| (unsigned int)DataScope > WnfDataScopePhysicalMachine
|| v8 && ((DataScope & 0xFFFFFFFB) != 0 || NameLifetime != WnfPermanentStateName)
|| (unsigned int)MaximumStateSize > 0x1000
|| DataScope == WnfDataScopeProcess && NameLifetime == WnfTemporaryStateName
|| DataScope == WnfDataScopePhysicalMachine )
{
v18 = -1073741811;
}
else if( NameLifetime == WnfTemporaryStateName
|| SeSinglePrivilegeCheck(*(_QWORD *)&SeCreatePermanentPrivilege, v14) )
{
v18 = ExpWnfGenerateStateName(&StateNamea, NameLifetime, DataScope, v8);
if( v18 >= 0 )
{
v15 = StateNamea;
*v11 = (_WNF_STATE_NAME)(*(_QWORD *)&StateNamea ^ 0x41C64E6DA3BC0074i64);
StateInfo.MaxStateSize = MaximumStateSize;
StateInfo.TypeId = v22;
StateInfo.SecurityDescriptor = (_SECURITY_DESCRIPTOR *)SecurityDescriptora;
if( NameLifetime == WnfTemporaryStateName )
{
if( v14 )
{
v16 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
v15 = StateNamea;
}
else
{
v16 = (_EPROCESS *)PsInitialSystemProcess;
}
v18 = ExpWnfResolveScopeInstance(
(struct _EX_RUNDOWN_REF **)&ScopeInstance,
(__int64)v16,
0i64,
DataScope,
0i64);
if( v18 >= 0 )
{
v18 = ExpWnfCreateNameInstance(ScopeInstance, v15, &StateInfo, v16, NameInstance);
if( v18 >= 0 )
ExReleaseRundownProtection(&NameInstance[0]->RunRef);
}
}
else
{
v18 = ((__int64(__fastcall *)(_QWORD, _QWORD))ExpWnfRegisterPermanentName)(v15, &StateInfo);
}
}
}
else
{
v18 = -1073741727;
}
goto LABEL_18;
}
if( (unsigned __int64)StateName >= 0x7FFFFFFF0000i64 )
StateName = (_WNF_STATE_NAME *)0x7FFFFFFF0000i64;
LOBYTE(StateName->Data[0]) = StateName->Data[0];
HIBYTE(StateName->Data[1]) = HIBYTE(StateName->Data[1]);
if( TypeId )
{
if( (unsigned __int64)TypeId >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
v25 = *(_OWORD *)v12;
v22 = (const _WNF_TYPE_ID *)&v25;
}
if( !SecurityDescriptor )
{
v18 = -1073741819;
goto LABEL_18;
}
v18 = SeCaptureSecurityDescriptor(SecurityDescriptor, v14, PagedPool, 1u, &SecurityDescriptora);
if( v18 >= 0 )
goto LABEL_3;
LABEL_18:
if( ScopeInstance )
ExReleaseRundownProtection(&ScopeInstance->RunRef);
if( SecurityDescriptora && SecurityDescriptora != SecurityDescriptor )
SeReleaseSecurityDescriptor(SecurityDescriptora, v14, 1u);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return(unsigned int)v18;
}Referenced by:
No references.