RtlZeroHeap

INT64 __stdcall RtlZeroHeap(PVOID HeapHandle, UINT64 Flags){
  _BYTE *v3; 
  char *v5; 
  char *v6; 
  UINT64 v7; 
  unsigned __int8 v8; 
  UINT64 v9; 
  INT64 v10; 
  INT64 *v11; 
  INT64 v12; 
  INT64 v13; 
  INT64 v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 
  int v17; 
  unsigned __int64 v18; 
  __int64 **v19; 
  __int64 *Entry; 
  int v21; 
  unsigned __int16 v22; 
  __int64 **v23; 
  INT64 *v24; 
  INT64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  int v28; 
  unsigned __int64 v29; 
  _DWORD *v30; 
  unsigned __int64 v31; 
  unsigned __int64 v32; 
  UINT64 v33; 
  char v34; 
  UINT64 v35; 
  UINT64 v36; 
  int v37; 
  v3 = 0i64;
  v34 = 0;
  if( *((_DWORD *)HeapHandle + 4) == -571548178 )
    return 0i64;
  if( ((*((_BYTE *)HeapHandle + 116) | (unsigned __int8)Flags) & 1) == 0 )
  {
    ExAcquireResourceExclusiveLite(*((ERESOURCE **)HeapHandle + 44), 1u);
    v34 = 1;
  }
  v5 = (char *)HeapHandle + 288;
  v6 = (char *)*((_QWORD *)HeapHandle + 36);
LABEL_6:
  if( v6 != v5 )
  {
    v7 = *((_QWORD *)v6 + 5);
    v35 = v7;
    while( 1 )
    {
      if( v7 >= *((_QWORD *)v6 + 6) )
      {
        v6 = *(char **)v6;
        v5 = (char *)HeapHandle + 288;
        goto LABEL_6;
      }
      if( !v3 )
        goto LABEL_12;
      if( *((_DWORD *)HeapHandle + 31) )
        break;
LABEL_15:
      v3 = (_BYTE *)v7;
      v8 = *(_BYTE *)(v7 + 10);
      if( (v8 & 1) != 0 )
        goto LABEL_66;
      v9 = v7;
      v36 = v7;
      if( (v8 & 8) != 0 )
      {
        v10 = *(_QWORD *)(v7 + 16);
        v11 = *(INT64 **)(v7 + 24);
        v12 = *v11;
        v13 = *(_QWORD *)(v10 + 8);
        if( *v11 == v13 && v12 == v7 + 16 )
        {
          *((_QWORD *)HeapHandle + 24) -= *(unsigned __int16 *)(v7 + 8);
          v14 = *((_QWORD *)HeapHandle + 39);
          if( v14 )
          {
            v15 = *(unsigned __int16 *)(v7 + 8);
            while( 1 )
            {
              v16 = *(unsigned int *)(v14 + 8);
              if( v15 < v16 )
              {
                v17 = *(unsigned __int16 *)(v7 + 8);
                goto LABEL_25;
              }
              if( !*(_QWORD *)v14 )
                break;
              v14 = *(_QWORD *)v14;
            }
            v17 = v16 - 1;
LABEL_25:
            LODWORD(v33) = v17;
            RtlpHeapRemoveListEntry((INT64)HeapHandle, v14, v15, (INT64 *)(v7 + 16), v33, v15);
          }
          *v11 = v10;
          *(_QWORD *)(v10 + 8) = v11;
          v18 = *(unsigned __int16 *)(v7 + 8);
          *(_BYTE *)(v7 + 10) = 0;
          *(_BYTE *)(v7 + 15) = 0;
          v19 = (__int64 **)((char *)HeapHandle + 336);
          if( *((_QWORD *)HeapHandle + 39) )
            Entry = RtlpFindEntry((__int64)HeapHandle, (unsigned int)v18);
          else
            Entry = *v19;
          while( v19 != (__int64 **)Entry )
          {
            if( *((_DWORD *)HeapHandle + 31) )
            {
              v21 = *((_DWORD *)Entry - 2);
              LOWORD(v37) = v21;
              if( (v21 & *((_DWORD *)HeapHandle + 31)) != 0 )
                v37 = v21 ^ *((_DWORD *)HeapHandle + 34);
              v22 = v37;
              v7 = v35;
              v9 = v36;
            }
            else
            {
              v22 = *((_WORD *)Entry - 4);
            }
            if( v18 <= v22 )
              break;
            Entry = (__int64 *)*Entry;
          }
          v23 = (__int64 **)(v9 + 16);
          v24 = (INT64 *)Entry[1];
          if( (__int64 *)*v24 == Entry )
          {
            *v23 = Entry;
            *(_QWORD *)(v9 + 24) = v24;
            *v24 = (INT64)v23;
            Entry[1] = (__int64)v23;
          }
          else
          {
            RtlpLogHeapFailure(13i64, 0i64, (UINT64)Entry, 0i64, *v24, 0i64);
          }
          *((_QWORD *)HeapHandle + 24) += *(unsigned __int16 *)(v9 + 8);
          v25 = *((_QWORD *)HeapHandle + 39);
          if( v25 )
          {
            v26 = *(unsigned __int16 *)(v9 + 8);
            while( 1 )
            {
              v27 = *(unsigned int *)(v25 + 8);
              if( v26 < v27 )
              {
                v28 = *(unsigned __int16 *)(v9 + 8);
                goto LABEL_47;
              }
              if( !*(_QWORD *)v25 )
                break;
              v25 = *(_QWORD *)v25;
            }
            v28 = v27 - 1;
LABEL_47:
            LODWORD(v33) = v28;
            RtlpHeapAddListEntry((INT64)HeapHandle, v25, v26, v9 + 16, v33, v26);
          }
          if( *((_DWORD *)HeapHandle + 31) )
          {
            *(_BYTE *)(v9 + 11) = *(_BYTE *)(v9 + 8) ^ *(_BYTE *)(v9 + 9) ^ *(_BYTE *)(v9 + 10);
            *(_DWORD *)(v9 + 8) ^= *((_DWORD *)HeapHandle + 34);
          }
        }
        else
        {
          RtlpLogHeapFailure(13i64, (INT64)HeapHandle, v7 + 16, v13, v12, 0i64);
        }
        v3 = 0i64;
      }
      else
      {
        v29 = 16i64 * *(unsigned __int16 *)(v7 + 8) - 32;
        v30 = (_DWORD *)(v7 + 32);
        if( ((v8 >> 2) & ((*((_BYTE *)HeapHandle + 112) & 0x40) != 0)) != 0 )
        {
          v31 = v29 >> 2;
          if( !v31 )
            goto LABEL_66;
          if( ((unsigned __int8)v30 & 4) != 0 )
          {
            *v30 = -17891602;
            if( !--v31 )
              goto LABEL_66;
            v30 = (_DWORD *)(v7 + 36);
          }
          memset64(v30, 0xFEEEFEEEFEEEFEEEui64, v31 >> 1);
          if( (v31 & 1) != 0 )
            v30[v31 - 1] = -17891602;
        }
        else
        {
          v32 = v29 >> 2;
          if( !v32 )
            goto LABEL_66;
          if( ((unsigned __int8)v30 & 4) != 0 )
          {
            *v30 = 0;
            if( !--v32 )
              goto LABEL_66;
            v30 = (_DWORD *)(v7 + 36);
          }
          memset(v30, 0, 8 * (v32 >> 1));
          if( (v32 & 1) != 0 )
            v30[v32 - 1] = 0;
        }
LABEL_66:
        if( *(_BYTE *)(v7 + 15) == 3 )
          v7 += *(_QWORD *)(v7 + 56) + 64i64;
        else
          v7 += 16i64 * *(unsigned __int16 *)(v7 + 8);
        v35 = v7;
      }
    }
    v3[11] = v3[8] ^ v3[9] ^ v3[10];
    *((_DWORD *)v3 + 2) ^= *((_DWORD *)HeapHandle + 34);
LABEL_12:
    if( *((_DWORD *)HeapHandle + 31) )
    {
      *(_DWORD *)(v7 + 8) ^= *((_DWORD *)HeapHandle + 34);
      if( *(_BYTE *)(v7 + 11) != (*(_BYTE *)(v7 + 8) ^ (unsigned __int8)(*(_BYTE *)(v7 + 9) ^ *(_BYTE *)(v7 + 10))) )
        RtlpAnalyzeHeapFailure((INT64)HeapHandle, v7);
    }
    goto LABEL_15;
  }
  if( v3 && *((_DWORD *)HeapHandle + 31) )
  {
    v3[11] = v3[8] ^ v3[9] ^ v3[10];
    *((_DWORD *)v3 + 2) ^= *((_DWORD *)HeapHandle + 34);
  }
  if( v34 )
    ExReleaseResourceLite(*((PERESOURCE *)HeapHandle + 44));
  return 0i64;
}

Referenced by:

No references.