HalpIommuDmarPageTableMarkHiberPhase

NTSTATUS __stdcall HalpIommuDmarPageTableMarkHiberPhase(PVOID MemoryMap){
  __int64 v1; 
  __int64 v2; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  int v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  unsigned int v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  __int64 v13; 
  __int64 v14; 
  unsigned int v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  unsigned int v18; 
  __int64 v19; 
  int v20; 
  unsigned int v21; 
  unsigned int v22; 
  __int64 v23; 
  __int64 v24; 
  UINT64 Tag; 
  __int128 v27[3]; 

  v5 = *(_DWORD *)(v2 + 28);
  v6 = v2;
  LODWORD(v7) = 0;
  v8 = *(_QWORD *)(v2 + 16);
  v9 = 0;
  v10 = v4;
  v11 = v3;
  v27[0] = v8;
  memset(&v27[1], 0, 32);
  if( v4 )
  {
    while( 1 )
    {
      v13 = (unsigned int)(*(_DWORD *)(v6 + 24) - 1);
      if( (unsigned int)v7 < (unsigned int)v13 )
        break;
LABEL_9:
      v18 = *(_DWORD *)(v6 + 4i64 * (unsigned int)v7 + 36);
      if( v18 < 0x40 )
        v19 = (1i64 << v18) - 1;
      else
        LODWORD(v19) = -1;
      v20 = v19 & (v11 >> *(_DWORD *)(v6 + 4i64 * (unsigned int)v7 + 60));
      LODWORD(Tag) = 1953259880;
      v21 = (1 << *(_DWORD *)(v6 + 4 * v13 + 36)) - v20;
      if( (unsigned int)v10 - v9 <= v21 )
        v21 = v10 - v9;
      v22 = v21;
      PoSetHiberRange(MemoryMap, 2ui64, (VOID *)(v8 + (unsigned int)(v20 << v5)), v21 << v5, Tag);
      v9 += v22;
      if( (_DWORD)v7 )
      {
        do
        {
          v23 = (unsigned int)(v7 - 1);
          v24 = 1i64 << *(_DWORD *)(v6 + 4 * v23 + 60);
          if( (v24 & (v11 + ((unsigned __int64)v22 << 12))) == (v24 & v11) )
            break;
          LODWORD(v7) = v7 - 1;
        }
        while( (_DWORD)v23 );
      }
      v11 += (unsigned __int64)v22 << 12;
      v8 = *((_QWORD *)v27 + (unsigned int)v7);
      LODWORD(v1) = v9;
      if( v9 >= v10 )
        return v1;
    }
    v14 = (unsigned int)v7;
    while( 1 )
    {
      v15 = *(_DWORD *)(v6 + 4 * v14 + 36);
      v16 = v8 + (1 << v15 << v5);
      if( v15 < 0x40 )
        v17 = (1i64 << v15) - 1;
      else
        LODWORD(v17) = -1;
      v1 = (unsigned int)v17 & (unsigned int)(v11 >> *(_DWORD *)(v6 + 4 * v14 + 60));
      v8 = *(_QWORD *)(v16 + 8 * v1);
      if( !v8 )
        break;
      v7 = (unsigned int)(v7 + 1);
      v14 = (unsigned int)v7;
      *((_QWORD *)v27 + v7) = v8;
      if( (unsigned int)v7 >= (unsigned int)v13 )
        goto LABEL_9;
    }
  }
  return v1;
}

Referenced by:

HalpDmaMarkHiberAdapter