AlpcpCreateSecurityContext
INT64 __fastcall AlpcpCreateSecurityContext(
_ALPC_PORT *PortObject,
INT64 AllocateHandle,
_SECURITY_QUALITY_OF_SERVICE *SecurityQos,
_KALPC_SECURITY_DATA **SecurityDataPoINTer){
char v6;
void *v8;
void *v9;
CHAR *Blob;
_QWORD *v11;
int ClientSecurity;
volatile signed __int64 *v13;
_ALPC_HANDLE_TABLE *v14;
__int64 v15;
_ALPC_HANDLE_ENTRY HandleEntry[7];
_QWORD *v18;
v6 = (char)SecurityQos;
IoThreadToProcess((_ETHREAD *)AllocateHandle);
v9 = v8;
Blob = AlpcpAllocateBlob(&AlpcSecurityType, 0x70ui64, 0i64);
v11 = Blob;
if( !Blob )
return 3221225626i64;
memset((INT64)Blob, 0i64);
v11[1] = -1i64;
ClientSecurity = AlpcpChargePagedPoolQuota((__int64)v9, 0xA0ui64);
if( ClientSecurity >= 0 )
{
ClientSecurity = SeCreateClientSecurity(
(PETHREAD)AllocateHandle,
(PSECURITY_QUALITY_OF_SERVICE)SecurityDataPoINTer,
0,
(PSECURITY_CLIENT_CONTEXT)(v11 + 4));
if( ClientSecurity < 0 )
{
AlpcpReleasePagedPoolQuota((ULONG_PTR)v9, 0xA0ui64);
}
else
{
ObfReferenceObjectWithTag(v9, 0x63706C41u);
v11[2] = v9;
if( !v6 )
{
LABEL_10:
*v18 = v11;
return 0i64;
}
v13 = (volatile signed __int64 *)((char *)PortObject + 352);
ExAcquirePushLockSharedEx((UINT64)PortObject + 352, 0i64);
if( (*((_DWORD *)PortObject + 104) & 0x20) == 0 )
{
ExAcquirePushLockExclusiveEx((UINT64)(v11 - 2), 0i64);
*((_BYTE *)v11 - 32) |= 4u;
AlpcpReferenceBlob(v11);
v14 = (_ALPC_HANDLE_TABLE *)(*((_QWORD *)PortObject + 2) + 40i64);
HandleEntry[0].Object = v11;
*v11 = v14;
LODWORD(v15) = AlpcAddHandleTableEntry(v14, HandleEntry);
v11[1] = v15;
if( v15 != -1 )
{
ObfReferenceObject(PortObject);
v11[3] = PortObject;
AlpcpInsertResourcePort(PortObject, v11);
if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)PortObject + 44);
KeAbPostRelease((char *)PortObject + 352);
AlpcpEndInitialization(v11);
goto LABEL_10;
}
if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)PortObject + 44);
KeAbPostRelease((char *)PortObject + 352);
*v11 = 0i64;
AlpcpEndInitialization(v11);
AlpcpDereferenceBlobEx(v11, 2i64);
return 3221225626i64;
}
if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)PortObject + 44);
KeAbPostRelease((char *)PortObject + 352);
ClientSecurity = -1073741670;
}
}
AlpcpDereferenceBlobEx(v11, 1i64);
return(unsigned int)ClientSecurity;
}Referenced by:
AlpcCreateSecurityContext
AlpcpCaptureSecurityAttributeInternal
NtAlpcCreateSecurityContext