CmpDoReadTxRBigLogRecord

__int64 __fastcall CmpDoReadTxRBigLogRecord(void *a1, void *a2, ULONG a3, struct _PRIVILEGE_SET **a4, _DWORD *a5){
  UINT8 *v5; 
  int v6; 
  _CHILD_LIST *v7; 
  unsigned int v8; 
  INT64 v9; 
  struct _PRIVILEGE_SET *v10; 
  UINT8 *v11; 
  int v12; 
  unsigned int v13; 
  __int64 v14; 
  unsigned int v16; 
  struct _PRIVILEGE_SET *v17; 
  PVOID ppvBuffer; 
  __int64 plsnRecord; 
  __int64 plsnPrevious; 
  __int64 plsnUndoNext; 
  ULONG pcbBuffer; 
  CLS_RECORD_TYPE peRecordType; 
  struct _PRIVILEGE_SET **v25; 
  v25 = a4;
  ppvBuffer = a2;
  v5 = (UINT8 *)a2;
  plsnUndoNext = 0i64;
  plsnPrevious = 0i64;
  plsnRecord = 0i64;
  peRecordType = 0;
  pcbBuffer = a3;
  v6 = CmpVerifyBigLogRecordChunk((INT64 *)a2, a3);
  if( v6 >= 0 )
  {
    v8 = *((_DWORD *)v5 + 1);
    v16 = *((_DWORD *)v5 + 12);
    CmpAllocateTransientPoolWithTag((_HHIVE *)1, v8, 0x20204D43ui64, v7);
    v10 = (struct _PRIVILEGE_SET *)v9;
    if( v9 )
    {
      memset(v9, 0i64);
      v11 = (UINT8 *)v10;
      v12 = 0;
      v13 = v8;
      v17 = v10;
      if( !*((_DWORD *)v5 + 13) )
      {
        do
        {
          v14 = *((unsigned int *)v5 + 14);
          if( (unsigned int)v14 > v13 )
            break;
          memmove(v11, v5 + 64, (unsigned int)v14);
          v17 = (struct _PRIVILEGE_SET *)((char *)v17 + v14);
          v13 -= v14;
          if( ++v12 >= v16 )
          {
            if( v13 )
              break;
            *v25 = v10;
            v10 = 0i64;
            v6 = 0;
            *a5 = v8;
            goto LABEL_11;
          }
          peRecordType = 1;
          v6 = ClfsReadNextLogRecord(
                 a1,
                 &ppvBuffer,
                 &pcbBuffer,
                 &peRecordType,
                 0i64,
                 (PCLFS_LSN)&plsnUndoNext,
                 (PCLFS_LSN)&plsnPrevious,
                 (PCLFS_LSN)&plsnRecord);
          if( v6 < 0 )
            goto LABEL_11;
          v5 = (UINT8 *)ppvBuffer;
          v6 = CmpVerifyBigLogRecordChunk((INT64 *)ppvBuffer, pcbBuffer);
          if( v6 < 0 )
            goto LABEL_11;
          v11 = (UINT8 *)v17;
        }
        while( *((_DWORD *)v5 + 13) == v12 );
      }
      v6 = -1073741762;
LABEL_11:
      if( v10 )
        CmSiFreeMemory(v10);
    }
    else
    {
      return(unsigned int)-1073741670;
    }
  }
  return(unsigned int)v6;
}

Referenced by:

CmpRmReDoPhase