NtCreateWnfStateName
NTSTATUS __stdcall NtCreateWnfStateName(
_WNF_STATE_NAME *StateName,
_WNF_STATE_NAME_LIFETIME NameLifetime,
_WNF_DATA_SCOPE DataScope,
UINT8 PersistData,
_WNF_TYPE_ID *TypeId,
UINT64 MaximumStateSize,
VOID *SecurityDescriptor){
_WNF_STATE_NAME *v10;
__int64 v11;
_ETHREAD *CurrentThread;
char PreviousMode;
__int64 bf_0;
_EPROCESS *Process;
INT64 v17;
INT64 v18;
int v19;
VOID *ScopeInstanceId;
_WNF_STATE_NAME_STRUCT StateNamea;
_WNF_SCOPE_INSTANCE *ScopeInstance;
_WNF_TYPE_ID *v23;
_WNF_NAME_INSTANCE *NameInstance[4];
_WNF_STATE_NAME_REGISTRATION StateInfo;
__int128 v26;
v10 = StateName;
v11 = (__int64)TypeId;
NameInstance[1] = (_WNF_NAME_INSTANCE *)SecurityDescriptor;
v26 = 0i64;
StateNamea._bf_0 = 0i64;
NameInstance[0] = 0i64;
*(&StateInfo.MaxStateSize + 1) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
PreviousMode = KeGetCurrentThread()->PreviousMode;
LOBYTE(v18) = PreviousMode;
ScopeInstance = 0i64;
ScopeInstanceId = 0i64;
v23 = TypeId;
if( !PreviousMode )
{
v19 = SeCaptureSecurityDescriptor(SecurityDescriptor, 0, PagedPool, 1u, &ScopeInstanceId, v17, v18);
if( v19 < 0 )
goto LABEL_18;
LABEL_3:
ExpWnfSpecializeSecurityDescriptor(ScopeInstanceId);
if( (unsigned int)NameLifetime > WnfTemporaryStateName
|| NameLifetime == WnfWellKnownStateName
|| (unsigned int)DataScope > WnfDataScopePhysicalMachine
|| PersistData && ((DataScope & 0xFFFFFFFB) != 0 || NameLifetime != WnfPermanentStateName)
|| (unsigned int)MaximumStateSize > 0x1000
|| DataScope == WnfDataScopeProcess && NameLifetime == WnfTemporaryStateName
|| DataScope == WnfDataScopePhysicalMachine )
{
v19 = -1073741811;
}
else if( NameLifetime == WnfTemporaryStateName
|| SeSinglePrivilegeCheck(*(_QWORD *)&SeCreatePermanentPrivilege, PreviousMode) )
{
v19 = ExpWnfGenerateStateName(&StateNamea, NameLifetime, DataScope, PersistData);
if( v19 >= 0 )
{
bf_0 = StateNamea._bf_0;
*v10 = (_WNF_STATE_NAME)(StateNamea._bf_0 ^ 0x41C64E6DA3BC0074i64);
StateInfo.MaxStateSize = MaximumStateSize;
StateInfo.TypeId = v23;
StateInfo.SecurityDescriptor = (_SECURITY_DESCRIPTOR *)ScopeInstanceId;
if( NameLifetime == WnfTemporaryStateName )
{
if( PreviousMode )
{
Process = KeGetCurrentThread()->ApcState.Process;
bf_0 = StateNamea._bf_0;
}
else
{
Process = PsInitialSystemProcess;
}
v19 = ExpWnfResolveScopeInstance(&ScopeInstance, Process, 0i64, DataScope, 0i64);
if( v19 >= 0 )
{
v19 = ExpWnfCreateNameInstance(
ScopeInstance,
(_WNF_STATE_NAME_STRUCT)bf_0,
&StateInfo,
Process,
NameInstance);
if( v19 >= 0 )
ExReleaseRundownProtection(&NameInstance[0]->RunRef);
}
}
else
{
v19 = ExpWnfRegisterPermanentName((_WNF_STATE_NAME_STRUCT)bf_0, &StateInfo);
}
}
}
else
{
v19 = -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 )
v11 = 0x7FFFFFFF0000i64;
v26 = *(_OWORD *)v11;
v23 = (_WNF_TYPE_ID *)&v26;
}
if( !SecurityDescriptor )
{
v19 = -1073741819;
goto LABEL_18;
}
v19 = SeCaptureSecurityDescriptor(SecurityDescriptor, PreviousMode, PagedPool, 1u, &ScopeInstanceId, v17, v18);
if( v19 >= 0 )
goto LABEL_3;
LABEL_18:
if( ScopeInstance )
ExReleaseRundownProtection(&ScopeInstance->RunRef);
if( ScopeInstanceId && ScopeInstanceId != SecurityDescriptor )
SeReleaseSecurityDescriptor(ScopeInstanceId, PreviousMode, 1u);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v19;
}Referenced by:
No references.