AlpcpCreateView
VOID __stdcall AlpcpCreateView(_KALPC_REGION *Region, _ALPC_PORT *OwnerPort, _KALPC_VIEW **ViewPointer){
_DWORD *v3;
unsigned __int64 v7;
UINT64 v8;
CHAR *Blob;
_KALPC_VIEW *v10;
INT64 v11;
bool v12;
int v13;
__int64 v14;
_LARGE_INTEGER *SectionOffset;
INT64 v16;
INT64 v17;
INT64 v18;
INT64 v19;
int v20;
_LARGE_INTEGER v21;
VOID *MappedBase;
UINT64 ViewSize;
v3 = (_DWORD *)*((_QWORD *)Region + 2);
MappedBase = 0i64;
v21.QuadPart = 0i64;
*ViewPointer = 0i64;
AlpcpLockForCachedReferenceBlob(v3);
if( (*((_DWORD *)OwnerPort + 104) & 0x20) == 0 )
{
v7 = *((_QWORD *)OwnerPort + 38);
v8 = *((_QWORD *)OwnerPort + 3);
if( (!v7 || v7 >= *((_QWORD *)Region + 5))
&& ((*((_DWORD *)Region + 12) & 1) == 0 || *((_DWORD *)Region + 13) < 2u && !*((_QWORD *)Region + 10)) )
{
Blob = AlpcpAllocateBlob(&AlpcViewType, 0x60ui64, 0i64);
v10 = (_KALPC_VIEW *)Blob;
if( Blob )
{
memset((INT64)Blob, 0i64);
v12 = (*((_DWORD *)OwnerPort + 64) & 0x100000) == 0;
v21 = *(_LARGE_INTEGER *)((char *)Region + 24);
ViewSize = *((_QWORD *)Region + 5);
if( v12 )
{
if( (v3[12] & 2) != 0 )
v13 = MmMapSecureViewOfSection(
*(_QWORD *)v3,
v8,
(INT64 *)&MappedBase,
v11,
(INT64)SectionOffset,
(UINT64 *)&v21.QuadPart,
(INT64 *)&ViewSize,
v16,
v17,
v18,
v19,
(INT64)v10 + 56);
else
v13 = MmMapViewOfSection(**((_LOADER_PARAMETER_BLOCK ***)Region + 2), v8);
v20 = 0;
}
else
{
v13 = MiMapViewInSystemSpace(*(VOID **)v3, &Session, &MappedBase, &ViewSize, &v21, 0i64);
v20 = 8;
}
if( v13 >= 0 )
{
AlpcpReferenceBlob(v10);
*((_QWORD *)v10 + 5) = MappedBase;
*((_QWORD *)v10 + 6) = ViewSize;
*((_DWORD *)v10 + 18) = v20 | *((_DWORD *)v10 + 18) & 0xFFFFFFF7 | 1;
ObfReferenceObjectWithTag((PVOID)v8, 0x63706C41u);
*((_QWORD *)v10 + 4) = v8;
ObfReferenceObject(OwnerPort);
*((_QWORD *)v10 + 3) = OwnerPort;
AlpcpReferenceBlob(Region);
*((_QWORD *)v10 + 2) = Region;
v14 = *((_QWORD *)Region + 8);
*(_QWORD *)v10 = (char *)Region + 56;
*((_QWORD *)v10 + 1) = v14;
**((_QWORD **)Region + 8) = v10;
++*((_DWORD *)Region + 13);
*((_QWORD *)Region + 8) = v10;
AlpcpInsertResourcePort(OwnerPort, v10);
ExAcquirePushLockExclusiveEx(v8 + 2048, 0i64);
*((_QWORD *)v10 + 11) = *(_QWORD *)(v8 + 2064);
*((_QWORD *)v10 + 10) = v8 + 2056;
**(_QWORD **)(v8 + 2064) = (char *)v10 + 80;
*(_QWORD *)(v8 + 2064) = (char *)v10 + 80;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v8 + 2048), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v8 + 2048));
KeAbPostRelease((PVOID)(v8 + 2048));
if( (*((_DWORD *)Region + 12) & 1) != 0 )
*((_QWORD *)Region + 10) = v10;
*ViewPointer = v10;
}
else
{
AlpcpDereferenceBlobEx(v10, 1i64);
}
}
}
}
AlpcpUnlockBlob(v3);
}Referenced by:
AlpcpCreateSectionView
AlpcpExposeViewAttributeInSenderContext