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