PopHiberChecksumHiberFileData

VOID __stdcall PopHiberChecksumHiberFileData(
        _POP_HIBER_CONTEXT *HiberContext,
        UINT8 Create,
        UINT64 FileOffset,
        VOID *Buffer,
        UINT64 Size){
  unsigned __int64 v7; 
  UINT64 v8; 
  unsigned __int64 v9; 
  UINT64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  wchar_t *IoChecksums; 
  int v14; 
  unsigned __int64 v15; 
  unsigned __int64 v16; 

  v7 = __rdtsc();
  if( HiberContext->IoChecksums )
  {
    v8 = Create ? HiberContext->IoChecksumsSize >> 1 : HiberContext->IoInfo.HighestChecksumIndex;
    v9 = FileOffset >> 9;
    if( FileOffset >> 9 < v8 )
    {
      v10 = Size;
      if( (Size & 0x1FF) != 0 )
        v10 = Size - (Size & 0x1FF) + 512;
      v11 = (v10 >> 9) + v9;
      if( v11 >= v8 )
        v11 = v8;
      v12 = 0i64;
      while( v9 < v11 )
      {
        IoChecksums = HiberContext->IoChecksums;
        tcpxsum(0i64);
        if( Create )
        {
          IoChecksums[v9] = v14;
        }
        else
        {
          if( IoChecksums[v9] != v14 )
          {
            PopCheckpointSystemSleep(PopSleepCheckpointChecksumFailure);
            KeBugCheckEx(
              0xA0u,
              (PVOID)0x10E,
              (PVOID)0xA,
              (PVOID)IoChecksums[v9],
              (PVOID)HiberContext->IoInfo.PreviousChecksum);
          }
          LOWORD(v14) = IoChecksums[v9];
        }
        v12 += 512i64;
        HiberContext->IoInfo.PreviousChecksum = v14;
        ++v9;
      }
      if( Create )
        HiberContext->IoInfo.HighestChecksumIndex = v9;
      v15 = __rdtsc();
      v16 = (((unsigned __int64)HIDWORD(v15) << 32) | (unsigned int)v15) - v7;
      if( Create )
        *(&stru_140C23628 + 56) += v16;
      else
        *(&stru_140C23628 + 96) += v16;
    }
  }
}

Referenced by:

PopRequestRead
PopRequestWrite