CmpCaptureKeyValueArray
INT64 __fastcall CmpCaptureKeyValueArray(INT64 a1, UINT64 a2, CHAR a3, struct _PRIVILEGE_SET **a4, UINT8 **a5){
unsigned int v5;
unsigned int v6;
struct _PRIVILEGE_SET *TransientPoolWithQuotaTag;
unsigned __int64 v9;
UINT64 v10;
__int64 v11;
unsigned __int64 v12;
VOID **v13;
__int64 v14;
__int16 v15;
unsigned int v16;
__int128 v17;
UINT8 *v18;
__int64 v19;
unsigned int i;
unsigned __int16 *v21;
int v23;
unsigned __int16 v24;
unsigned __int16 *Src;
UINT8 *Srca;
ULONGLONG ullAugend[3];
__int128 v28;
unsigned __int64 v29;
unsigned __int64 v30;
__int64 v31;
unsigned int v32;
v32 = a2;
v5 = a3;
v6 = a2;
TransientPoolWithQuotaTag = 0i64;
if( !(_DWORD)a2 )
goto LABEL_34;
TransientPoolWithQuotaTag = (struct _PRIVILEGE_SET *)CmpAllocateTransientPoolWithQuotaTag(
a1,
32i64 * (unsigned int)a2,
0x33384D43ui64);
ullAugend[2] = (ULONGLONG)TransientPoolWithQuotaTag;
if( !TransientPoolWithQuotaTag )
goto LABEL_38;
v10 = 0i64;
ullAugend[0] = 0i64;
v11 = 0i64;
v23 = 0;
while( (unsigned int)v11 < v6 )
{
Src = (unsigned __int16 *)((char *)TransientPoolWithQuotaTag + 32 * v11);
v9 = a1 + 24i64 * (unsigned int)v11;
v29 = v9;
v12 = *(_QWORD *)v9;
v30 = *(_QWORD *)v9;
if( (_BYTE)v5 )
{
v28 = 0i64;
if( v12 >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
LODWORD(v28) = *(_DWORD *)v12;
*((_QWORD *)&v28 + 1) = *(_QWORD *)(v12 + 8);
v13 = (VOID **)((char *)TransientPoolWithQuotaTag + 32 * v11);
*(_OWORD *)Src = v28;
v14 = *Src;
v15 = v14;
if( (_WORD)v14 )
{
v9 = *((_QWORD *)Src + 1);
if( (v9 & 1) != 0 )
ExRaiseDatatypeMisalignment();
if( v9 + v14 > 0x7FFFFFFF0000i64 || v9 + v14 < v9 )
{
MEMORY[0x7FFFFFFF0000] = 0;
LOWORD(v14) = *Src;
v15 = *Src;
}
}
if( (v15 & 1) != 0 )
{
v16 = -1073741811;
goto LABEL_35;
}
}
else
{
v17 = *(_OWORD *)v12;
v13 = (VOID **)((char *)TransientPoolWithQuotaTag + 32 * v11);
*(_OWORD *)Src = v17;
LOWORD(v14) = *Src;
v15 = *Src;
}
if( v15 )
{
if( CmpDoesBufferRequireCapturing(v5, v13[1])
&& RtlULongLongAdd(ullAugend[0], (unsigned __int16)v14, ullAugend) < 0 )
{
v16 = -1073741670;
goto LABEL_35;
}
}
else
{
v13[1] = 0i64;
*((_WORD *)v13 + 1) = 0;
}
v11 = (unsigned int)++v23;
v10 = ullAugend[0];
v6 = v32;
}
if( !v10 )
{
*a4 = TransientPoolWithQuotaTag;
TransientPoolWithQuotaTag = 0i64;
LABEL_34:
v16 = 0;
goto LABEL_35;
}
v18 = (UINT8 *)CmpAllocateTransientPoolWithQuotaTag(v9, v10, 0x33384D43ui64);
ullAugend[1] = (ULONGLONG)v18;
if( v18 )
{
v19 = 0i64;
for( i = 0; i < v6; ++i )
{
v21 = (unsigned __int16 *)((char *)TransientPoolWithQuotaTag + 32 * i);
v24 = *v21;
if( *v21 )
{
Srca = (UINT8 *)*((_QWORD *)v21 + 1);
if( CmpDoesBufferRequireCapturing((unsigned int)a3, Srca) )
{
memmove(&v18[v19], Srca, v24);
*((_QWORD *)v21 + 1) = &v18[v19];
v21[1] = *v21;
v19 += *v21;
v31 = v19;
v6 = v32;
}
}
}
*a4 = TransientPoolWithQuotaTag;
TransientPoolWithQuotaTag = 0i64;
*a5 = v18;
goto LABEL_34;
}
LABEL_38:
v16 = -1073741670;
LABEL_35:
if( TransientPoolWithQuotaTag )
CmSiFreeMemory(TransientPoolWithQuotaTag);
return v16;
}Referenced by:
NtQueryMultipleValueKey