AlpcpCaptureHandleAttributeInternal
INT64 __fastcall AlpcpCaptureHandleAttributeInternal(CHAR *a1, INT64 a2){
CHAR *v2;
CHAR v3;
__int64 v4;
CHAR *v5;
CHAR *PoolWithTag;
CHAR *Blob;
_EPROCESS *v8;
NTSTATUS v9;
__int64 j;
int v11;
unsigned __int64 v13;
__int64 v14;
__int64 i;
CHAR *v16;
_DWORD *v17;
CHAR PreviousMode;
__int64 v20;
v2 = a1;
v3 = *((_BYTE *)KeGetCurrentThread() + 562);
PreviousMode = v3;
if( (*(_DWORD *)a1 & 0xFFF0FFFF) != 0 )
return 3221225485i64;
LODWORD(v4) = 1;
v5 = 0i64;
PoolWithTag = 0i64;
if( (*(_DWORD *)a1 & 0x40000) != 0 )
{
v4 = *((unsigned int *)a1 + 4);
if( (unsigned int)v4 > 0x200 )
return 3221227298i64;
if( (unsigned int)v4 > 1 )
{
PoolWithTag = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, 24 * v4, 0x4863704Cui64);
if( !PoolWithTag )
return 3221225495i64;
v13 = *((_QWORD *)v2 + 1);
if( *((_BYTE *)KeGetCurrentThread() + 562) )
{
v14 = 16i64 * (unsigned int)v4;
if( v14 )
{
if( (v13 & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( v14 + v13 > 0x7FFFFFFF0000i64 || v14 + v13 < v13 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
for( i = 0i64; (unsigned int)i < (unsigned int)v4; i = (unsigned int)(i + 1) )
{
v16 = &PoolWithTag[24 * i];
v17 = (_DWORD *)(v13 + 16i64 * (unsigned int)i);
*(_DWORD *)v16 = *v17;
*((_QWORD *)v16 + 1) = (unsigned int)v17[1];
*((_DWORD *)v16 + 4) = v17[2];
*((_DWORD *)v16 + 5) = v17[3];
if( (*(_DWORD *)v16 & 0xFFF4FFFF) != 0 )
{
v9 = -1073741811;
goto LABEL_12;
}
}
v2 = PoolWithTag;
goto LABEL_3;
}
return 3221225485i64;
}
LABEL_3:
Blob = AlpcpAllocateBlob(&AlpcHandleDataType, 48i64 * (unsigned int)v4, 0i64);
v5 = Blob;
if( Blob )
{
memset((INT64)Blob, 0i64);
*((_DWORD *)v5 + 1) = v4;
if( v3 )
v8 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
else
v8 = (_EPROCESS *)PsInitialSystemProcess;
v9 = 0;
for( j = 0i64; ; j = (unsigned int)(j + 1) )
{
if( (unsigned int)j >= (unsigned int)v4 )
{
*(_QWORD *)(a2 + 48) = v5;
v5 = 0i64;
goto LABEL_12;
}
v20 = 48 * j;
v9 = ObCaptureObjectStateForDuplication(
v8,
*(PVOID *)&v2[24 * j + 8],
*(unsigned int *)&v2[24 * j + 20],
(*(_DWORD *)&v2[24 * j] & 0x10000 | 0x40000u) >> 15,
PreviousMode,
(_OB_DUPLICATE_OBJECT_STATE *)&v5[48 * j + 8]);
if( v9 >= 0 )
{
v11 = *(_DWORD *)(ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(*(_QWORD *)&v5[v20 + 24]
- 24i64) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(*(_QWORD *)&v5[v20 + 24] - 48) >> 8)]
+ 68);
*(_DWORD *)&v5[v20] = v11;
if( (v11 & 0xFFD) == 0 )
break;
}
}
v9 = -1073741790;
}
else
{
v9 = -1073741670;
}
LABEL_12:
if( v5 )
AlpcpDereferenceBlobEx(v5, 1i64);
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x4863704Cu);
return(unsigned int)v9;
}Referenced by:
AlpcpCaptureHandleAttribute
AlpcpCaptureHandleAttribute32