PspReserveAndCommitUserShadowStack
__int64 __fastcall PspReserveAndCommitUserShadowStack(UINT64 a1, UINT64 a2, unsigned int a3, INT64 *a4, _QWORD *a5){
NTSTATUS v7;
INT64 v8;
NTSTATUS v9;
UINT64 v10;
UINT64 AllocationType;
UINT64 AllocationTypea;
UINT64 Protect;
VOID *BaseAddress;
UINT64 RegionSize;
INT64 v17;
UINT64 v18;
UINT64 v19;
v19 = a1;
RegionSize = 0i64;
BaseAddress = 0i64;
if( a3 > 0x40 || a1 < 0x3000 || (a1 & 0xFFF) != 0 || a2 < 0x1000 || (a2 & 0xFFF) != 0 || a2 > a1 - 0x2000 )
return 3221225485i64;
v17 = 0i64;
v7 = MmAllocateUserStack(&v17, 0i64, &v19, a3, 1);
v8 = v17;
v9 = v7;
if( v7 >= 0 )
{
v10 = v19;
LODWORD(Protect) = 2;
RegionSize = a2;
LODWORD(AllocationType) = 4096;
BaseAddress = (VOID *)(v19 + v17 - a2 - 4096);
v9 = ZwAllocateVirtualMemory(
(VOID *)0xFFFFFFFFFFFFFFFFi64,
&BaseAddress,
0i64,
&RegionSize,
AllocationType,
Protect);
if( v9 >= 0 )
{
if( v10 - a2 - 0x2000 < 0x1000
|| (BaseAddress = (char *)BaseAddress - 4096,
LODWORD(Protect) = 258,
LODWORD(AllocationTypea) = 4096,
RegionSize = 4096i64,
v9 = ZwAllocateVirtualMemory(
(VOID *)0xFFFFFFFFFFFFFFFFi64,
&BaseAddress,
0i64,
&RegionSize,
AllocationTypea,
Protect),
v9 >= 0) )
{
*a5 = v8 + v10 - 4096;
*a4 = v8;
v8 = 0i64;
}
}
}
if( v8 )
{
v17 = 0i64;
LODWORD(Protect) = 0x40000000;
v18 = v8;
MmFreeVirtualMemory(-1i64, &v18, &v17, 0x8000i64, 0, Protect);
}
return(unsigned int)v9;
}Referenced by:
PspSetupUserFiberShadowStack
PspSetupUserShadowStack