AlpcpPortQueryConnectedSidInfo
INT64 __fastcall AlpcpPortQueryConnectedSidInfo(
_ALPC_PORT *PortObject,
VOID *Sid,
VOID *Length,
UINT64 *ReturnLength,
INT64 PreviousMode){
UINT8 v8;
PVOID *v9;
INT64 result;
_DMA_OPERATIONS *DmaOperations;
_ALPC_PORT *v12;
struct _DMA_ADAPTER *v13;
INT64 *v14;
struct DMA_ADAPTER *v15;
unsigned int v16;
VOID *Sid1;
char Sid2[80];
Sid1 = 0i64;
memset((INT64)Sid2, 0i64);
if( !PortObject )
return 3221225485i64;
if( !(_BYTE)PreviousMode )
{
if( ReturnLength )
*(_DWORD *)ReturnLength = 0;
Sid1 = Sid;
goto LABEL_6;
}
if( ReturnLength )
*(_DWORD *)ReturnLength = 0;
LODWORD(result) = SeCaptureSid(Sid, PreviousMode, v8, v9);
if( (int)result >= 0 )
{
LABEL_6:
DmaOperations = 0i64;
v12 = AlpcpReferenceConnectedPort(PortObject);
v13 = (struct _DMA_ADAPTER *)v12;
if( v12 )
{
v14 = (INT64 *)((char *)v12 + 352);
ExAcquirePushLockSharedEx((UINT64)v12 + 352, 0i64);
if( ((__int64)v13[1].DmaOperations & 1) == 0 )
DmaOperations = v13[1].DmaOperations;
if( DmaOperations )
ObfReferenceObjectWithTag(DmaOperations, 0x63706C41u);
if( _InterlockedCompareExchange64(v14, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v14);
KeAbPostRelease(v14);
HalPutDmaAdapter(v13);
}
if( DmaOperations )
{
v15 = (struct DMA_ADAPTER *)PsReferencePrimaryToken((PEPROCESS)DmaOperations);
SeQueryUserSidToken(v15, Sid2, 0x44ui64, 0i64);
ObFastDereferenceObject((INT64 *)&DmaOperations[3].AllocateCommonBufferWithBounds, v15);
LOBYTE(v15) = RtlEqualSid(Sid1, Sid2);
ObfDereferenceObjectWithTag(DmaOperations, 0x63706C41ui64);
v16 = (_BYTE)v15 == 0 ? 0xC00002A0 : 0;
}
else
{
v16 = -1073741769;
}
if( Sid1 != Sid )
SeReleaseSid(Sid1, PreviousMode, 1u);
return v16;
}
return result;
}Referenced by:
NtAlpcQueryInformation