RtlpLookupUserFunctionTable
UINT64 __stdcall RtlpLookupUserFunctionTable(PVOID EndingAddress, INT64 a2){
INT64 v2;
INT64 v3;
IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *v6;
_ETHREAD *CurrentThread;
__int64 v9;
INT64 *v10;
_DWORD *v11;
int v12;
void *v13;
unsigned int v14;
int v15;
unsigned __int64 v16;
int v17;
unsigned int v18;
int v19;
int v20;
UINT64 v21;
IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *v22;
__int64 v23;
unsigned __int64 v24;
IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *FunctionTable;
UINT64 a6[2];
unsigned __int64 v27;
PVOID v28;
void *a2a;
__int64 v30[13];
INT64 a4;
a2a = 0i64;
LODWORD(a4) = 0;
v30[0] = 0i64;
v6 = RtlpLookupUserFunctionTableInverted(
EndingAddress,
(_INVERTED_FUNCTION_TABLE_ENTRY *)a2,
v2,
v3,
(INT64)FunctionTable,
0i64,
0i64,
0i64);
FunctionTable = v6;
if( !v6 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = *((_QWORD *)CurrentThread + 68);
if( *(_QWORD *)(v9 + 2120) )
{
--*((_WORD *)CurrentThread + 243);
v10 = (INT64 *)(v9 + 2128);
ExAcquirePushLockSharedEx(v9 + 2128, 0i64);
v11 = *(_DWORD **)(v9 + 2120);
if( v11 )
{
v12 = 1;
if( *v11 != 1 )
{
if( (KiSpeculationFeatures & 0x2000000) != 0 )
{
v18 = dword_140C4C9F0;
v19 = 4096;
}
else
{
v18 = 0;
v19 = 0;
}
v20 = *v11 - 1;
while( 1 )
{
while( 1 )
{
if( v20 < v12 )
goto LABEL_6;
v15 = (v12 + v20) >> 1;
v28 = *(PVOID *)&v11[6 * v15 + 6];
v16 = (unsigned __int64)v28 + (unsigned int)v11[6 * v15 + 8];
if( EndingAddress >= v28 )
break;
if( !v15 )
goto LABEL_6;
v20 = v15 - 1;
}
if( (unsigned __int64)EndingAddress > 0x7FFFFFFEFFFFi64
&& v19
&& (unsigned __int64)EndingAddress >= v16 + v18
&& (unsigned __int64)EndingAddress < v16 + v19 + v18
&& v28 != (PVOID)PsNtosImageBase
&& v28 != PsHalImageBase )
{
break;
}
if( (unsigned __int64)EndingAddress < v16 )
{
*(_OWORD *)a6 = *(_OWORD *)&v11[6 * v15 + 4];
v27 = *(_QWORD *)&v11[6 * v15 + 8];
v19 = v27;
v21 = a6[1];
goto LABEL_40;
}
v12 = v15 + 1;
}
a6[0] = (UINT64)RtlRetpolineStubsFunctionTable;
v21 = v16 + v18;
a6[1] = v21;
v27 = __PAIR64__(RtlRetpolineStubsFunctionTableSize, v19);
LABEL_40:
*(_QWORD *)(a2 + 8) = v21;
*(_DWORD *)(a2 + 16) = v19;
if( _InterlockedCompareExchange64(v10, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v10);
KeAbPostRelease(v10);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
v22 = *(IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY **)(a6[0] + 16);
FunctionTable = v22;
*(_QWORD *)a2 = v22;
v23 = (unsigned int)(12 * *(_DWORD *)(a6[0] + 84));
*(_DWORD *)(a2 + 20) = v23;
if( (_DWORD)v23 )
{
if( ((unsigned __int8)v22 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v24 = (unsigned __int64)v22 + v23;
if( v24 > 0x7FFFFFFF0000i64 || v24 < (unsigned __int64)v22 )
MEMORY[0x7FFFFFFF0000] = 0;
}
return(UINT64)FunctionTable;
}
}
LABEL_6:
if( _InterlockedCompareExchange64(v10, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v10);
KeAbPostRelease(v10);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( (int)MmGetImageInformation((UINT64)EndingAddress, &a2a, v30, &a4) < 0 )
{
v13 = 0i64;
v17 = 0;
v6 = FunctionTable;
}
else
{
v13 = a2a;
RtlCaptureImageExceptionValues(a2a, &FunctionTable, (UINT64 *)(a2 + 20));
v6 = FunctionTable;
if( FunctionTable )
{
v14 = *(_DWORD *)(a2 + 20);
if( v14 && v14 == 12 * (v14 / 0xCui64) )
{
if( ((unsigned __int8)FunctionTable & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)FunctionTable + v14 > 0x7FFFFFFF0000i64
|| (IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY *)((char *)FunctionTable + v14) < FunctionTable )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
v6 = 0i64;
FunctionTable = 0i64;
}
}
v17 = v30[0];
}
*(_QWORD *)(a2 + 8) = v13;
*(_DWORD *)(a2 + 16) = v17;
*(_QWORD *)a2 = v6;
if( !v6 )
*(_DWORD *)(a2 + 20) = 0;
}
return(UINT64)v6;
}Referenced by:
RtlpLookupFunctionEntryForStackWalks