AlpcpCompleteDispatchMessage

VOID __fastcall AlpcpCompleteDispatchMessage(INT64 a1){
  INT64 v1; 
  ULONG_PTR v3; 
  int v4; 
  int v5; 
  __int64 v6; 
  int v7; 
  int v8; 
  int v9; 
  int v10; 
  BOOL v11; 
  INT64 v12; 
  unsigned int v13; 
  _QWORD *v14; 
  __int64 v15; 
  int v16; 
  UNICODE_STRING *v17; 
  char v18; 
  int v19; 
  signed __int64 v20; 
  UINT64 v21; 
  unsigned int v22; 
  int v23; 
  int v24; 
  unsigned int v25; 
  int v26; 
  int v27; 
  __int64 v28; 
  unsigned int v29; 
  unsigned int CompletionBuffer; 
  __int64 v31; 
  void *v32; 
  _QWORD *v33; 
  unsigned int v34; 
  int v35; 
  bool v36; 
  __int64 v37; 
  _QWORD *v38; 
  UINT64 v39; 
  int v40; 
  int inserted; 
  void *v42; 
  __int16 v43; 
  unsigned int v44; 
  unsigned __int64 v45; 
  __int64 v46; 
  int v47; 
  __int16 v48; 
  __int16 v49; 
  __int16 v50; 
  _DWORD *BugCheckParameter4; 
  unsigned int v52; 
  unsigned int v53; 
  unsigned int v54; 
  int v55; 
  int v56; 
  __int64 v57; 
  __int64 v58; 
  char v59; 
  CHAR v60; 
  unsigned int v61; 
  unsigned int v62; 
  v1 = *(_QWORD *)(a1 + 32);
  v3 = *(_QWORD *)(a1 + 8);
  v4 = *(_DWORD *)(a1 + 48);
  v60 = 0;
  v5 = v4 & 4;
  v6 = *(_QWORD *)(a1 + 16);
  v7 = v4 & 0x20000;
  v57 = v6;
  v8 = v4 & 0x800000;
  v56 = v5;
  v9 = *(_DWORD *)(*(_QWORD *)a1 + 256i64);
  if( (v9 & 0x400000) != 0 )
    v10 = 2;
  else
    v10 = (v9 & 0x200000) != 0;
  v11 = v7 || v8;
  if( (*(_DWORD *)(v3 + 40) & 0x200) == 0 )
  {
    v12 = 0i64;
    if( (*(_QWORD *)(v1 + 24) & 1) == 0 )
      v12 = *(_QWORD *)(v1 + 24);
    if( v12 )
    {
      if( v11 || v10 || (AlpcpWakePolicyDefault & 1) == 0 )
      {
        v13 = 1;
        if( v10 )
        {
          if( v10 == 1 )
            v13 = 3;
        }
        else if( (AlpcpWakePolicyDefault & 1) != 0 )
        {
          v13 = 3;
          if( (AlpcpWakePolicyDefault & 2) != 0 )
            v13 = -2147483645;
        }
        *(_QWORD *)(v3 + 208) = PsChargeProcessWakeCounter(v12, v13, 2i64, *(unsigned int *)(v3 + 264));
      }
      if( KeHeteroSystem
        && v11
        && (!*((_BYTE *)KeGetCurrentThread() + 512)
         || (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 68) + 632i64) & 0x380) == 384
         || (*((_DWORD *)KeGetCurrentThread() + 239) & 0x300) == 768) )
      {
        *(_QWORD *)(v3 + 216) = PsChargeProcessWakeCounter(v12, 0i64, 6i64, *(unsigned int *)(v3 + 264));
      }
    }
    v6 = v57;
  }
  if( (*(_DWORD *)(a1 + 48) & 8) != 0 )
  {
    if( *(_QWORD *)(v3 + 176) )
    {
      AlpcpCaptureMessageDataSafe(v3);
      *(_QWORD *)(v3 + 176) = 0i64;
    }
    if( *(_QWORD *)(v3 + 144) )
      AlpcpExposeViewAttributeInSenderContext(v1, v3);
    ++*(_WORD *)(v3 - 30);
    AlpcpInsertMessageDirectQueue(v1, v3);
    *(_QWORD *)(a1 + 40) = *(_QWORD *)(v3 + 160);
    *(_DWORD *)(v3 + 40) &= ~0x8000u;
    *(_QWORD *)(v3 + 160) = 0i64;
    AlpcpUnlockMessage(v3);
    if( _InterlockedCompareExchange64((volatile signed __int64 *)(v6 - 16), 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)(v6 - 16));
    KeAbPostRelease((PVOID)(v6 - 16));
    if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)(v1 + 352));
    KeAbPostRelease((PVOID)(v1 + 352));
    HalPutDmaAdapter((PADAPTER_OBJECT)v1);
    *(_QWORD *)(a1 + 32) = 0i64;
    if( !v7 && !v5 )
    {
      v45 = *(_QWORD *)(a1 + 40);
      if( v45 >= 4 )
      {
        KeSetEvent((PRKEVENT)(v45 & 0xFFFFFFFFFFFFFFFCui64), 0);
        v46 = *(_QWORD *)(a1 + 40);
        if( (v46 & 2) != 0 )
          HalPutDmaAdapter((PADAPTER_OBJECT)(v46 & 0xFFFFFFFFFFFFFFFCui64));
      }
      *(_QWORD *)(a1 + 40) = 0i64;
    }
  }
  else
  {
    v14 = (_QWORD *)(v1 + 232);
    if( (_QWORD *)*v14 == v14 )
      goto LABEL_19;
    ExAcquirePushLockExclusiveEx(v1 + 224, 0i64);
    if( (_QWORD *)*v14 == v14 )
    {
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 224), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v1 + 224));
      KeAbPostRelease((PVOID)(v1 + 224));
