PspSetupUserShadowStack
NTSTATUS __fastcall PspSetupUserShadowStack(ULONG_PTR BugCheckParameter1, _DWORD *a2, __int64 a3, _BYTE *a4, int a5){
NTSTATUS result;
int v10;
CHAR *ExtendedFeature;
INT64 v12;
INT64 v13;
UINT64 a2a;
INT64 v15;
INT64 a4a;
UINT64 v17;
_KAPC_STATE ApcState;
v15 = 0i64;
v17 = 0i64;
a2a = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
result = RtlCalculateUserShadowStackSizes(a3, &a2a);
if( result >= 0 )
{
KiStackAttachProcess((_KPROCESS *)BugCheckParameter1, 0i64, &ApcState);
a4a = 0i64;
v10 = PspReserveAndCommitUserShadowStack(a2a, v17, (unsigned int)a5, &a4a, &v15);
if( v10 < 0 )
{
v12 = a4a;
}
else
{
if( (a2[12] & 0x100040) == 1048640 )
{
ExtendedFeature = RtlLocateExtendedFeature(a2 + 308, 0xBui64, 0i64);
if( ExtendedFeature )
{
*(_QWORD *)((char *)a2 + a2[312] + 1232) |= 0x800ui64;
*((_QWORD *)ExtendedFeature + 1) = v15;
*(_QWORD *)ExtendedFeature = 1i64;
}
}
*(_QWORD *)(a3 + 64) = a4a;
*a4 |= 8u;
v12 = 0i64;
}
if( v12 )
{
v15 = 0i64;
LODWORD(v13) = 0x40000000;
a2a = v12;
MmFreeVirtualMemory(-1i64, &a2a, &v15, 0x8000i64, 0, v13);
}
KiUnstackDetachProcess(&ApcState, 0i64);
return v10;
}
return result;
}Referenced by:
PspAllocateThread