HalpDmaMarkHiberAdapter
INT64 __stdcall HalpDmaMarkHiberAdapter(){
INT64 result;
void *v1;
void *v2;
__int64 j;
unsigned int *v4;
_QWORD **v5;
_QWORD *v6;
unsigned int v7;
unsigned int i;
_QWORD *v9;
__int64 v10;
unsigned int k;
unsigned int v12;
_QWORD *v13;
__int64 v14;
unsigned int *v15;
__int64 *m;
__int64 *v17;
__int64 *v18;
_QWORD *v19;
unsigned int v20;
unsigned int *v21;
INT64 n;
unsigned int ii;
__int64 v24;
VOID *v25;
UINT64 Tag;
UINT64 Taga;
INT64 v28;
INT64 v29;
v2 = v1;
if( v1 )
{
if( HalpDmaHibernateAdapter )
{
for( i = 0; i < HalpDmaHibernateRegisterSetIndex; ++i )
{
v9 = (_QWORD *)HalpDmaHibernateRegisterSets[2 * i];
v10 = LODWORD(HalpDmaHibernateRegisterSets[2 * i + 1]);
result = (INT64)HalpDmaHibernateAdapter;
if( *((_DWORD *)HalpDmaHibernateAdapter + 128) && !HalpHvIommu )
LODWORD(result) = HalpIommuDmarPageTableMarkHiberPhase(v2);
if( (_DWORD)v10 )
{
do
{
LODWORD(Tag) = 1953259880;
PoSetHiberRange(v2, 2ui64, v9, 0x48ui64, Tag);
v9 = (_QWORD *)v9[1];
--v10;
}
while( v10 );
}
}
}
for( j = HalpDmaHibernateAdapters; (__int64 *)j != &HalpDmaHibernateAdapters; j = *(_QWORD *)j )
{
result = 2i64;
v4 = (unsigned int *)(j - 16);
v28 = 2i64;
v5 = (_QWORD **)(j - 32);
do
{
v6 = *v5;
if( *(_DWORD *)(j + 232) && !HalpHvIommu )
{
HalpIommuDmarPageTableMarkHiberPhase(v2);
result = v28;
}
v7 = 0;
if( *v4 )
{
do
{
LODWORD(Tag) = 1953259880;
PoSetHiberRange(v2, 2ui64, v6, 0x48ui64, Tag);
v6 = (_QWORD *)v6[1];
++v7;
}
while( v7 < *v4 );
result = v28;
}
++v5;
++v4;
v28 = --result;
}
while( result );
}
}
else
{
if( HalpDmaHibernateAdapter )
{
LODWORD(Tag) = 0;
PoSetHiberRange(0i64, 0x10000ui64, HalpDmaHibernateAdapter, 0x280ui64, Tag);
for( k = 0; k < HalpDmaHibernateRegisterSetIndex; ++k )
{
v12 = HalpDmaHibernateRegisterSets[2 * k + 1];
v13 = (_QWORD *)HalpDmaHibernateRegisterSets[2 * k];
if( v12 )
{
v14 = v12;
do
{
LODWORD(Tag) = 1953259880;
PoSetHiberRange(0i64, 0x14000ui64, (VOID *)(*v13 >> 12), 1ui64, Tag);
v13 = (_QWORD *)v13[1];
--v14;
}
while( v14 );
}
}
v15 = (unsigned int *)*((_QWORD *)HalpDmaHibernateAdapter + 37);
if( v15 )
{
LODWORD(Tag) = 1953259880;
PoSetHiberRange(0i64, 0x10000ui64, v15, 8 * (((unsigned __int64)v15[10] + 4095) >> 12) + 48, Tag);
}
}
LODWORD(Tag) = 0;
PoSetHiberRange(0i64, 0x10000ui64, &HalpDmaHibernateAdapters, 0x10ui64, Tag);
for( m = (__int64 *)HalpDmaHibernateAdapters; m != &HalpDmaHibernateAdapters; m = (__int64 *)*m )
{
LODWORD(Taga) = 0;
PoSetHiberRange(0i64, 0x10000ui64, m - 35, 0x280ui64, Taga);
result = 2i64;
v17 = m - 2;
v29 = 2i64;
v18 = m - 4;
do
{
v19 = (_QWORD *)*v18;
v20 = 0;
if( *(_DWORD *)v17 )
{
do
{
LODWORD(Taga) = 1953259880;
PoSetHiberRange(0i64, 0x14000ui64, (VOID *)(*v19 >> 12), 1ui64, Taga);
v19 = (_QWORD *)v19[1];
++v20;
}
while( v20 < *(_DWORD *)v17 );
result = v29;
}
++v18;
v17 = (__int64 *)((char *)v17 + 4);
v29 = --result;
}
while( result );
v21 = (unsigned int *)m[2];
if( v21 )
{
LODWORD(Taga) = 1953259880;
PoSetHiberRange(0i64, 0x10000ui64, v21, 8 * (((unsigned __int64)v21[10] + 4095) >> 12) + 48, Taga);
}
}
for( n = HalpDmaControllers; (INT64 *)n != &HalpDmaControllers; n = *(_QWORD *)n )
{
for( ii = 0; ii < *(_DWORD *)(n + 44); ++ii )
{
result = *(_QWORD *)(n + 56);
v24 = 160i64 * ii;
v25 = *(VOID **)(v24 + result + 128);
if( v25 )
{
LODWORD(Taga) = 1164730696;
PoSetHiberRange(0i64, 0x10000ui64, v25, *(unsigned int *)(v24 + result + 120), Taga);
}
}
}
}
return result;
}Referenced by:
HaliLocateHiberRanges