MiDbgTranslatePhysicalAddress

__int64 __fastcall MiDbgTranslatePhysicalAddress(unsigned __int64 a1, char a2, __int64 a3){
  UINT64 v3; 
  __int16 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  unsigned int v10; 
  unsigned __int8 CurrentIrql; 
  volatile signed __int32 *v12; 
  unsigned int ProtectionPfnCompatible; 
  _QWORD *v14; 
  int v15; 
  unsigned __int64 v16; 
  _QWORD *v17; 
  RTL_BALANCED_NODE *v18; 
  unsigned __int64 ParentValue; 
  char v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  INT64 v25; 
  volatile signed __int64 *v26; 
  signed __int64 ValidPte; 
  UINT64 SpinCount[7]; 
  v3 = qword_140C4E5C8;
  v6 = a1;
  if( !qword_140C4E5C8 || !(unsigned int)MiCheckPhysicalAddressRange((LARGE_INTEGER)a1, 1ui64) )
    return 0i64;
  v8 = (__int64)((v3 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  v9 = v7 >> 12;
  *(_DWORD *)a3 = 0;
  v10 = (a2 & 1) != 0 ? 4 : 1;
  if( (a2 & 4) != 0 )
  {
    CurrentIrql = 17;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
  }
  *(_BYTE *)(a3 + 4) = CurrentIrql;
  if( v9 <= 0xFFFFFFFFFi64 && (*((_QWORD *)MmGetPfnDb() + 6 * v9 + 5) & 0x4000000000000i64) != 0 )
  {
    v12 = (volatile signed __int32 *)((char *)MmGetPfnDb() + 48 * v9);
    if( (a2 & 4) != 0 )
    {
      *(_DWORD *)a3 = 1;
      if( _interlockedbittestandset64(v12 + 6, 0x3Fui64) )
      {
        if( (a2 & 0x41) != 0 || (KiBugCheckActive & 3) == 0 )
          return 0i64;
        ++dword_140C4E5D0;
        *(_DWORD *)a3 = 4;
      }
    }
    else
    {
      LODWORD(SpinCount[0]) = 0;
      *(_DWORD *)a3 = 2;
      while( _interlockedbittestandset64(v12 + 6, 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(SpinCount);
        while( *((__int64 *)v12 + 3) < 0 );
      }
    }
    *(_QWORD *)(a3 + 8) = v12;
    ProtectionPfnCompatible = MiMakeProtectionPfnCompatible(v10, (_MMPFN *)v12);
    v10 = ProtectionPfnCompatible | 8;
    if( (*((_BYTE *)v12 + 34) & 0xC0) != 0xC0 )
      v10 = ProtectionPfnCompatible;
    goto LABEL_64;
  }
  if( (a2 & 4) != 0 )
  {
    *(_DWORD *)a3 = 8;
    if( !(unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&dword_140C4E980) )
      return 0i64;
  }
  else
  {
    *(_DWORD *)a3 = 16;
    ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&dword_140C4E980);
  }
  v14 = (_QWORD *)*((_QWORD *)&xmmword_140C4E988 + 1);
  v15 = 3;
  while( v14 )
  {
    v16 = v14[5];
    if( v9 < v16 )
    {
      v14 = (_QWORD *)*v14;
    }
    else
    {
      if( v9 < v16 + 512 )
        break;
      v14 = (_QWORD *)v14[1];
    }
  }
  if( !v14 )
    goto LABEL_33;
  v17 = 0i64;
  v15 = *(unsigned __int16 *)(v14[6] + 2 * ((v9 & 0xFFFFFFFFFi64) - v14[5])) >> 14;
  if( v15 != 3 )
    v17 = v14;
  if( !v17 )
  {
LABEL_33:
    v18 = qword_140C4E998;
    while( v18 )
    {
      ParentValue = v18[1].ParentValue;
      if( v9 < ParentValue )
      {
        v18 = v18->Children[0];
      }
      else
      {
        if( v9 < ParentValue + 512 )
        {
          v15 = *((unsigned __int16 *)v18[2].Children[0]->Children + (v9 & 0xFFFFFFFFFi64) - ParentValue) >> 14;
          break;
        }
        v18 = v18->Children[1];
      }
    }
  }
  if( v15 == 3 )
  {
    v15 = 0;
    if( (a2 & 4) == 0 )
      v15 = 3;
    if( (a2 & 0x28) == 0 )
      goto LABEL_47;
    v20 = a2 & 0xD7;
  }
  else
  {
    v20 = a2 & 0xC7;
    if( v15 )
    {
      if( v15 == 2 )
        a2 = v20 | 0x20;
      else
        a2 = v20 | 8;
      goto LABEL_47;
    }
  }
  a2 = v20 | 0x10;
LABEL_47:
  if( (a2 & 8) == 0 )
  {
    if( (a2 & 0x10) != 0 )
    {
      v21 = __readcr4();
      if( (v21 & 0x20080) != 0 )
      {
        __writecr4(v21 ^ 0x80);
        __writecr4(v21);
      }
      else
      {
        v22 = __readcr3();
        __writecr3(v22);
      }
      v10 |= 8u;
    }
    else
    {
      if( (a2 & 0x20) == 0 )
      {
LABEL_71:
        MiDbgUnTranslatePhysicalAddress((int *)a3);
        return 0i64;
      }
      v23 = __readcr4();
      if( (v23 & 0x20080) != 0 )
      {
        __writecr4(v23 ^ 0x80);
        __writecr4(v23);
      }
      else
      {
        v24 = __readcr3();
        __writecr3(v24);
      }
      v10 |= 0x18u;
    }
  }
  if( v15 == 3 )
    ++dword_140C4E5D0;
LABEL_64:
  v25 = v10 | 0xA0000000;
  v26 = (volatile signed __int64 *)qword_140C4E5C8;
  ValidPte = MiMakeValidPte(qword_140C4E5C8, v9, v25);
  if( (a2 & 0x41) != 0 )
    byte_140C4E5C0 = 1;
  if( _InterlockedCompareExchange64(v26, ValidPte, 0i64) )
    goto LABEL_71;
  *(_DWORD *)a3 |= 0x20u;
  if( (*(_DWORD *)a3 & 0x12) != 0 )
    KeFlushSingleTb(v8, 0i64, 1i64);
  else
    KeFlushSingleCurrentTb((PVOID)v8);
  return v8 + (v6 & 0xFFF);
}

Referenced by:

MiDbgCopyMemory