KiVerifyContextIpForUserCet

INT64 __fastcall KiVerifyContextIpForUserCet(INT64 a1, INT64 a2, INT64 *r8_0, CHAR a4, UINT64 *a5){
  UINT64 v8; 
  __int64 i; 
  UINT64 v10; 
  int v11; 
  INT64 result; 
  int ImageBaseAndLoadConfig; 
  char v14; 
  INT64 a3[2]; 
  __int64 v16; 
  v8 = *(_QWORD *)(a2 + 248);
  if( v8 - 0x10000 > 0x7FFFFFFDFFFFi64 )
    return 3221227018i64;
  for( i = *(_QWORD *)(a1 + 40); (*(_BYTE *)(i + 8) & 1) != 0; i = *(_QWORD *)(i + 40) )
    ;
  if( v8 == *(_QWORD *)(i - 40) )
    return 0i64;
  v10 = *a5;
  v11 = *(_DWORD *)r8_0;
  if( v11 < 0 )
    return 3221225485i64;
  if( v11 > 1 )
  {
    if( v11 == 2 )
      return RtlVerifyUserUnwindTarget(v8, 2i64, 0i64);
    if( v11 != 3 )
      return 3221225485i64;
  }
  if( !v10 )
  {
    v10 = __readmsr(0x6A7u);
    if( !v10 )
      return 0i64;
  }
  if( !v11 && v8 == PspUserThreadStart )
  {
    *(_DWORD *)r8_0 = 1;
    v11 = 1;
  }
  *(_OWORD *)a3 = 0i64;
  v16 = 0i64;
  if( !v11 )
  {
    result = RtlVerifyUserUnwindTarget(v8, 0i64, (INT64)a3);
    if( (int)result >= 0 )
      return result;
  }
  if( a4 && *(_DWORD *)r8_0 != 1 )
  {
    if( (_BYTE)v16 )
      goto LABEL_25;
    ImageBaseAndLoadConfig = RtlGetImageBaseAndLoadConfig(v8, (PVOID *)a3, &a3[1]);
    v14 = v16;
    if( ImageBaseAndLoadConfig >= 0 )
      v14 = 1;
    LOBYTE(v16) = v14;
    if( v14 )
    {
LABEL_25:
      if( a3[0] )
      {
        if( (unsigned __int64)(a3[1] + 280) > 0x7FFFFFFF0000i64 || (unsigned __int64)(a3[1] + 280) < a3[1] )
          MEMORY[0x7FFFFFFF0000] = 0;
        if( a3[1] && *(_DWORD *)a3[1] >= 0x118u && (*(_DWORD *)(a3[1] + 144) & 0x400000) != 0 )
          goto LABEL_33;
        return 0i64;
      }
      return 0i64;
    }
  }
  do
  {
LABEL_33:
    if( *(_QWORD *)v10 == v8 )
    {
      *a5 = v10 + 8;
      return 0i64;
    }
    v10 += 8i64;
  }
  while( (v10 & 0xFFF) != 0 || (*(_DWORD *)(a1 + 1296) & 1) == 0 );
  return 3221225547i64;
}

Referenced by:

KeVerifyContextIpForUserCet