RtlpComputeCrcInternal

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

Referenced by:

MdlInvariantPostProcessing1
MdlInvariantPreProcessing1
PopEnsureErratumSubscribed
RtlCrc32
RtlCrc64