MiCheckForUserStackOverflow
NTSTATUS __stdcall MiCheckForUserStackOverflow(PVOID FaultingAddress){
int v1;
__int64 v3;
_ETHREAD *CurrentThread;
char v5;
__int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
_DWORD *v10;
ULONG_PTR v11;
char *v12;
NTSTATUS v13;
char *v14;
NTSTATUS result;
__int64 v16;
__int16 v17;
unsigned __int64 v18;
__int64 v19;
ULONG_PTR v20;
void *v21;
UINT64 AllocationType;
UINT64 Protect;
ULONG_PTR RegionSize;
PVOID BaseAddress;
unsigned __int64 v26;
__int64 v27;
NTSTATUS v28;
UINT64 OldAccessProtection;
RegionSize = 0i64;
v28 = 0;
LODWORD(OldAccessProtection) = 0;
v3 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = *((_BYTE *)CurrentThread + 1304);
if( v5 < 0
|| ((unsigned __int8)~(*((_BYTE *)CurrentThread + 1305) >> 6) & ((v5 & 3) == 0)) == 0
|| *((_BYTE *)CurrentThread + 586) == 1 )
{
return -2147483647;
}
if( !v1 && (unsigned int)MiCheckShadowStackOverflow((UINT64)FaultingAddress, &v28) )
return v28;
v6 = *((_QWORD *)CurrentThread + 30);
v7 = *(_QWORD *)(v6 + 8);
v26 = v7;
v27 = *(_QWORD *)(v6 + 5240);
v8 = v27 & 0xFFFFFFFFFFFFF000ui64;
v9 = (*(unsigned int *)(v6 + 5960) + 4095i64) & 0xFFFFFFFFFFFFF000ui64;
RegionSize = v9;
v10 = (_DWORD *)(v6 + 16);
v11 = v9;
if( v9 )
{
v11 = v9 + 4096;
v9 = v11;
RegionSize = v11;
}
if( v11 < 0x3000 )
{
v9 = 12288i64;
RegionSize = 12288i64;
v11 = 12288i64;
}
if( (unsigned __int64)FaultingAddress >= v7 || (unsigned __int64)FaultingAddress < v8 )
{
v16 = *(_QWORD *)(*((_QWORD *)CurrentThread + 23) + 1408i64);
if( v16 )
{
v17 = *(_WORD *)(v16 + 8);
if( v17 == 332 || v17 == 452 )
{
v3 = v6 + 0x2000;
if( (v6 & 3) != 0 )
ExRaiseDatatypeMisalignment();
v18 = *(unsigned int *)(v6 + 8196);
v26 = v18;
v19 = *(unsigned int *)(v6 + 11788);
v27 = v19;
v20 = *(unsigned int *)(v6 + 12152);
RegionSize = v20;
v8 = v19 & 0xFFFFFFFFFFFFF000ui64;
if( (unsigned __int64)FaultingAddress < v18 && (unsigned __int64)FaultingAddress >= v8 )
{
v9 = (v20 + 4095) & 0xFFFFFFFFFFFFF000ui64;
v11 = v9;
RegionSize = v9;
if( v9 )
{
v9 += 4096i64;
RegionSize = v9;
v11 = v9;
}
if( v11 < 0x2000 )
{
v9 = 0x2000i64;
RegionSize = 0x2000i64;
v11 = 0x2000i64;
}
v10 = (_DWORD *)(v6 + 8200);
goto LABEL_12;
}
}
}
return -2147483647;
}
LABEL_12:
v12 = (char *)(((unsigned __int64)FaultingAddress & 0xFFFFFFFFFFFFF000ui64) - v11);
BaseAddress = v12;
if( (unsigned __int64)v12 <= v8 )
{
v21 = (void *)(v8 + 4096);
}
else
{
if( (*(_DWORD *)(*(_QWORD *)(*((_QWORD *)CurrentThread + 23) + 1360i64) + 188i64) & 0x10000) != 0 )
{
v13 = -1073741523;
}
else
{
LODWORD(Protect) = 260;
LODWORD(AllocationType) = 4096;
v13 = ZwAllocateVirtualMemory(
(PVOID)0xFFFFFFFFFFFFFFFFi64,
&BaseAddress,
0i64,
&RegionSize,
AllocationType,
Protect);
v12 = (char *)BaseAddress;
v9 = RegionSize;
}
if( v13 >= 0 )
{
v14 = &v12[v9];
result = 275;
goto LABEL_17;
}
RegionSize = v9 - 4096;
v21 = v12 + 4096;
}
BaseAddress = v21;
ZwProtectVirtualMemory((PVOID)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 4ui64, &OldAccessProtection);
v14 = (char *)BaseAddress;
result = -1073741571;
LABEL_17:
if( v3 )
*v10 = (_DWORD)v14;
else
*(_QWORD *)v10 = v14;
return result;
}Referenced by:
MiUserFault