CmpCaptureKeyValueArray

__int64 __fastcall CmpCaptureKeyValueArray(__int64 a1, unsigned int a2, char a3, _PRIVILEGE_SET **a4, _QWORD *a5){
  unsigned int v5; 
  unsigned int v6; 
  _PRIVILEGE_SET *TransientPoolWithQuotaTag; 
  unsigned __int64 v9; 
  UINT64 v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  VOID **v13; 
  __int64 v14; 
  __int16 v15; 
  unsigned int v16; 
  __int128 v17; 
  char *v18; 
  __int64 v19; 
  unsigned int i; 
  unsigned __int16 *v21; 
  int v23; 
  unsigned __int16 v24; 
  unsigned __int16 *Src; 
  VOID *Srca; 
  UINT64 ullAugend[3]; 
  __int128 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 

  v5 = a3;
  v6 = a2;
  TransientPoolWithQuotaTag = 0i64;
  if( !a2 )
    goto LABEL_34;
  TransientPoolWithQuotaTag = (_PRIVILEGE_SET *)CmpAllocateTransientPoolWithQuotaTag(a1, 32i64 * a2, 0x33384D43ui64);
  ullAugend[2] = (UINT64)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 = a2;
  }
  if( !v10 )
  {
    *a4 = TransientPoolWithQuotaTag;
    TransientPoolWithQuotaTag = 0i64;
LABEL_34:
    v16 = 0;
    goto LABEL_35;
  }
  v18 = (char *)CmpAllocateTransientPoolWithQuotaTag(v9, v10, 0x33384D43ui64);
  ullAugend[1] = (UINT64)v18;
  if( v18 )
  {
    v19 = 0i64;
    for( i = 0; i < v6; ++i )
    {
      v21 = (unsigned __int16 *)((char *)TransientPoolWithQuotaTag + 32 * i);
      v24 = *v21;
      if( *v21 )
      {
        Srca = (VOID *)*((_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 = a2;
        }
      }
    }
    *a4 = TransientPoolWithQuotaTag;
    TransientPoolWithQuotaTag = 0i64;
    *a5 = v18;
    goto LABEL_34;
  }
LABEL_38:
  v16 = -1073741670;
LABEL_35:
  if( TransientPoolWithQuotaTag )
    CmSiFreeMemory(TransientPoolWithQuotaTag);
  return v16;
}

Referenced by:

NtQueryMultipleValueKey