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