AlpcReferenceBlobByHandle
_EX_PUSH_LOCK *__fastcall AlpcReferenceBlobByHandle(
_ALPC_HANDLE_TABLE *HandleTable,
VOID *Handle,
const _BLOB_TYPE *ResourceType){
int v4;
_EX_PUSH_LOCK *p_Lock;
_EX_PUSH_LOCK *Object;
__int64 v8;
int v10[10];
v4 = (int)Handle;
if( !HandleTable )
return 0i64;
p_Lock = &HandleTable->Lock;
ExAcquirePushLockSharedEx((UINT64)&HandleTable->Lock, 0i64);
if( (unsigned int)(v4 - 16) < HandleTable->TotalHandles
&& (Object = (_EX_PUSH_LOCK *)HandleTable->Handles[v4 - 16].Object) != 0i64
&& *((unsigned __int8 *)&Object[-4].0 + 1) == ResourceType->ResourceId
&& (LODWORD(v8) = AlpcpReferenceBlob(Object), v8) )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)p_Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)p_Lock);
KeAbPostRelease(p_Lock);
if( (*(_BYTE *)&Object[-4].0 & 4) != 0 )
{
_InterlockedOr(v10, 0);
if( (Object[-2].Value & 1) != 0 )
ExfAcquireReleasePushLockExclusive(&Object[-2]);
}
return Object;
}
else
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)p_Lock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)p_Lock);
KeAbPostRelease(p_Lock);
return 0i64;
}
}Referenced by:
AlpcpCaptureSecurityAttributeInternal
AlpcpCaptureViewAttributeInternal
AlpcpLookupMessage
NtAlpcCreateSectionView
NtAlpcDeletePortSection
NtAlpcDeleteResourceReserve
NtAlpcDeleteSecurityContext
NtAlpcRevokeSecurityContext