SepGetLearningModeObjectInformation

CHAR *__fastcall SepGetLearningModeObjectInformation(BYTE *a1){
  struct _UNICODE_STRING *v1; 
  UINT8 *v2; 
  int CurrentLogLevel; 
  _BYTE *v4; 
  __int64 v5; 
  CHAR *result; 
  _ETHREAD *CurrentThread; 
  __int64 v8; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  _OWORD *PoolWithTag; 
  struct _UNICODE_STRING *v13; 
  struct _UNICODE_STRING *v14; 
  struct _UNICODE_STRING *v15; 
  UINT8 *v16; 
  WCHAR v17; 
  WCHAR v18; 
  __int128 Src; 
  __int128 v20; 
  unsigned __int64 v22; 
  v1 = 0i64;
  v2 = 0i64;
  CurrentLogLevel = SepGetCurrentLogLevel();
  *v4 = 0;
  result = *(CHAR **)(v5 + 1448);
  if( !result || *((_DWORD *)result + 2) != CurrentLogLevel )
  {
    if( *((_BYTE *)KeGetCurrentThread() + 562) == 1 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      if( (*((_DWORD *)CurrentThread + 29) & 0x400) != 0 || *((_BYTE *)CurrentThread + 586) == 1 )
        v8 = 0i64;
      else
        v8 = *((_QWORD *)CurrentThread + 30);
      if( !v8 )
        return 0i64;
      v9 = *(_QWORD *)(v8 + 40);
      if( !v9 )
        return 0i64;
      if( (v9 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v9 + 24 > 0x7FFFFFFF0000i64 || v9 + 24 < v9 )
        MEMORY[0x7FFFFFFF0000] = 0;
      if( *(_DWORD *)v9 != -1395763957 )
        return 0i64;
      v22 = *(_QWORD *)(v9 + 8);
      v10 = *(_QWORD *)(v9 + 16);
      if( (v22 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v22 + 16 > 0x7FFFFFFF0000i64 || v22 + 16 < v22 )
        MEMORY[0x7FFFFFFF0000] = 0;
      if( (v10 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v10 + 16 > 0x7FFFFFFF0000i64 || v10 + 16 < v10 )
        MEMORY[0x7FFFFFFF0000] = 0;
      Src = *(_OWORD *)v22;
      v20 = *(_OWORD *)v10;
      if( WORD1(*(_OWORD *)v22) )
      {
        if( (BYTE8(Src) & 1) != 0 )
          ExRaiseDatatypeMisalignment();
        v11 = *((_QWORD *)&Src + 1) + WORD1(Src);
        if( v11 > 0x7FFFFFFF0000i64 || v11 < *((_QWORD *)&Src + 1) )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
      if( WORD1(v20) )
      {
        if( (BYTE8(v20) & 1) != 0 )
          ExRaiseDatatypeMisalignment();
        if( *((_QWORD *)&v20 + 1) + (unsigned __int64)WORD1(v20) > 0x7FFFFFFF0000i64
          || *((_QWORD *)&v20 + 1) + (unsigned __int64)WORD1(v20) < *((_QWORD *)&v20 + 1) )
        {
          MEMORY[0x7FFFFFFF0000] = 0;
        }
      }
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x38ui64, 0x494F6553ui64);
      if( PoolWithTag )
      {
        *PoolWithTag = 0i64;
        PoolWithTag[1] = 0i64;
        PoolWithTag[2] = 0i64;
        *((_QWORD *)PoolWithTag + 6) = 0i64;
        v13 = (struct _UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, 0x10ui64, 0x544F6553ui64);
        v14 = v13;
        if( v13 )
        {
          *v13 = 0i64;
          v2 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, WORD1(Src), 0x544F6553ui64);
          if( v2 )
          {
            v15 = (struct _UNICODE_STRING *)ExAllocatePoolWithTag(PagedPool, 0x10ui64, 0x4E4F6553ui64);
            v1 = v15;
            if( v15 )
            {
              *v15 = 0i64;
              v16 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, WORD1(v20), 0x4E4F6553ui64);
              if( v16 )
              {
                memmove(v2, *((UINT8 **)&Src + 1), WORD1(Src));
                RtlInitUnicodeString(v14, (PCWSTR)v2, v17);
                memmove(v16, *((UINT8 **)&v20 + 1), WORD1(v20));
                RtlInitUnicodeString(v1, (PCWSTR)v16, v18);
                *((_QWORD *)PoolWithTag + 2) = v14;
                *((_QWORD *)PoolWithTag + 3) = v1;
                *a1 = 1;
                return(CHAR *)PoolWithTag;
              }
            }
          }
        }
        if( v14 )
          ExFreePoolWithTag(v14, 0);
        if( v2 )
          ExFreePoolWithTag(v2, 0);
        if( v1 )
          ExFreePoolWithTag(v1, 0);
        ExFreePoolWithTag(PoolWithTag, 0);
      }
    }
    return 0i64;
  }
  return result;
}

Referenced by:

SeLogAccessFailure