WbFreeMemoryBlockRegion

NTSTATUS __fastcall WbFreeMemoryBlockRegion(INT64 a1, INT64 a2){
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v5; 
  _BYTE *v6; 
  _BYTE *v7; 
  unsigned __int64 v8; 
  __int64 i; 
  __int64 v10; 
  __int64 j; 
  char v12; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  v5 = (_EX_PUSH_LOCK *)(a1 + 1072);
  v6 = KeAbPreAcquire((VOID *)(a1 + 1072), 0i64, 0i64);
  v7 = v6;
  if( _interlockedbittestandset64((volatile signed __int32 *)v5, 0i64) )
    ExfAcquirePushLockExclusiveEx(v5, v6, v5);
  if( v7 )
    v7[26] |= 1u;
  v8 = (unsigned __int64)(a2 - *(_QWORD *)(a1 + 32)) >> 6;
  if( (_DWORD)v8 )
  {
    for( i = (unsigned int)(v8 - 1); i >= 0; --i )
    {
      if( *(_BYTE *)(i + a1 + 44) != 2 )
        break;
    }
    v10 = i + 1;
  }
  else
  {
    v10 = 0i64;
  }
  for( j = (unsigned int)v8; *(_BYTE *)(j + a1 + 44) == 2; ++j )
    ;
  if( v10 <= j )
    memset((VOID *)(a1 + v10 + 44), 0i64, j - v10 + 1);
  v12 = _InterlockedExchangeAdd64(&v5->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
  if( (v12 & 2) != 0 && (v12 & 4) == 0 )
    ExfTryToWakePushLock(v5);
  KeAbPostRelease(v5);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  return 0;
}

Referenced by:

sub_14065DA88