WbReEncryptEncryptionSegment

INT64 __fastcall WbReEncryptEncryptionSegment(INT64 a1, struct wil_details_FeatureReportingCache *a2, UINT64 a3){
  int InitializedEncryptionSegment; 
  _ETHREAD *CurrentThread; 
  UINT64 *v5; 
  _BYTE *v6; 
  struct wil_details_FeatureReportingCache *v7; 
  INT64 v8; 
  INT64 v9; 
  _BYTE *v10; 
  char v11; 
  INT64 v13; 
  v13 = 0i64;
  if( (unsigned int)a3 < 0x10 )
  {
    InitializedEncryptionSegment = -1073741811;
  }
  else
  {
    InitializedEncryptionSegment = WbGetInitializedEncryptionSegment(a1, a2, a3, (volatile INT64 **)&v13);
    if( InitializedEncryptionSegment >= 0 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 243);
      v5 = (UINT64 *)(v13 + 8);
      LODWORD(v6) = KeAbPreAcquire((PVOID)(v13 + 8), 0i64, 0i64);
      v10 = v6;
      if( _interlockedbittestandset64((volatile signed __int32 *)v5, 0i64) )
        ExfAcquirePushLockExclusiveEx(v5, v6, v5);
      if( v10 )
        v10[26] |= 1u;
      InitializedEncryptionSegment = WbReEncryptWarbirdEncryptionSegment(v13, v7, v8, v9);
      v11 = _InterlockedExchangeAdd64((volatile signed __int64 *)v5, 0xFFFFFFFFFFFFFFFFui64);
      if( (v11 & 2) != 0 && (v11 & 4) == 0 )
        ExfTryToWakePushLock((volatile INT64 *)v5);
      KeAbPostRelease(v5);
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
  }
  sub_1405D2184((volatile INT64 *)v13);
  return(unsigned int)InitializedEncryptionSegment;
}

Referenced by:

WbDispatchOperation