ObpCaptureBoundaryDescriptor

_KNOWN_CONTROLLER_TYPE *__stdcall ObpCaptureBoundaryDescriptor(_KNOWN_CONTROLLER_TYPE a1, _KNOWN_CONTROLLER_TYPE **a2){
  const VOID *v3; 
  __int64 v4; 
  unsigned int v5; 
  unsigned __int64 v6; 
  VOID **PoolWithTag; 
  char v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  VOID **v12; 
  int v13; 
  int v14; 
  _ETHREAD *CurrentThread; 
  void *PrimaryToken; 
  _DWORD *v17; 
  unsigned int v18; 
  unsigned int v19; 
  PVOID P; 
  size_t Size[2]; 
  PVOID v22; 
  __m128i v23; 
  _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  VOID *TokenInformation; 

  v3 = *(const VOID **)&a1;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  *a2 = 0i64;
  if( KeGetCurrentThread()->PreviousMode )
  {
    v4 = 0x7FFFFFFF0000i64;
    if( *(_QWORD *)&a1 < 0x7FFFFFFF0000ui64 )
      v4 = *(_QWORD *)&a1;
    v23 = *(__m128i *)v4;
    v5 = _mm_cvtsi128_si32(_mm_srli_si128(v23, 8));
    v23.m128i_i32[2] = v5;
    if( v5 - 16 > 0x7FEF )
      return(_KNOWN_CONTROLLER_TYPE *)3221225485i64;
    if( v5 )
    {
      if( (a1 & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      v6 = *(_QWORD *)&a1 + v5;
      if( v6 > 0x7FFFFFFF0000i64 || v6 < (unsigned __int64)v3 )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
  }
  else
  {
    v23 = **(__m128i **)&a1;
    v5 = v23.m128i_u32[2];
  }
  PoolWithTag = 0i64;
  LODWORD(TokenInformation) = 0;
  v9 = 0;
  *(_QWORD *)Size = v5;
  v10 = v5;
  P = 0i64;
  v19 = 0;
  if( (v23.m128i_i8[12] & 1) != 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v9 = 1;
    SeCaptureSubjectContextEx(CurrentThread, CurrentThread->Tcb.ApcState.Process, &SubjectContext);
    PrimaryToken = SubjectContext.PrimaryToken;
    if( SubjectContext.ClientToken )
      PrimaryToken = SubjectContext.ClientToken;
    SeQueryInformationToken(PrimaryToken, TokenIsAppContainer, &TokenInformation);
    if( (_DWORD)TokenInformation )
    {
      v13 = SeQueryInformationToken(PrimaryToken, TokenAppContainerSid, &P);
      if( v13 < 0 )
        goto LABEL_20;
      v19 = RtlLengthSid(*(_QWORD *)P);
      v10 += ((v19 + 7i64) & 0xFFFFFFFFFFFFFFF8ui64) + 8;
    }
    v5 = v23.m128i_u32[2];
  }
  v11 = v10 + 48;
  if( v11 > 0xFFFFFFFF )
  {
    v13 = -1073741675;
    goto LABEL_20;
  }
  PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)v11, 1397645903i64);
  v22 = PoolWithTag;
  if( !PoolWithTag )
  {
    v13 = -1073741670;
    goto LABEL_20;
  }
  PoolWithTag[3] = (VOID *)((unsigned int)v11 - 48i64);
  v12 = PoolWithTag + 6;
  memmove(PoolWithTag + 6, v3, Size[0]);
  if( P )
  {
    v17 = (_DWORD *)((char *)v12 + *(_QWORD *)Size);
    if( (VOID **)((char *)v12 + *(_QWORD *)Size) != (VOID **)(((unsigned __int64)v12 + *(_QWORD *)Size + 7) & 0xFFFFFFFFFFFFFFF8ui64) )
    {
LABEL_38:
      v13 = -1073741811;
      goto LABEL_20;
    }
    *v17 = 2;
    v18 = ((v19 + 7) & 0xFFFFFFF8) + 8;
    v17[1] = v18;
    v5 += v18;
    ++v23.m128i_i32[1];
    memmove(v17 + 2, *(const VOID **)P, v19);
  }
  *((_DWORD *)PoolWithTag + 14) = v5;
  *((_DWORD *)PoolWithTag + 13) = v23.m128i_i32[1];
  v13 = RtlEnumerateBoundaryDescriptorEntries((_DWORD *)PoolWithTag + 12, 0i64, 0i64);
  if( v13 >= 0 && !ObpCheckDuplicateEntries((__int64)PoolWithTag) )
    goto LABEL_38;
  *((_BYTE *)PoolWithTag + 40) = 0;
  RtlEnumerateBoundaryDescriptorEntries(
    (_DWORD *)PoolWithTag + 12,
    (unsigned int(__fastcall *)(_DWORD *, __int64))ObpHashBoundaryFunction,
    (__int64)PoolWithTag);
  v14 = (3134165325u * (unsigned __int64)*((unsigned __int8 *)PoolWithTag + 40)) >> 32;
  *((_BYTE *)PoolWithTag + 40) -= 37
                                * ((v14 + (((unsigned int)*((unsigned __int8 *)PoolWithTag + 40) - v14) >> 1)) >> 5);
LABEL_20:
  if( P )
    ExFreePoolWithTag(P, 0);
  if( v9 )
    SeReleaseSubjectContext(&SubjectContext);
  if( v13 < 0 )
  {
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0x534E624Fu);
  }
  else
  {
    *a2 = (_KNOWN_CONTROLLER_TYPE *)PoolWithTag;
  }
  return(_KNOWN_CONTROLLER_TYPE *)(unsigned int)v13;
}

Referenced by:

NtCreatePrivateNamespace
NtOpenPrivateNamespace