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.