AlpcpExposeViewAttributeInSenderContext

INT64 __fastcall AlpcpExposeViewAttributeInSenderContext(INT64 a1, INT64 a2){
  ULONG_PTR v2; 
  unsigned int v5; 
  INT64 i; 
  _KALPC_VIEW *View; 
  _KALPC_VIEW *v8; 
  int v9; 
  __int64 v10; 
  int v11; 
  int v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  _KALPC_VIEW *ViewPointer; 
  _KAPC_STATE ApcState; 
  v2 = *(_QWORD *)(a2 + 144);
  memset(&ApcState, 0, sizeof(ApcState));
  v5 = 0;
  for( i = *(_QWORD *)(v2 + 16); ; AlpcpUnlockBlob((PVOID)i) )
  {
    AlpcpLockForCachedReferenceBlob((PVOID)i);
    View = (_KALPC_VIEW *)AlpcpLocateView(i, a1);
    ViewPointer = View;
    v8 = View;
    if( !View )
      break;
    LODWORD(v14) = AlpcpReferenceBlob(View);
    if( v14 > 0 )
      break;
  }
  if( (*(_DWORD *)(i + 48) & 1) != 0 )
  {
    if( v8 == *(_KALPC_VIEW **)(i + 80) )
    {
LABEL_12:
      *(_DWORD *)(a2 + 40) |= 0x4000u;
      *(_QWORD *)(a2 + 144) = v8;
      ++*((_DWORD *)v8 + 19);
      goto LABEL_13;
    }
    if( v8 && v8 == *(_KALPC_VIEW **)(i + 72) )
    {
      v15 = *(_DWORD *)(v2 + 72);
      if( (v15 & 8) == 0 )
      {
        LODWORD(v16) = MmSecureVirtualMemoryAgainstWrites(
                         *(_EPROCESS **)(v2 + 32),
                         *(PVOID *)(v2 + 40),
                         *(_QWORD *)(v2 + 48));
        if( !v16 )
        {
          if( *((_QWORD *)v8 + 8) )
          {
            KiStackAttachProcess(*((_KPROCESS **)v8 + 4), 0i64, &ApcState);
            MmUnsecureVirtualMemory(*((PVOID *)v8 + 8));
            KiUnstackDetachProcess(&ApcState, 0i64);
            *((_QWORD *)v8 + 8) = 0i64;
          }
          *((_DWORD *)v8 + 18) |= 1u;
          AlpcpDereferenceBlobEx(v8, 1i64);
          *(_QWORD *)(i + 72) = 0i64;
          *(_QWORD *)(i + 80) = 0i64;
          *(_DWORD *)(i + 48) &= ~1u;
          goto LABEL_12;
        }
        *(_QWORD *)(v2 + 64) = v16;
        v15 = *(_DWORD *)(v2 + 72);
      }
      *(_DWORD *)(v2 + 72) = v15 & 0xFFFFFFFE;
      AlpcpReferenceBlob((PVOID)v2);
      if( *((_QWORD *)v8 + 8) )
      {
        KiStackAttachProcess(*((_KPROCESS **)v8 + 4), 0i64, &ApcState);
        MmUnsecureVirtualMemory(*((PVOID *)v8 + 8));
        KiUnstackDetachProcess(&ApcState, 0i64);
        *((_QWORD *)v8 + 8) = 0i64;
      }
      *((_DWORD *)v8 + 18) |= 1u;
      *(_QWORD *)(i + 72) = v2;
      *(_QWORD *)(i + 80) = v8;
      AlpcpDereferenceBlobEx(v8, 1i64);
      goto LABEL_12;
    }
    v9 = *(_DWORD *)(v2 + 72);
    if( (v9 & 8) != 0 )
      goto LABEL_9;
    LODWORD(v10) = MmSecureVirtualMemoryAgainstWrites(
                     *(_EPROCESS **)(v2 + 32),
                     *(PVOID *)(v2 + 40),
                     *(_QWORD *)(v2 + 48));
    if( v10 )
    {
      *(_QWORD *)(v2 + 64) = v10;
      v9 = *(_DWORD *)(v2 + 72);
LABEL_9:
      *(_DWORD *)(v2 + 72) = v9 & 0xFFFFFFFE;
      AlpcpReferenceBlob((PVOID)v2);
      *(_QWORD *)(i + 80) = 0i64;
      *(_QWORD *)(i + 72) = v2;
      if( v8 )
      {
        *(_QWORD *)(i + 80) = v8;
        goto LABEL_12;
      }
      AlpcpCreateView((_KALPC_REGION *)i, (_ALPC_PORT *)a1, &ViewPointer);
      v5 = v11;
      if( v11 >= 0 )
        goto LABEL_11;
      AlpcpRestoreWriteAccess(v2);
      AlpcpDereferenceBlobEx((PVOID)v2, 1i64);
      goto LABEL_35;
    }
    *(_QWORD *)(i + 72) = 0i64;
    *(_QWORD *)(i + 80) = 0i64;
    *(_DWORD *)(i + 48) &= ~1u;
  }
  else if( v8 )
  {
    goto LABEL_12;
  }
  AlpcpCreateView((_KALPC_REGION *)i, (_ALPC_PORT *)a1, &ViewPointer);
  v5 = v13;
  if( v13 >= 0 )
  {
LABEL_11:
    v8 = ViewPointer;
    goto LABEL_12;
  }
LABEL_35:
  *(_QWORD *)(a2 + 144) = 0i64;
LABEL_13:
  --*(_DWORD *)(v2 + 76);
  if( (*(_DWORD *)(v2 + 72) & 2) != 0 )
  {
    AlpcpDeleteView(v2);
    *(_DWORD *)(v2 + 72) &= ~2u;
  }
  AlpcpUnlockBlob((PVOID)i);
  AlpcpDereferenceBlobEx((PVOID)v2, 1i64);
  return v5;
}

Referenced by:

AlpcpCompleteDispatchMessage
AlpcpDispatchReplyToWaitingThread