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