RtlpCSparseBitmapPageDecommit

INT64 __fastcall RtlpCSparseBitmapPageDecommit(INT64 a1, UINT64 rdx0, INT64 r8_0){
  int v3; 
  const signed __int64 *v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  const signed __int64 *v10; 
  const signed __int64 *v11; 
  signed __int64 v12; 
  const signed __int64 *v13; 
  _BOOL8 v14; 
  unsigned __int64 v15; 
  __int64 v17; 
  const signed __int64 *v18; 
  const signed __int64 *v19; 
  signed __int64 v20; 
  bool j; 
  bool v22; 
  bool v23; 
  char v24; 
  INT64 v25; 
  signed __int32 v26[10]; 
  const signed __int64 *i; 
  unsigned __int64 v28; 
  const signed __int64 *v29; 
  __int64 a2; 
  UINT64 v31; 
  UINT64 v32[3]; 
  INT64 v33; 
  INT64 a3[2]; 
  __int128 v35; 
  UINT8 v36[16]; 
  __int64 v37[9]; 
  int v38; 
  v3 = r8_0;
  v33 = a1;
  a2 = 0i64;
  v32[0] = 0i64;
  v31 = 0i64;
  *(_OWORD *)a3 = 0i64;
  v38 = 0;
  v6 = *(const signed __int64 **)(a1 + 8);
  v28 = *(_QWORD *)(a1 + 16);
  v29 = v6;
  v7 = rdx0 << 15;
  v32[1] = rdx0 << 15;
  v8 = 0x8000i64;
  v9 = v28 - (rdx0 << 15);
  if( v9 <= 0x8000 )
    v8 = v9;
  v32[2] = v8;
  v35 = *(_OWORD *)RtlCSparseBitmapEnterLockingRegion(v37, a1);
  while( 1 )
  {
    if( v3 )
      goto LABEL_23;
    i = 0i64;
    if( v7 >= v28 )
    {
LABEL_14:
      LODWORD(v14) = 0;
      goto LABEL_20;
    }
    if( v8 <= 1 )
    {
      if( v8 != 1 )
        goto LABEL_14;
      v14 = !_bittest64(v29, v7);
    }
    else
    {
      if( v28 - v7 < v8 )
        goto LABEL_14;
      v10 = &v29[v7 >> 6];
      i = v10;
      v11 = &v29[(v8 + v7 - 1) >> 6];
      v12 = *v10;
      if( v10 == v11 )
      {
        v15 = 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v8) << v7;
      }
      else
      {
        if( (v12 & (-1i64 << v7)) != 0 )
          goto LABEL_14;
        v13 = v10 + 1;
        for( i = v13; ; i = v13 )
        {
          v12 = *v13;
          if( v13 == v11 )
            break;
          if( v12 )
            goto LABEL_14;
          ++v13;
        }
        v15 = 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v8 + (unsigned __int8)v7 - 1);
      }
      LODWORD(v14) = (v12 & v15) == 0;
    }
LABEL_20:
    v26[8] = v14;
    if( !v14 )
      goto LABEL_21;
LABEL_23:
    RtlpCSparseBitmapLock(a1, 1i64, (INT64)a3);
    a2 = *(_QWORD *)(a1 + 32);
    v17 = v33;
    if( a2 == -1 )
      break;
    RtlpCSparseBitmapUnlock(a3);
    RtlpCSparseBitmapWaitOnAddress((_QWORD *)(v17 + 32), &a2, v25, a1);
    if( !_bittest64(*(const signed __int64 **)a1, rdx0) )
      goto LABEL_21;
    v3 = 0;
  }
  *(_QWORD *)(v33 + 32) = rdx0;
  RtlpCSparseBitmapUnlock(a3);
  v38 = 1;
  if( !_bittest64(*(const signed __int64 **)a1, rdx0) || v7 >= v28 )
    goto LABEL_21;
  if( v8 <= 1 )
  {
    if( v8 != 1 )
      goto LABEL_21;
    if( !_bittest64(v29, v7) )
      goto LABEL_36;
    v23 = 0;
LABEL_35:
    if( !v23 )
      goto LABEL_21;
LABEL_36:
    _interlockedbittestandreset64(*(volatile signed __int32 **)a1, rdx0);
    v32[0] = *(_QWORD *)(a1 + 8) + (rdx0 << 12);
    v31 = 4096i64;
    RtlpHpEnvFreeVA(v32, &v31, 1073758208i64);
    goto LABEL_21;
  }
  if( v28 - v7 < v8 )
    goto LABEL_21;
  v18 = &v29[v7 >> 6];
  v19 = &v29[(v8 + v7 - 1) >> 6];
  v20 = *v18;
  if( v18 == v19 )
  {
    v22 = (v20 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v8) << v7)) == 0;
LABEL_34:
    v23 = v22;
    goto LABEL_35;
  }
  for( j = (v20 & (-1i64 << v7)) == 0; j; j = *v18 == 0 )
  {
    if( ++v18 == v19 )
    {
      v22 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v8 + (unsigned __int8)v7 - 1)) & *v18) == 0;
      goto LABEL_34;
    }
  }
LABEL_21:
  if( v38 )
  {
    *(_QWORD *)(a1 + 32) = -1i64;
    v24 = *(_BYTE *)(a1 + 48);
    _InterlockedOr(v26, 0);
    if( !v24 )
    {
      if( *(_QWORD *)(a1 + 40) )
        ExpUnblockPushLock((_EX_PUSH_LOCK *)(a1 + 40), 0i64, 0i64);
    }
  }
  *(_OWORD *)v36 = v35;
  return RtlCSparseBitmapLeaveLockingRegion(v36);
}

Referenced by:

RtlCSparseBitmapBitsClear