NtAlpcSetInformation

INT64 __fastcall NtAlpcSetInformation(VOID *a1, INT64 a2, INT64 *a3, UINT64 a4){
  UINT64 v4; 
  int v5; 
  _ETHREAD *CurrentThread; 
  int v8; 
  NTSTATUS v9; 
  KPROCESSOR_MODE v10; 
  __int64 v11; 
  INT64 *p_result; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  _DWORD *v20; 
  volatile INT64 *v21; 
  void *v22; 
  _QWORD *v23; 
  volatile INT64 *v24; 
  volatile INT64 *v25; 
  _QWORD *v26; 
  INT64 *v27; 
  _QWORD *v28; 
  volatile INT64 *v29; 
  CHAR *v30; 
  __m128i v31; 
  NTSTATUS v32; 
  PVOID *Object; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  KPROCESSOR_MODE v36; 
  PVOID v37; 
  INT64 *v38; 
  HANDLE Handle; 
  INT64 *v40; 
  INT64 result; 
  int v42; 
  unsigned __int64 v43; 
  v4 = (unsigned int)a4;
  v5 = a2;
  Handle = a1;
  v38 = a3;
  memset((INT64)&result, 0i64);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v8 = 0;
  if( a1 && (v38 || v5 == 7 || v5 == 10) )
  {
    v10 = *((_BYTE *)KeGetCurrentThread() + 562);
    v36 = v10;
    v11 = (__int64)v38;
    p_result = v38;
    v40 = v38;
    if( (_DWORD)v4 && v10 )
    {
      if( (unsigned int)v4 > 0x48 )
      {
        v9 = -1073741820;
        goto LABEL_65;
      }
      if( (unsigned __int64)v38 >= 0x7FFFFFFF0000i64 )
        v11 = 0x7FFFFFFF0000i64;
      v38 = (INT64 *)v11;
      memmove((UINT8 *)&result, (UINT8 *)v11, v4);
      p_result = &result;
      v40 = &result;
    }
    v37 = 0i64;
    v9 = ObReferenceObjectByHandle(Handle, 1u, AlpcPortObjectType, v10, &v37, 0i64);
    if( v9 < 0 )
      goto LABEL_65;
    v13 = v5 - 1;
    if( v13 )
    {
      v14 = v13 - 1;
      if( v14 )
      {
        v15 = v14 - 3;
        if( !v15 )
        {
          v9 = (_DWORD)v4 != 16 ? 0xC000000D : 0;
          goto LABEL_64;
        }
        v16 = v15 - 1;
        if( v16 )
        {
          v17 = v16 - 1;
          if( v17 )
          {
            v18 = v17 - 1;
            if( !v18 )
            {
              if( (_DWORD)v4 == 4 && *(_DWORD *)p_result )
              {
                v26 = v37;
                v27 = (INT64 *)((char *)v37 + 352);
                ExAcquirePushLockSharedEx((UINT64)v37 + 352, 0i64);
                if( v26[45] )
                {
                  AlpcpAdjustCompletionListConcurrencyCount((INT64)v26, *(_DWORD *)p_result);
                  v9 = 0;
                }
                else
                {
                  v9 = -1073741811;
                }
                if( _InterlockedCompareExchange64(v27, 0i64, 17i64) != 17 )
                  ExfReleasePushLockShared(v27);
                v22 = v27;
                goto LABEL_29;
              }
LABEL_52:
              v9 = -1073741811;
              goto LABEL_64;
            }
            v19 = v18 - 1;
            if( v19 )
            {
              if( v19 == 1 && !(_DWORD)v4 )
              {
                v20 = v37;
                v21 = (volatile INT64 *)((char *)v37 + 352);
                ExAcquirePushLockExclusiveEx((UINT64)v37 + 352, 0i64);
                if( *((_QWORD *)v20 + 45) )
                {
                  v20[104] &= ~0x10000u;
                  v9 = 0;
                }
                else
                {
                  v9 = -1073741811;
                }
                if( (_InterlockedExchangeAdd64(v21, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
                  ExfTryToWakePushLock(v21);
                v22 = (void *)v21;
LABEL_29:
                KeAbPostRelease(v22);
LABEL_64:
                HalPutDmaAdapter((PADAPTER_OBJECT)v37);
                goto LABEL_65;
              }
              goto LABEL_52;
            }
            if( v36 )
              goto LABEL_52;
            ObfReferenceObject(*(PVOID *)v11);
            v23 = v37;
            v24 = (volatile INT64 *)((char *)v37 + 352);
            ExAcquirePushLockExclusiveEx((UINT64)v37 + 352, 0i64);
            v23[46] = *(_QWORD *)v11;
            v23[47] = *(_QWORD *)(v11 + 8);
            if( (_InterlockedExchangeAdd64(v24, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock(v24);
            v25 = v24;
          }
          else
          {
            if( (_DWORD)v4 )
              goto LABEL_52;
            v28 = v37;
            v29 = (volatile INT64 *)((char *)v37 + 352);
            ExAcquirePushLockExclusiveEx((UINT64)v37 + 352, 0i64);
            if( v28[45] )
              AlpcpFreeCompletionList((INT64)v28);
            if( (_InterlockedExchangeAdd64(v29, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock(v29);
            v25 = v29;
          }
          KeAbPostRelease((PVOID)v25);
          v9 = 0;
          goto LABEL_64;
        }
        if( (*((_DWORD *)v37 + 104) & 6) != 2 )
          goto LABEL_52;
        if( (_DWORD)v4 == 16 )
        {
          v31 = *(__m128i *)p_result;
          p_result = &result;
          v30 = (CHAR *)v31.m128i_u32[0];
          result = v31.m128i_u32[0];
          v42 = v31.m128i_i32[1];
          v43 = _mm_srli_si128(v31, 8).m128i_u64[0];
          v8 = 1;
        }
        else
        {
          if( (_DWORD)v4 != 24 )
            goto LABEL_52;
          v30 = (CHAR *)*p_result;
        }
        LODWORD(HandleInformation) = v8;
        LODWORD(Object) = *((_DWORD *)p_result + 4);
        v32 = AlpcpInitializeCompletionList(
                (INT64)v37,
                v30,
                *((unsigned int *)p_result + 2),
                *((unsigned int *)p_result + 3),
                (INT64)Object,
                (INT64)HandleInformation);
LABEL_59:
        v9 = v32;
        goto LABEL_64;
      }
      if( (_DWORD)v4 == 16 )
      {
        v32 = AlpcpAssociateIoCompletionPort((INT64)v37, (VOID *)p_result[1], *p_result);
        goto LABEL_59;
      }
    }
    else if( (_DWORD)v4 == 72 )
    {
      if( (*(_DWORD *)p_result & 0xFC00FFFF) == 0 )
      {
        *((_DWORD *)v37 + 64) ^= (*((_DWORD *)v37 + 64) ^ *(_DWORD *)p_result) & 0x20000;
        goto LABEL_64;
      }
      goto LABEL_52;
    }
    v9 = -1073741820;
    goto LABEL_64;
  }
  v9 = -1073741811;
LABEL_65:
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return(unsigned int)v9;
}

Referenced by:

No references.