AlpcpCreateView

VOID __stdcall AlpcpCreateView(_KALPC_REGION *Region, _ALPC_PORT *OwnerPort, _KALPC_VIEW **ViewPointer){
  _DWORD *v3; 
  unsigned __int64 v7; 
  UINT64 v8; 
  CHAR *Blob; 
  _KALPC_VIEW *v10; 
  INT64 v11; 
  bool v12; 
  int v13; 
  __int64 v14; 
  _LARGE_INTEGER *SectionOffset; 
  INT64 v16; 
  INT64 v17; 
  INT64 v18; 
  INT64 v19; 
  int v20; 
  _LARGE_INTEGER v21; 
  VOID *MappedBase; 
  UINT64 ViewSize; 
  v3 = (_DWORD *)*((_QWORD *)Region + 2);
  MappedBase = 0i64;
  v21.QuadPart = 0i64;
  *ViewPointer = 0i64;
  AlpcpLockForCachedReferenceBlob(v3);
  if( (*((_DWORD *)OwnerPort + 104) & 0x20) == 0 )
  {
    v7 = *((_QWORD *)OwnerPort + 38);
    v8 = *((_QWORD *)OwnerPort + 3);
    if( (!v7 || v7 >= *((_QWORD *)Region + 5))
      && ((*((_DWORD *)Region + 12) & 1) == 0 || *((_DWORD *)Region + 13) < 2u && !*((_QWORD *)Region + 10)) )
    {
      Blob = AlpcpAllocateBlob(&AlpcViewType, 0x60ui64, 0i64);
      v10 = (_KALPC_VIEW *)Blob;
      if( Blob )
      {
        memset((INT64)Blob, 0i64);
        v12 = (*((_DWORD *)OwnerPort + 64) & 0x100000) == 0;
        v21 = *(_LARGE_INTEGER *)((char *)Region + 24);
        ViewSize = *((_QWORD *)Region + 5);
        if( v12 )
        {
          if( (v3[12] & 2) != 0 )
            v13 = MmMapSecureViewOfSection(
                    *(_QWORD *)v3,
                    v8,
                    (INT64 *)&MappedBase,
                    v11,
                    (INT64)SectionOffset,
                    (UINT64 *)&v21.QuadPart,
                    (INT64 *)&ViewSize,
                    v16,
                    v17,
                    v18,
                    v19,
                    (INT64)v10 + 56);
          else
            v13 = MmMapViewOfSection(**((_LOADER_PARAMETER_BLOCK ***)Region + 2), v8);
          v20 = 0;
        }
        else
        {
          v13 = MiMapViewInSystemSpace(*(VOID **)v3, &Session, &MappedBase, &ViewSize, &v21, 0i64);
          v20 = 8;
        }
        if( v13 >= 0 )
        {
          AlpcpReferenceBlob(v10);
          *((_QWORD *)v10 + 5) = MappedBase;
          *((_QWORD *)v10 + 6) = ViewSize;
          *((_DWORD *)v10 + 18) = v20 | *((_DWORD *)v10 + 18) & 0xFFFFFFF7 | 1;
          ObfReferenceObjectWithTag((PVOID)v8, 0x63706C41u);
          *((_QWORD *)v10 + 4) = v8;
          ObfReferenceObject(OwnerPort);
          *((_QWORD *)v10 + 3) = OwnerPort;
          AlpcpReferenceBlob(Region);
          *((_QWORD *)v10 + 2) = Region;
          v14 = *((_QWORD *)Region + 8);
          *(_QWORD *)v10 = (char *)Region + 56;
          *((_QWORD *)v10 + 1) = v14;
          **((_QWORD **)Region + 8) = v10;
          ++*((_DWORD *)Region + 13);
          *((_QWORD *)Region + 8) = v10;
          AlpcpInsertResourcePort(OwnerPort, v10);
          ExAcquirePushLockExclusiveEx(v8 + 2048, 0i64);
          *((_QWORD *)v10 + 11) = *(_QWORD *)(v8 + 2064);
          *((_QWORD *)v10 + 10) = v8 + 2056;
          **(_QWORD **)(v8 + 2064) = (char *)v10 + 80;
          *(_QWORD *)(v8 + 2064) = (char *)v10 + 80;
          if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v8 + 2048), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock((volatile INT64 *)(v8 + 2048));
          KeAbPostRelease((PVOID)(v8 + 2048));
          if( (*((_DWORD *)Region + 12) & 1) != 0 )
            *((_QWORD *)Region + 10) = v10;
          *ViewPointer = v10;
        }
        else
        {
          AlpcpDereferenceBlobEx(v10, 1i64);
        }
      }
    }
  }
  AlpcpUnlockBlob(v3);
}

Referenced by:

AlpcpCreateSectionView
AlpcpExposeViewAttributeInSenderContext