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