ExpWnfGenerateStateName
NTSTATUS __stdcall ExpWnfGenerateStateName(
_WNF_STATE_NAME_STRUCT *StateName,
_WNF_STATE_NAME_LIFETIME NameLifetime,
_WNF_DATA_SCOPE DataScope,
UINT8 PersistData){
char v5;
_EJOB *v8;
_EJOB *CurrentServerSilo;
_ESERVERSILO_GLOBALS *CurrentServerSiloGlobals;
signed __int64 v11;
bool v12;
__int64 v13;
NTSTATUS result;
_KSPIN_LOCK *v15;
__int64 SequenceNumber[3];
SequenceNumber[0] = 0i64;
v5 = DataScope;
if( (unsigned int)(DataScope - 4) > 1 )
{
CurrentServerSilo = PsGetCurrentServerSilo();
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v15);
}
else
{
LODWORD(v8) = HalSystemVectorDispatchEntry(
(UINT32)StateName,
*(PKINTERRUPT_ROUTINE ***)&NameLifetime,
*(PKINTERRUPT_ROUTINE **)&DataScope);
CurrentServerSilo = v8;
CurrentServerSiloGlobals = PsGetServerSiloGlobals(v8);
}
if( (unsigned int)(NameLifetime - 2) > 1 )
{
result = ExpWnfAllocateNextPersistentNameSequence(CurrentServerSilo, (UINT64 *)SequenceNumber);
if( result < 0 )
return result;
v13 = SequenceNumber[0];
}
else
{
do
{
v11 = _InterlockedExchangeAdd64(&CurrentServerSiloGlobals->WnfSiloState.RuntimeNameSequenceNumber, 1ui64);
v12 = v11 == -1;
v13 = v11 + 1;
SequenceNumber[0] = v13;
}
while( v12 );
}
if( (v13 & 0xFFE0000000000000ui64) != 0 )
return -1073741823;
StateName->_bf_0 = (16 * ((v13 << 7) | NameLifetime & 3)) | (PersistData != 0 ? 0x400 : 0) | ((v5 & 0xF) << 6) & 0x7FEu | 1;
return 0;
}Referenced by:
NtCreateWnfStateName