RtlpComputeCrcInternal

UINT64 __stdcall RtlpComputeCrcInternal(
        VOID *Buffer,
        UINT64 Size,
        UINT64 InitialCrc,
        _CRC_CTRL_TABLE *CrcCtrl,
        _CRC_CTRL_TABLE *CrcCtrla){
  _CRC_CTRL_TABLE *v5; 
  UINT64 v6; 
  __int64 v7; 
  UINT64 v9; 
  char *v10; 
  UINT64 v11; 
  UINT64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  char *v16; 
  __int64 v17; 
  UINT64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  __int64 v47; 
  UINT64 v48; 
  UINT64 v49; 
  UINT64 v50; 
  unsigned __int64 v51; 
  unsigned __int64 v52; 
  unsigned __int64 v53; 
  unsigned __int64 v54; 
  unsigned __int64 v55; 
  unsigned __int64 v56; 
  unsigned __int64 v57; 
  unsigned __int64 v58; 
  unsigned __int64 v59; 
  unsigned __int64 v60; 
  unsigned __int64 v61; 
  unsigned __int64 v62; 
  unsigned __int64 v63; 
  unsigned __int64 v64; 
  unsigned __int64 v65; 
  unsigned __int64 v66; 
  unsigned __int64 v67; 
  unsigned __int64 v68; 
  unsigned __int64 v69; 
  unsigned __int64 v70; 
  unsigned __int64 v71; 
  unsigned __int64 v72; 
  unsigned __int64 v73; 
  unsigned __int64 v74; 
  unsigned __int64 v75; 
  unsigned __int64 v76; 
  unsigned __int64 v77; 
  unsigned __int64 v78; 
  UINT64 v80; 
  char v81; 
  char v82; 
  __int64 v83; 

  v5 = CrcCtrl;
  v6 = 0i64;
  v7 = *((_QWORD *)CrcCtrl + 4);
  v83 = v7;
  v9 = InitialCrc ^ v7;
  v10 = (char *)Buffer;
  v11 = -(int)Buffer & 7;
  if( (-(int)Buffer & 7) != 0 )
  {
    v80 = 0i64;
    if( v11 > Size )
      v11 = Size;
    if( v11 )
    {
      do
      {
        v81 = *((_BYTE *)Buffer + v80++);
        v9 = (v9 >> 8) ^ *(_QWORD *)(*((_QWORD *)v5 + 1) + 8i64 * (unsigned __int8)(v9 ^ v81));
      }
      while( v80 < v11 );
    }
    Size -= v11;
    v10 = (char *)Buffer + v11;
  }
  v12 = Size - (Size & 0x1F);
  if( v12 >= 0x40 )
  {
    Size &= 0x1Fu;
    v13 = 0i64;
    v14 = 0i64;
    v15 = 0i64;
    v16 = &v10[v12 - 32];
    if( v10 < v16 )
    {
      v17 = *((_QWORD *)v5 + 2);
      do
      {
        _mm_prefetcht1(v10 + 256);
        v18 = v9 ^ *(_QWORD *)v10;
        v19 = v15 ^ *((_QWORD *)v10 + 1);
        v20 = v14 ^ *((_QWORD *)v10 + 2);
        v21 = v13 ^ *((_QWORD *)v10 + 3);
        v22 = (unsigned __int8)v18;
        v18 >>= 8;
        v23 = *(_QWORD *)(v17 + 8 * v22 + 14336);
        v24 = (unsigned __int8)v19;
        v19 >>= 8;
        v25 = *(_QWORD *)(v17 + 8 * v24 + 14336);
        v26 = (unsigned __int8)v20;
        v20 >>= 8;
        v27 = *(_QWORD *)(v17 + 8 * v26 + 14336);
        v28 = (unsigned __int8)v21;
        v21 >>= 8;
        v29 = *(_QWORD *)(v17 + 8 * v28 + 14336);
        v30 = (unsigned __int8)v18;
        v18 >>= 8;
        v31 = *(_QWORD *)(v17 + 8 * v30 + 12288) ^ v23;
        v32 = (unsigned __int8)v19;
        v19 >>= 8;
        v33 = *(_QWORD *)(v17 + 8 * v32 + 12288) ^ v25;
        v34 = (unsigned __int8)v20;
        v20 >>= 8;
        v35 = *(_QWORD *)(v17 + 8 * v34 + 12288) ^ v27;
        v36 = (unsigned __int8)v21;
        v21 >>= 8;
        v37 = *(_QWORD *)(v17 + 8 * v36 + 12288) ^ v29;
        v38 = (unsigned __int8)v18;
        v18 >>= 8;
        v39 = *(_QWORD *)(v17 + 8 * v38 + 10240) ^ v31;
        v40 = (unsigned __int8)v19;
        v19 >>= 8;
        v41 = *(_QWORD *)(v17 + 8 * v40 + 10240) ^ v33;
        v42 = (unsigned __int8)v20;
        v20 >>= 8;
        v43 = *(_QWORD *)(v17 + 8 * v42 + 10240) ^ v35;
        v44 = (unsigned __int8)v21;
        v21 >>= 8;
        v45 = *(_QWORD *)(v17 + 8 * v44 + 10240) ^ v37;
        v46 = (unsigned __int8)v21;
        v21 >>= 8;
        v10 += 32;
        v9 = *(_QWORD *)(v17 + 8 * HIDWORD(v18)) ^ *(_QWORD *)(v17 + 8i64 * BYTE3(v18) + 2048) ^ *(_QWORD *)(v17 + 8i64 * BYTE2(v18) + 4096) ^ *(_QWORD *)(v17 + 8i64 * BYTE1(v18) + 6144) ^ *(_QWORD *)(v17 + 8i64 * (unsigned __int8)v18 + 0x2000) ^ v39;
        v15 = *(_QWORD *)(v17 + 8 * HIDWORD(v19)) ^ *(_QWORD *)(v17 + 8i64 * BYTE3(v19) + 2048) ^ *(_QWORD *)(v17 + 8i64 * BYTE2(v19) + 4096) ^ *(_QWORD *)(v17 + 8i64 * BYTE1(v19) + 6144) ^ *(_QWORD *)(v17 + 8i64 * (unsigned __int8)v19 + 0x2000) ^ v41;
        v14 = *(_QWORD *)(v17 + 8 * HIDWORD(v20)) ^ *(_QWORD *)(v17 + 8i64 * BYTE3(v20) + 2048) ^ *(_QWORD *)(v17 + 8i64 * BYTE2(v20) + 4096) ^ *(_QWORD *)(v17 + 8i64 * BYTE1(v20) + 6144) ^ *(_QWORD *)(v17 + 8i64 * (unsigned __int8)v20 + 0x2000) ^ v43;
        v13 = *(_QWORD *)(v17 + 8 * (v21 >> 24)) ^ *(_QWORD *)(v17 + 8i64 * BYTE2(v21) + 2048) ^ *(_QWORD *)(v17 + 8i64 * BYTE1(v21) + 4096) ^ *(_QWORD *)(v17 + 8i64 * (unsigned __int8)v21 + 6144) ^ *(_QWORD *)(v17 + 8 * v46 + 0x2000) ^ v45;
      }
      while( v10 < v16 );
      v7 = v83;
      v5 = CrcCtrl;
    }
    v47 = *((_QWORD *)v5 + 1);
    v48 = ((v9 ^ *(_QWORD *)v10) >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)(v9 ^ *v10));
    v49 = (v48 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v48);
    v50 = (v49 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v49);
    v51 = (v50 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v50);
    v52 = (v51 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v51);
    v53 = (v52 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v52);
    v54 = (v53 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v53);
    v55 = v15 ^ *((_QWORD *)v10 + 1) ^ (v54 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v54);
    v56 = (v55 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v55);
    v57 = (v56 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v56);
    v58 = (v57 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v57);
    v59 = (v58 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v58);
    v60 = (v59 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v59);
    v61 = (v60 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v60);
    v62 = (v61 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v61);
    v63 = v14 ^ *((_QWORD *)v10 + 2) ^ (v62 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v62);
    v64 = (v63 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v63);
    v65 = (v64 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v64);
    v66 = (v65 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v65);
    v67 = (v66 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v66);
    v68 = (v67 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v67);
    v69 = (v68 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v68);
    v70 = (v69 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v69);
    v71 = v13 ^ *((_QWORD *)v10 + 3) ^ (v70 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v70);
    v72 = (v71 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v71);
    v73 = (v72 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v72);
    v74 = (v73 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v73);
    v75 = (v74 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v74);
    v76 = (v75 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v75);
    v77 = (v76 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v76);
    v78 = (v77 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v77);
    v9 = (v78 >> 8) ^ *(_QWORD *)(v47 + 8i64 * (unsigned __int8)v78);
    v10 += 32;
  }
  if( Size )
  {
    do
    {
      v82 = v10[v6++];
      v9 = (v9 >> 8) ^ *(_QWORD *)(*((_QWORD *)v5 + 1) + 8i64 * (unsigned __int8)(v9 ^ v82));
    }
    while( v6 < Size );
  }
  return v9 ^ v7;
}

Referenced by:

MdlInvariantPostProcessing1
MdlInvariantPreProcessing1
PopEnsureErratumSubscribed
RtlCrc32
RtlCrc64