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