WbDecryptEncryptionSegment

NTSTATUS __stdcall WbDecryptEncryptionSegment(INT64 a1, wil_details_FeatureReportingCache *a2, UINT64 a3){
  int InitializedEncryptionSegment; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v5; 
  _BYTE *v6; 
  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, (INT64 **)&v13);
    if( InitializedEncryptionSegment >= 0 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.SpecialApcDisable;
      v5 = (_EX_PUSH_LOCK *)(v13 + 8);
      v6 = KeAbPreAcquire((VOID *)(v13 + 8), 0i64, 0i64);
      v10 = v6;
      if( _interlockedbittestandset64((volatile signed __int32 *)v5, 0i64) )
        ExfAcquirePushLockExclusiveEx(v5, v6, v5);
      if( v10 )
        v10[26] |= 1u;
      InitializedEncryptionSegment = WbDecryptWarbirdEncryptionSegment(v13, v7, v8, v9);
      v11 = _InterlockedExchangeAdd64(&v5->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
      if( (v11 & 2) != 0 && (v11 & 4) == 0 )
        ExfTryToWakePushLock(v5);
      KeAbPostRelease(v5);
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
  }
  sub_1405D2184((volatile signed __int64 *)v13);
  return InitializedEncryptionSegment;
}

Referenced by:

WbDispatchOperation