CmpDoReadTxRBigLogRecord

__int64 __fastcall CmpDoReadTxRBigLogRecord(void *a1, void *a2, unsigned int a3, _PRIVILEGE_SET **a4, size_t *a5){
  _DWORD *v5; 
  int v6; 
  size_t v7; 
  _PRIVILEGE_SET *TransientPoolWithTag; 
  _PRIVILEGE_SET *v9; 
  _PRIVILEGE_SET *v10; 
  int v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned int v15; 
  _PRIVILEGE_SET *v16; 
  PVOID ppvBuffer; 
  _CLS_LSN plsnRecord; 
  _CLS_LSN plsnPrevious; 
  _CLS_LSN plsnUndoNext; 
  unsigned int pcbBuffer; 
  unsigned __int8 peRecordType; 
  _PRIVILEGE_SET **v24; 

  v24 = a4;
  ppvBuffer = a2;
  v5 = a2;
  plsnUndoNext.ullOffset = 0i64;
  plsnPrevious.ullOffset = 0i64;
  plsnRecord.ullOffset = 0i64;
  peRecordType = 0;
  pcbBuffer = a3;
  v6 = CmpVerifyBigLogRecordChunk((INT64 *)a2, a3);
  if( v6 >= 0 )
  {
    v7 = v5[1];
    v15 = v5[12];
    TransientPoolWithTag = (_PRIVILEGE_SET *)CmpAllocateTransientPoolWithTag(1ui64, v7);
    v9 = TransientPoolWithTag;
    if( TransientPoolWithTag )
    {
      memset(TransientPoolWithTag, 0i64, v7);
      v10 = v9;
      v11 = 0;
      v12 = v7;
      v16 = v9;
      if( !v5[13] )
      {
        do
        {
          v13 = (unsigned int)v5[14];
          if( (unsigned int)v13 > v12 )
            break;
          memmove(v10, v5 + 16, v13);
          v16 = (_PRIVILEGE_SET *)((char *)v16 + v13);
          v12 -= v13;
          if( ++v11 >= v15 )
          {
            if( v12 )
              break;
            *v24 = v9;
            v9 = 0i64;
            v6 = 0;
            *a5 = v7;
            goto LABEL_11;
          }
          peRecordType = 1;
          v6 = ClfsReadNextLogRecord(
                 a1,
                 &ppvBuffer,
                 &pcbBuffer,
                 &peRecordType,
                 0i64,
                 &plsnUndoNext,
                 &plsnPrevious,
                 &plsnRecord);
          if( v6 < 0 )
            goto LABEL_11;
          v5 = ppvBuffer;
          v6 = CmpVerifyBigLogRecordChunk((INT64 *)ppvBuffer, pcbBuffer);
          if( v6 < 0 )
            goto LABEL_11;
          v10 = v16;
        }
        while( v5[13] == v11 );
      }
      v6 = -1073741762;
LABEL_11:
      if( v9 )
        CmSiFreeMemory(v9);
    }
    else
    {
      return(unsigned int)-1073741670;
    }
  }
  return(unsigned int)v6;
}

Referenced by:

CmpRmReDoPhase