SmFixSingleBitCorruption

NTSTATUS __stdcall SmFixSingleBitCorruption(UINT8 *a1, UINT64 a2, INT64 a3){
  UINT8 *v3; 
  UINT64 v4; 
  __int64 v5; 
  UINT64 v6; 
  UINT64 v7; 
  UINT8 *v10; 
  char v11; 
  char v12; 
  NTSTATUS result; 
  UINT8 v14; 
  __int64 v15; 
  int v16; 

  v16 = a3;
  v3 = a1 - 1;
  v4 = 8 * a2;
  v5 = 0i64;
  v6 = 0i64;
  v7 = 0i64;
  if( !(8 * a2) )
    return 0;
  do
  {
    v10 = v3 + 1;
    v11 = v7 & 7;
    if( (v7 & 7) != 0 )
      v10 = v3;
    v15 = 0i64;
    v3 = v10;
    v12 = 1 << v11;
    v14 = (1 << v11) ^ *v10;
    *v10 = v14;
    MetroHash64::Hash(a1, a2, (unsigned __int8 *const)&v15);
    if( (_DWORD)v15 == v16 )
    {
      ++v5;
      v6 = v7;
    }
    ++v7;
    *v3 = v14 ^ v12;
  }
  while( v7 < v4 );
  if( v5 != 1 )
    return 0;
  result = 1;
  a1[v6 >> 3] ^= 1 << (v6 & 7);
  return result;
}

Referenced by:

ST_STORE::StDmHandleDecompressionFailure