LABEL_19:
      if( *(_QWORD *)(v1 + 32) )
      {
        v59 = 1;
        v55 = 0;
      }
      else
      {
        v59 = 0;
        v55 = (*(_DWORD *)(v1 + 416) >> 9) & 1;
      }
      v15 = *(_QWORD *)(v1 + 360);
      if( v15 && (*(_DWORD *)(v1 + 416) & 0x10000) != 0 )
      {
        v22 = (*(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0) | 0x40000000;
        if( !*(_QWORD *)(v3 + 144) )
          v22 = *(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0;
        v23 = v22 | 0x10000000;
        if( !*(_QWORD *)(v3 + 152) )
          v23 = v22;
        if( *(_QWORD *)(v3 + 168) )
          v23 |= 0x2000000u;
        v24 = *(_DWORD *)(v15 + 148);
        if( (~v24 & v23) == 0 && ((*(unsigned __int16 *)(v3 + 244) & 0xFFFF00FF) != 5 || (v24 & 0x20000000) != 0) )
        {
          v25 = *(unsigned __int16 *)(v3 + 242);
          v26 = *(_DWORD *)(v1 + 416) & 0x800;
          v52 = (unsigned __int16)v25;
          if( v24 )
          {
            v27 = 8;
            if( v26 )
              v27 = 4;
            v28 = (unsigned int)(v27 - 1) & (v3 + 240 + *(unsigned __int16 *)(v3 + 242));
            v29 = v28 ? v27 - v28 : 0;
            v61 = v29;
            v25 += v29 + *(_DWORD *)(v15 + 152);
            v52 = v25;
          }
          else
          {
            v61 = 0;
          }
          v62 = 0;
          if( v26 )
          {
            v25 -= 16;
            v62 = 0x80000000;
            v52 = v25;
          }
          CompletionBuffer = AlpcpAllocateCompletionBuffer(v1, v25);
          v54 = CompletionBuffer;
          if( CompletionBuffer != -1 )
          {
            v31 = *(_QWORD *)(v15 + 120) + CompletionBuffer;
            v58 = v31;
            if( v62 )
            {
              *(_WORD *)v31 = *(_WORD *)(v3 + 240);
              v47 = *(unsigned __int16 *)(v3 + 240) + 24;
              *(_WORD *)(v31 + 2) = v47;
              v48 = *(_WORD *)(v3 + 246);
              v53 = v47;
              v49 = 0;
              if( v48 )
                v49 = v48 - 16;
              *(_WORD *)(v31 + 6) = v49;
              v50 = *(_WORD *)(v3 + 244) | 0x1000;
              *(_WORD *)(v31 + 4) = v50;
              *(_DWORD *)(v31 + 8) = *(_DWORD *)(v3 + 248);
              *(_DWORD *)(v31 + 12) = *(_DWORD *)(v3 + 256);
              *(_DWORD *)(v31 + 16) = *(_DWORD *)(v3 + 264);
              *(_DWORD *)(v31 + 20) = *(_DWORD *)(v3 + 272);
              *(_DWORD *)(v31 + 20) = *(_DWORD *)(v3 + 272);
              if( (*(_DWORD *)(v1 + 256) & 0x1000) != 0 )
                *(_WORD *)(v31 + 4) = v50 & 0xC00F;
              v32 = (void *)(v31 + 24);
            }
            else
            {
              *(_OWORD *)v31 = *(_OWORD *)(v3 + 240);
              *(_OWORD *)(v31 + 16) = *(_OWORD *)(v3 + 256);
              *(_QWORD *)(v31 + 32) = *(_QWORD *)(v3 + 272);
              if( (*(_DWORD *)(v1 + 256) & 0x1000) != 0 )
                *(_WORD *)(v31 + 4) &= 0xC00Fu;
              v32 = (void *)(v31 + 40);
              v53 = *(unsigned __int16 *)(v3 + 242);
            }
            if( *(_QWORD *)(v3 + 176) )
              AlpcpGetDataFromUserVaSafe(v3, v32);
            else
              AlpcpReadMessageData(v3, (char *)v32);
            v40 = *(_DWORD *)(v15 + 148);
            if( v40 )
            {
              BugCheckParameter4 = (_DWORD *)(v58 + v53 + v61);
              *BugCheckParameter4 = v40;
              BugCheckParameter4[1] = 0;
              AlpcpExposeAttributes(v1, v62, v3, *(unsigned int *)(v15 + 148), (INT64)BugCheckParameter4);
            }
            inserted = AlpcpInsertCompletionListEntry(v1, v54);
            if( inserted )
            {
              v60 = 1;
              *(_DWORD *)(*(_QWORD *)(v15 + 80) + 72i64) = *(_DWORD *)(v3 + 264);
              *(_DWORD *)(*(_QWORD *)(v15 + 80) + 76i64) = *(_DWORD *)(v3 + 272);
              if( v59
                && (inserted & 2) == 0
                && HIWORD(*(_QWORD *)(*(_QWORD *)(v15 + 80) + 64i64))
                 + (unsigned __int64)*(unsigned int *)(*(_QWORD *)(v1 + 48) + 12i64) >= *(unsigned int *)(v15 + 144) )
              {
                v59 = 0;
              }
              if( (*(_DWORD *)(v3 + 40) & 0x200) != 0 )
              {
                v43 = *(_WORD *)(v3 + 244);
                v17 = *(_QWORD *)(v3 + 136) != 0i64 ? (UNICODE_STRING *)0x80000000i64 : 0i64;
                LODWORD(v17) = (unsigned int)v17 | 0x40000000;
                if( !*(_QWORD *)(v3 + 144) )
                  v17 = *(_QWORD *)(v3 + 136) != 0i64 ? (UNICODE_STRING *)0x80000000i64 : 0i64;
                v44 = (unsigned int)v17 | 0x10000000;
                if( !*(_QWORD *)(v3 + 152) )
                  v44 = (unsigned int)v17;
                if( v44 )
                {
                  *(_WORD *)(v3 + 244) = v43 | 0x2000;
                  ++*(_WORD *)(v3 - 30);
                  AlpcpInsertMessagePendingQueue(v1, v3);
                }
                else
                {
                  *(_WORD *)(v3 + 244) = v43 & 0xDFFF;
                }
              }
              else
              {
                ++*(_WORD *)(v3 - 30);
                *(_WORD *)(v3 + 244) |= 0x2000u;
                AlpcpInsertMessagePendingQueue(v1, v3);
              }
LABEL_29:
              if( AlpcpLogEnabled )
                AlpcpLogSendMessage((_KALPC_MESSAGE *)v3);
              if( v60 && AlpcpLogEnabled )
                AlpcpLogReceiveMessage(v3);
              if( v7 && AlpcpLogEnabled )
                AlpcpLogWaitForReply((PVOID)v3, v17);
              *(_DWORD *)(v3 + 40) &= ~0x8000u;
              if( AlpcpMessageLogEnabled )
                AlpcpEnterStateChangeEventMessageLog((_KALPC_MESSAGE *)v3);
              v18 = *(_BYTE *)(v3 - 32);
              if( (v18 & 1) != 0
                && (v19 = 0x10000 - *(__int16 *)(v3 - 30),
                    *(_BYTE *)(v3 - 32) = v18 & 0xFE,
                    *(_WORD *)(v3 - 30) = 0,
                    v19 > 0)
                && (v20 = -v19 + _InterlockedExchangeAdd64((volatile signed __int64 *)(v3 - 24), -v19), v20 <= 0) )
              {
                if( v20 )
                  KeBugCheckEx(0x18u, 0i64, v3, 0x28ui64, v20);
                AlpcpDestroyBlob((PVOID)v3);
              }
              else
              {
                if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v3 - 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                  ExfTryToWakePushLock((volatile INT64 *)(v3 - 16));
                KeAbPostRelease((PVOID)(v3 - 16));
              }
              if( _InterlockedCompareExchange64((volatile signed __int64 *)(v57 - 16), 0i64, 17i64) != 17 )
                ExfReleasePushLockShared((INT64 *)(v57 - 16));
              KeAbPostRelease((PVOID)(v57 - 16));
              if( v55 )
              {
                if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
                  ExfReleasePushLockShared((INT64 *)(v1 + 352));
                KeAbPostRelease((PVOID)(v1 + 352));
                if( v7 || v56 )
                {
                  *(_BYTE *)(a1 + 58) = 0;
                  return;
                }
                KeReleaseSemaphoreEx(*(KSEMAPHORE **)(v1 + 248), 1i64, 1i64, v21);
              }
              else
              {
                if( v59 )
                {
                  if( v7 || v56 )
                  {
                    *(_BYTE *)(a1 + 58) = 1;
                    *(_BYTE *)(a1 + 59) = v60;
                  }
                  else
                  {
                    AlpcpQueueIoCompletionPort(v1, v60, 1, 0);
                    HalPutDmaAdapter((PADAPTER_OBJECT)v1);
                    *(_QWORD *)(a1 + 32) = 0i64;
                  }
                  return;
                }
                v42 = *(void **)(v1 + 368);
                if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
                  ExfReleasePushLockShared((INT64 *)(v1 + 352));
                KeAbPostRelease((PVOID)(v1 + 352));
                if( v42 )
                  ExNotifyCallback(v42, *(PVOID *)(v1 + 376), (PVOID)*(unsigned int *)(a1 + 48));
              }
              HalPutDmaAdapter((PADAPTER_OBJECT)v1);
              *(_QWORD *)(a1 + 32) = 0i64;
              return;
            }
            AlpcpFreeBitmap(*(UINT64 **)(*(_QWORD *)(v1 + 360) + 104i64), 0i64, v54 >> 6, (v52 + 63) >> 6);
          }
        }
      }
      if( *(_QWORD *)(v3 + 176) )
      {
        AlpcpCaptureMessageDataSafe(v3);
        *(_QWORD *)(v3 + 176) = 0i64;
      }
      if( *(_QWORD *)(v3 + 144) )
        AlpcpExposeViewAttributeInSenderContext(v1, v3);
      ++*(_WORD *)(v3 - 30);
      ExAcquirePushLockExclusiveEx(v1 + 136, 0i64);
      v16 = *(_DWORD *)(v3 + 40);
      *(_QWORD *)(v3 + 16) = v1;
      *(_DWORD *)(v3 + 40) = v16 & 0xFFFFFF81 | (4 * (*(_DWORD *)(v1 + 416) & 6)) | 1;
      *(_QWORD *)(v3 + 8) = *(_QWORD *)(v1 + 152);
      *(_QWORD *)v3 = v1 + 144;
      **(_QWORD **)(v1 + 152) = v3;
      ++*(_DWORD *)(v1 + 448);
      *(_QWORD *)(v1 + 152) = v3;
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 136), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v1 + 136));
      KeAbPostRelease((PVOID)(v1 + 136));
      goto LABEL_29;
    }
    v33 = (_QWORD *)*v14;
    if( *(_QWORD *)(v3 + 176) )
    {
      AlpcpCaptureMessageDataSafe(v3);
      *(_QWORD *)(v3 + 176) = 0i64;
    }
    if( *(_QWORD *)(v3 + 144) )
      AlpcpExposeViewAttributeInSenderContext(v1, v3);
    if( (*(_DWORD *)(v3 + 40) & 0x200) == 0 )
      goto LABEL_133;
    v34 = (*(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0) | 0x40000000;
    if( !*(_QWORD *)(v3 + 144) )
      v34 = *(_QWORD *)(v3 + 136) != 0i64 ? 0x80000000 : 0;
    v35 = v34 | 0x10000000;
    if( !*(_QWORD *)(v3 + 152) )
      v35 = v34;
    if( (v35 & *(_DWORD *)(v33 - 1)) != 0 )
    {
LABEL_133:
      *(_WORD *)(v3 + 244) |= 0x2000u;
      ++*(_WORD *)(v3 - 30);
      AlpcpInsertMessagePendingQueue(v1, v3);
    }
    else
    {
      *(_WORD *)(v3 + 244) &= ~0x2000u;
    }
    ++*(_WORD *)(v3 - 30);
    *(_DWORD *)(v3 + 40) |= 0x2000u;
    v36 = AlpcpLogEnabled == 0;
    *(v33 - 1) = v3;
    if( !v36 )
      AlpcpLogSendMessage((_KALPC_MESSAGE *)v3);
    v37 = *v33;
    if( *(_QWORD **)(*v33 + 8i64) != v33 || (v38 = (_QWORD *)v33[1], (_QWORD *)*v38 != v33) )
      __fastfail(3u);
    *v38 = v37;
    *(_QWORD *)(v37 + 8) = v38;
    *v33 = 0i64;
    *(_DWORD *)(v3 + 40) &= ~0x8000u;
    AlpcpUnlockMessage(v3);
    if( _InterlockedCompareExchange64((volatile signed __int64 *)(v57 - 16), 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)(v57 - 16));
    KeAbPostRelease((PVOID)(v57 - 16));
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v1 + 224), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(v1 + 224));
    KeAbPostRelease((PVOID)(v1 + 224));
    if( _InterlockedCompareExchange64((volatile signed __int64 *)(v1 + 352), 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)(v1 + 352));
    KeAbPostRelease((PVOID)(v1 + 352));
    HalPutDmaAdapter((PADAPTER_OBJECT)v1);
    *(_QWORD *)(a1 + 32) = 0i64;
    if( v7 || v5 )
      *(_QWORD *)(a1 + 24) = v33 - 167;
    else
      KeReleaseSemaphoreEx((KSEMAPHORE *)(v33 - 22), 1i64, 1i64, v39);
  }
}

Referenced by:

AlpcpDispatchCloseMessage
AlpcpDispatchConnectionRequest
AlpcpDispatchNewMessage
AlpcpDispatchReplyToPort