MiCheckShadowStackOverflow

__int64 __fastcall MiCheckShadowStackOverflow(UINT64 a1, _DWORD *a2){
  unsigned int v2; 
  __int64 v6; 
  void *v7; 
  unsigned __int64 v8; 
  VOID *v9; 
  UINT64 AllocationType; 
  UINT64 Protect; 
  VOID *BaseAddress; 
  INT64 v13; 
  UINT64 RegionSize; 

  BaseAddress = 0i64;
  v2 = 0;
  RegionSize = 0i64;
  if( (MiFlags & 0x2000000) != 0 )
  {
    LODWORD(v6) = MiObtainReferencedVadEx(a1, 2, &v13);
    v7 = (void *)v6;
    if( v6 )
    {
      if( (*(_DWORD *)(v6 + 48) & 0x5100000) == 68157440 )
      {
        v2 = 1;
        v8 = (*(unsigned int *)(v6 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v6 + 32) << 32)) << 12;
        MiUnlockAndDereferenceVadShared((PVOID)v6);
        *a2 = -1073741571;
        v7 = 0i64;
        v9 = (VOID *)((a1 & 0xFFFFFFFFFFFFF000ui64) - 4096);
        RegionSize = 4096i64;
        BaseAddress = v9;
        if( (unsigned __int64)v9 > a1 )
          return v2;
        if( (unsigned __int64)v9 <= v8 )
          return v2;
        LODWORD(Protect) = 258;
        LODWORD(AllocationType) = 4096;
        if( ZwAllocateVirtualMemory(
               (VOID *)0xFFFFFFFFFFFFFFFFi64,
               &BaseAddress,
               0i64,
               &RegionSize,
               AllocationType,
               Protect) < 0 )
          return v2;
        *a2 = 275;
      }
      if( v7 )
        MiUnlockAndDereferenceVadShared(v7);
    }
  }
  return v2;
}

Referenced by:

MiCheckForUserStackOverflow