ST_STORE::StGetStatsWorker

__int64 __fastcall ST_STORE::StGetStatsWorker(__int64 a1, int a2, __int64 a3, unsigned int *a4){
  size_t v4; 
  unsigned int v8; 
  int v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  NTSTATUS v14; 
  __int64 v15; 
  _DWORD *v16; 
  unsigned __int64 v17; 
  NTSTATUS v18; 
  __int64 v19; 
  _DWORD *v20; 
  unsigned __int64 v21; 
  __int64 result; 
  int v23; 
  unsigned int v24; 
  __int64 v25; 
  _WORD *v26; 
  unsigned __int64 v27; 
  _WORD *v28; 
  int v29; 
  unsigned __int64 v30; 
  unsigned int v31; 
  unsigned int v32; 
  __int64 v33; 
  unsigned int *v34; 

  v34 = a4;
  v33 = 0i64;
  v4 = 0;
  if( a2 >= 4 )
    return 3221225485i64;
  if( a2 )
  {
    switch( a2 )
    {
      case 1:
        v8 = 1536;
        break;
      case 2:
        v8 = ((a3 + 1537) & 0xFFFFFFFE) + 4 * *(_DWORD *)(a1 + 12) - a3;
        break;
      case 3:
        v23 = *(_DWORD *)(a1 + 12);
        v24 = *(_DWORD *)(a1 + 888) + 1;
        if( v24 > 0x200 )
          v24 = 512;
        v4 = v23 * ((v24 + 7) >> 3);
        v8 = v4 + ((((a3 + 1537) & 0xFFFFFFFE) + 4 * v23 + 7) & 0xFFFFFFF8) - a3 + 12;
        break;
      default:
        v8 = -1;
        break;
    }
  }
  else
  {
    v8 = 188;
  }
  if( *a4 < v8 )
  {
    *a4 = v8;
    return 3221225507i64;
  }
  else
  {
    *(_BYTE *)a3 = 11;
    *(_DWORD *)a3 ^= (*(_DWORD *)a3 ^ (a2 << 8)) & 0xF00;
    v9 = *(_DWORD *)a3 ^ ((unsigned __int16)*(_DWORD *)a3 ^ (unsigned __int16)((unsigned __int16)*(_DWORD *)a1 << 12)) & 0xF000;
    *(_DWORD *)a3 = v9;
    v10 = v9 ^ (v9 ^ (*(_DWORD *)a1 << 8)) & 0x10000;
    *(_DWORD *)a3 = v10;
    v11 = v10 ^ (v10 ^ (*(_DWORD *)a1 << 7)) & 0x20000;
    *(_DWORD *)a3 = v11;
    v12 = v11 ^ (v11 ^ (*(_DWORD *)(a1 + 4088) << 21)) & 0x3FFC0000;
    *(_DWORD *)a3 = v12;
    v13 = v12 ^ (*(_DWORD *)(a1 + 856) << 12);
    *(_DWORD *)(a3 + 4) = v8;
    *(_DWORD *)a3 = v12 ^ v13 & 0x40000000;
    *(_WORD *)(a3 + 8) = *(_WORD *)(a1 + 4032);
    *(_DWORD *)(a3 + 12) = *(_DWORD *)(a1 + 8);
    *(_DWORD *)(a3 + 16) = *(_DWORD *)(a1 + 936) + *(_DWORD *)(a1 + 2872);
    *(_DWORD *)(a3 + 20) = *(_DWORD *)(a1 + 12);
    *(_DWORD *)(a3 + 24) = 16;
    memset((VOID *)(a3 + 28), 0i64, 0x50u);
    *(_DWORD *)(a3 + 28) = *(_DWORD *)(a1 + 936);
    *(_DWORD *)(a3 + 32) = *(_DWORD *)(a1 + 88);
    *(_DWORD *)(a3 + 36) = *(_DWORD *)(a1 + 152);
    v14 = RtlNumberOfSetBits((UINT64 *)(a1 + 920));
    v15 = a1 + 80 - (a3 + 28);
    *(_DWORD *)(a3 + 40) = *(_DWORD *)(a1 + 920) - v14;
    v16 = (_DWORD *)(a3 + 44);
    v17 = (-(__int64)((unsigned __int8)*(_DWORD *)(a1 + 856) != 0) & 0xFFFFFFFFFFFFFFF9ui64) + 8;
    do
    {
      *v16 = *(_DWORD *)((char *)v16 + v15 + 1808);
      v16[1] = *(_DWORD *)((char *)v16 + v15 + 1812);
      v16 += 2;
      --v17;
    }
    while( v17 );
    memset((VOID *)(a3 + 108), 0i64, 0x50u);
    *(_DWORD *)(a3 + 108) = *(_DWORD *)(a1 + 2872);
    *(_DWORD *)(a3 + 112) = *(_DWORD *)(a1 + 2024);
    v18 = RtlNumberOfSetBits((UINT64 *)(a1 + 2856));
    v19 = a1 + 2016 - (a3 + 108);
    *(_DWORD *)(a3 + 120) = *(_DWORD *)(a1 + 2856) - v18;
    v20 = (_DWORD *)(a3 + 124);
    v21 = (-(__int64)((unsigned __int8)*(_DWORD *)(a1 + 2792) != 0) & 0xFFFFFFFFFFFFFFF9ui64) + 8;
    do
    {
      *v20 = *(_DWORD *)((char *)v20 + v19 + 1808);
      v20[1] = *(_DWORD *)((char *)v20 + v19 + 1812);
      v20 += 2;
      --v21;
    }
    while( v21 );
    if( !a2 )
      goto LABEL_10;
    ST_STORE::StCopyIoStats((unsigned int *)(a3 + 188), a1 + 4280);
    StLcBucketsCopy((unsigned int *)(a3 + 1472), v25, *(_QWORD **)(a1 + 5600), *(_DWORD *)(a1 + 5592));
    if( a2 == 1 )
      goto LABEL_10;
    v26 = *(_WORD **)(a1 + 56);
    v27 = (a3 + 1537) & 0xFFFFFFFFFFFFFFFEui64;
    v28 = &v26[*(unsigned int *)(a1 + 12)];
    while( v26 < v28 )
    {
      *(_WORD *)v27 = *v26 & 0x1FFF;
      if( *(_BYTE *)(a1 + 856) )
        LOBYTE(v29) = 0;
      else
        v29 = (unsigned __int16)*v26 >> 13;
      ++v26;
      *(_BYTE *)(v27 + 2) = v29;
      v27 += 4i64;
    }
    if( a2 == 2 )
      goto LABEL_10;
    v30 = (((a3 + 1537) & 0xFFFFFFFFFFFFFFFEui64) + 4i64 * *(unsigned int *)(a3 + 20) + 7) & 0xFFFFFFFFFFFFFFF8ui64;
    memset((VOID *)(v30 + 12), 0i64, v4);
    v31 = *(_DWORD *)(a1 + 8) >> 9;
    if( v31 <= 0x10 )
      v31 = 16;
    *(_DWORD *)(v30 + 8) = v31;
    v32 = v31 >> 4;
    result = ST_STORE::StDmGetStatsBitmap(a1 + 80, v32, v30 + 12, &v33);
    if( (int)result >= 0 )
    {
      *(_QWORD *)v30 = v33;
      result = ST_STORE::StDmGetStatsBitmap(a1 + 2016, v32, v30 + 12, &v33);
      if( (int)result >= 0 )
      {
LABEL_10:
        *v34 = v8;
        return 0i64;
      }
    }
  }
  return result;
}

Referenced by:

No references.