ExpWnfAllocateNextPersistentNameSequence
NTSTATUS __stdcall ExpWnfAllocateNextPersistentNameSequence(_EJOB *Silo, UINT64 *SequenceNumber){
int v3;
int NameStoreRegistryRoot;
_EJOB *v5;
_EJOB *v6;
_KSPIN_LOCK *v7;
_ESERVERSILO_GLOBALS *CurrentServerSiloGlobals;
_EX_PUSH_LOCK *p_WnfSiloState;
NTSTATUS v10;
UINT64 v11;
unsigned __int64 v12;
_BYTE *v14;
_BYTE *v15;
_BYTE *v16;
_BYTE *v17;
UINT64 Length;
UINT64 *ResultLength;
unsigned __int64 Data;
VOID *StoreRoot;
UINT64 v22;
_BYTE KeyValueInformation[24];
LODWORD(v22) = 0;
StoreRoot = 0i64;
memset(KeyValueInformation, 0, sizeof(KeyValueInformation));
v3 = 0;
NameStoreRegistryRoot = 0;
LODWORD(v5) = PsAttachSiloToCurrentThread((INT64)Silo);
v6 = v5;
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v7);
p_WnfSiloState = (_EX_PUSH_LOCK *)&CurrentServerSiloGlobals->WnfSiloState;
Data = CurrentServerSiloGlobals->WnfSiloState.PermanentNameSequenceNumberPool;
if( Data )
goto LABEL_8;
NameStoreRegistryRoot = ExpWnfGetNameStoreRegistryRoot(WnfPermanentStateName, &StoreRoot);
if( NameStoreRegistryRoot < 0 )
goto LABEL_22;
v14 = KeAbPreAcquire(&p_WnfSiloState[4], 0i64, 0i64);
v15 = v14;
if( _interlockedbittestandset64((volatile signed __int32 *)&p_WnfSiloState[4], 0i64) )
ExfAcquirePushLockExclusiveEx(p_WnfSiloState + 4, v14, &p_WnfSiloState[4]);
if( v15 )
v15[26] |= 1u;
v3 = 1;
if( p_WnfSiloState[5]._bf_0 )
goto LABEL_8;
LODWORD(Length) = 24;
v10 = ZwQueryValueKey(
StoreRoot,
(_UNICODE_STRING *)&ExpWnfPermanentNameSequenceNumberValueName,
KeyValuePartialInformation,
KeyValueInformation,
Length,
&v22);
NameStoreRegistryRoot = v10;
if( v10 < 0 )
{
if( v10 != -1073741772 )
goto LABEL_19;
do
LABEL_8:
v11 = _InterlockedIncrement64(&p_WnfSiloState[3]._bf_0);
while( !v11 );
Data = p_WnfSiloState[5].Value;
if( v11 > Data )
{
if( !StoreRoot )
{
NameStoreRegistryRoot = ExpWnfGetNameStoreRegistryRoot(WnfPermanentStateName, &StoreRoot);
if( NameStoreRegistryRoot < 0 )
goto LABEL_18;
}
if( !v3 )
{
v16 = KeAbPreAcquire(&p_WnfSiloState[4], 0i64, 0i64);
v17 = v16;
if( _interlockedbittestandset64((volatile signed __int32 *)&p_WnfSiloState[4], 0i64) )
ExfAcquirePushLockExclusiveEx(p_WnfSiloState + 4, v16, &p_WnfSiloState[4]);
if( v17 )
v17[26] |= 1u;
v3 = 1;
}
if( v11 <= p_WnfSiloState[5]._bf_0 )
goto LABEL_17;
v12 = p_WnfSiloState[5]._bf_0 + 100;
Data = v12;
if( v12 < v11 )
Data = v12 + 100 * ((v11 - v12 - 1) / 0x64 + 1);
LODWORD(ResultLength) = 8;
NameStoreRegistryRoot = ZwSetValueKey(
StoreRoot,
(_UNICODE_STRING *)&ExpWnfPermanentNameSequenceNumberValueName,
0i64,
3ui64,
&Data,
(UINT64)ResultLength);
if( NameStoreRegistryRoot < 0 )
{
LABEL_18:
if( !v3 )
goto LABEL_22;
goto LABEL_19;
}
_InterlockedExchange64(&p_WnfSiloState[5]._bf_0, Data);
}
LABEL_17:
*SequenceNumber = v11;
goto LABEL_18;
}
if( *(_DWORD *)&KeyValueInformation[8] == 8 )
{
Data = *(_QWORD *)&KeyValueInformation[12];
_InterlockedExchange64(&p_WnfSiloState[3]._bf_0, *(__int64 *)&KeyValueInformation[12]);
_InterlockedExchange64(&p_WnfSiloState[5]._bf_0, Data);
goto LABEL_8;
}
NameStoreRegistryRoot = -1073741823;
LABEL_19:
if( (_InterlockedExchangeAdd64(&p_WnfSiloState[4]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(p_WnfSiloState + 4);
KeAbPostRelease(&p_WnfSiloState[4]);
LABEL_22:
PsDetachSiloFromCurrentThread(v6);
return NameStoreRegistryRoot;
}Referenced by:
ExpWnfGenerateStateName