AlpcpInitializeCompletionList

INT64 __fastcall AlpcpInitializeCompletionList(INT64 a1, CHAR *a2, UINT64 a3, INT64 a4, INT64 Flags, INT64 a6){
  __int64 *v6; 
  char v8; 
  char v9; 
  __int64 **v10; 
  __int64 **PoolWithTag; 
  _MDL *Mdl; 
  __int64 *v13; 
  __int64 *v14; 
  __int64 *v15; 
  __int64 *v16; 
  __int64 *v17; 
  unsigned int v18; 
  __int64 v19; 
  int HeaderSize; 
  __int64 *v21; 
  __int64 *v22; 
  unsigned __int64 v23; 
  int v24; 
  void *v25; 
  _ALPC_COMPLETION_PACKET_LOOKASIDE *CompletionPacketLookaside; 
  unsigned int v27; 
  char v28; 
  int v30; 
  int v31; 
  int v32; 
  int v33; 
  _MDL *v34; 
  unsigned int v35; 
  int v36; 
  unsigned int P; 
  int v39; 
  int v40; 
  v40 = a4;
  v39 = a3;
  v6 = (__int64 *)(unsigned int)a3;
  v8 = 0;
  v9 = 0;
  v10 = 0i64;
  if( ((unsigned __int16)a2 & 0xFFF) != 0i64 || (a3 & 0xFFF) != 0 || (unsigned int)(a3 - 0x4000) > 0x3FFFC000 )
    goto LABEL_32;
  if( (Flags & 0x55FFFFFF) != 0 || !(_DWORD)a4 )
  {
    v9 = 0;
LABEL_32:
    v27 = -1073741811;
LABEL_33:
    v28 = 0;
    goto LABEL_25;
  }
  PoolWithTag = (__int64 **)ExAllocatePoolWithTag(PagedPool, 0xA0ui64, 0x6E496C41ui64);
  v10 = PoolWithTag;
  if( !PoolWithTag )
  {
    v27 = -1073741670;
LABEL_36:
    v9 = 0;
    goto LABEL_33;
  }
  memset((INT64)PoolWithTag, 0i64);
  v10[2] = (__int64 *)*((_QWORD *)KeGetCurrentThread() + 23);
  v10[5] = (__int64 *)a2;
  v10[6] = (__int64 *)((char *)v6 + (_QWORD)a2);
  if( !(unsigned int)AlpcpRegisterCompletionListDatabase(v10) )
  {
    v27 = -1073741800;
    goto LABEL_36;
  }
  Mdl = IoAllocateMdl(a2, (ULONG)v6, 0, 0, 0i64);
  v10[4] = (__int64 *)Mdl;
  if( !Mdl )
  {
    v27 = -1073741670;
    v9 = 1;
    goto LABEL_33;
  }
  MmProbeAndLockPages(Mdl, *((_BYTE *)KeGetCurrentThread() + 562), IoModifyAccess);
  v13 = v10[4];
  if( (*((_BYTE *)v13 + 10) & 5) != 0 )
    v14 = (__int64 *)v13[3];
  else
    v14 = (__int64 *)MmMapLockedPagesSpecifyCache((PMDL)v13, 0, MmCached, 0i64, 0, 0x40000000u);
  v10[8] = v14;
  if( v14 )
  {
    memset((INT64)v14, 0i64);
    v15 = v10[8];
    *v15 = 0xDEADBEEFBAADF00Dui64;
    v15[41] = 0xBAADF00DDEADBEEFui64;
    v16 = (__int64 *)((8 * ((unsigned int)v6 >> 6) + 4095) & 0xFFFFF000);
    v35 = (unsigned int)v16;
    v17 = (__int64 *)((((unsigned int)((_DWORD)v6 - (_DWORD)v16 - 4096) >> 9) + 4095) & 0xFFFFF000);
    v36 = (int)v17;
    v18 = (_DWORD)v6 - (_DWORD)v16 - 4096 - (_DWORD)v17;
    P = v18;
    v10[9] = v6;
    v10[10] = v15;
    v19 = (__int64)(v10[8] + 512);
    v10[11] = (__int64 *)v19;
    v10[12] = v16;
    v10[13] = (__int64 *)((char *)v16 + v19);
    v10[14] = v17;
    *((_DWORD *)v10 + 34) = ((unsigned int)((_DWORD)v6 - (_DWORD)v16 - 4096) >> 6)
                          - (((((unsigned int)((_DWORD)v6 - (_DWORD)v16 - 4096) >> 9) + 4095) & 0xFFFFF000) >> 6);
    v10[15] = (__int64 *)((char *)v17 + (_QWORD)v16 + v19);
    v10[16] = (__int64 *)v18;
    *((_DWORD *)v10 + 36) = v40;
    v10[5] = (__int64 *)a2;
    v10[6] = (__int64 *)((char *)v6 + (_QWORD)a2);
    v10[7] = (__int64 *)((char *)v16 + (_QWORD)v17 + (unsigned __int64)(a2 + 4096));
    *((_DWORD *)v10 + 37) = Flags;
    if( (_DWORD)a6 )
    {
      v30 = (((int)Flags >> 31) & 0xC) + 24;
      if( (Flags & 0x40000000) == 0 )
        v30 = (((int)Flags >> 31) & 0xC) + 8;
      v31 = v30 + 20;
      if( (Flags & 0x20000000) == 0 )
        v31 = v30;
      v32 = v31 + 16;
      if( (Flags & 0x10000000) == 0 )
        v32 = v31;
      v33 = v32 + 24;
      if( (Flags & 0x8000000) == 0 )
        v33 = v32;
      HeaderSize = v33 + 8;
      if( (Flags & 0x2000000) == 0 )
        HeaderSize = v33;
    }
    else
    {
      HeaderSize = AlpcGetHeaderSize((unsigned int)Flags);
      LODWORD(v16) = v35;
      LODWORD(v17) = v36;
      v18 = P;
    }
    *((_DWORD *)v10 + 38) = HeaderSize;
    *((_DWORD *)v15 + 2) = v39;
    *((_DWORD *)v15 + 3) = 4096;
    *((_DWORD *)v15 + 4) = (_DWORD)v16;
    *((_DWORD *)v15 + 5) = (_DWORD)v16 + 4096;
    *((_DWORD *)v15 + 6) = (_DWORD)v17;
    *((_DWORD *)v15 + 7) = (_DWORD)v17 + (_DWORD)v16 + 4096;
    *((_DWORD *)v15 + 8) = v18;
    v15[8] |= 0xFFFFFFui64;
    v15[8] |= 0xFFFFFF000000ui64;
    v15[8] &= 0xFFFFFFFFFFFFui64;
    *((_DWORD *)v15 + 9) = *((_DWORD *)v10 + 37);
    *((_DWORD *)v15 + 10) = *((_DWORD *)v10 + 38);
    v21 = v10[11];
    v22 = v10[12];
    v23 = ((unsigned __int64)v22 + 3) >> 2;
    if( v21 > (__int64 *)((char *)v21 + (_QWORD)v22) )
      v23 = 0i64;
    if( v23 )
    {
      while( v23 )
      {
        *(_DWORD *)v21 = -1;
        v21 = (__int64 *)((char *)v21 + 4);
        --v23;
      }
    }
    ExAcquirePushLockExclusiveEx(a1 + 352, 0i64);
    v8 = 1;
    if( *(_QWORD *)(a1 + 360) )
    {
      v27 = -1073740006;
    }
    else
    {
      v24 = *(_DWORD *)(a1 + 416);
      if( (v24 & 0x40) != 0 )
      {
        v27 = -1073740032;
      }
      else
      {
        v25 = *(void **)(a1 + 32);
        if( v25 )
        {
          CompletionPacketLookaside = AlpcpAllocateCompletionPacketLookaside(v35 >> 3, v25, *(PVOID *)(a1 + 40));
          if( !CompletionPacketLookaside )
          {
            v27 = -1073741670;
            goto LABEL_24;
          }
          AlpcpFreeCompletionPacketLookaside(*(_ALPC_COMPLETION_PACKET_LOOKASIDE **)(a1 + 48));
          *(_QWORD *)(a1 + 48) = CompletionPacketLookaside;
          v24 = *(_DWORD *)(a1 + 416);
        }
        *(_QWORD *)(a1 + 360) = v10;
        v10 = 0i64;
        *(_DWORD *)(a1 + 416) = v24 & 0xFFFFF7FF | ((a6 & 1 | 0x38) << 11);
        v27 = 0;
      }
    }
LABEL_24:
    v28 = 1;
    v9 = 1;
    goto LABEL_25;
  }
  v27 = -1073741670;
  v28 = 1;
  v9 = 1;
LABEL_25:
  if( v8 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 352), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 352));
    KeAbPostRelease((PVOID)(a1 + 352));
  }
  if( v10 )
  {
    if( v28 )
      MmUnlockPages((_MDL *)v10[4]);
    v34 = (_MDL *)v10[4];
    if( v34 )
      IoFreeMdl(v34);
    if( v9 )
      AlpcpUnregisterCompletionListDatabase(v10);
    ExFreePoolWithTag(v10, 0);
  }
  return v27;
}

Referenced by:

NtAlpcSetInformation