HvpApplyIncrementalLogFile
INT64 __fastcall HvpApplyIncrementalLogFile(
INT64 a1,
INT64 a2,
UINT64 a3,
INT64 a4,
UINT64 *a5,
INT64 a6,
INT64 a7,
INT64 a8,
INT64 a9,
_RTL_BITMAP *a10,
_DWORD *a11,
_DWORD *a12,
UINT64 *a13){
_HHIVE *v13;
int v14;
int v15;
unsigned int v17;
char v18;
INT64 result;
UINT64 v20;
_DWORD *v21;
bool v22;
UINT8 **v23;
INT64 v24;
unsigned int a3a;
unsigned int a3_4;
UINT64 DataSize;
ULONG_PTR BugCheckParameter2;
_RTL_BITMAP *v29;
UINT64 *v30;
_DWORD *v31;
_DWORD *v32;
_DWORD a1a[4];
UINT64 a2a[2];
__int64 v35;
__int64 v36;
v13 = (_HHIVE *)a5;
v14 = 0;
a3a = 0;
v15 = a2;
DataSize = 0i64;
v17 = 512;
BugCheckParameter2 = a7;
v29 = a10;
v31 = a11;
v32 = a12;
v35 = 0i64;
v18 = 0;
a3_4 = a3;
v30 = a5;
*(_OWORD *)a1a = 0i64;
*(_OWORD *)a2a = 0i64;
while( 1 )
{
result = HvpReadLogEntryHeader(
v17,
(__int64(__fastcall *)(__int64, _QWORD, __int64, _OWORD **))HvpRecoverDataReadRoutine,
(__int64)v13,
(__int64)a1a);
if( (int)result < 0 )
break;
if( !HvpIsLogEntryHeaderCoherent(a1a, v17, a3_4) || a1a[3] != v15 )
goto LABEL_17;
result = HvpRecoverDataReadRoutine(v13, (VOID *)v17, a1a[1], (UINT64)&DataSize, v23);
if( (int)result < 0 )
break;
v20 = DataSize;
if( !HvpIsMetadataArrayCoherent(a1a, DataSize + 40, HIDWORD(a2a[0])) )
goto LABEL_17;
SymCryptMarvin32((int *)&HvSymcryptSeed, (unsigned __int16 *)(v20 + 40), (unsigned int)(a1a[1] - 40), &v36);
if( a2a[1] != v36 )
goto LABEL_17;
v21 = (_DWORD *)(DataSize + 40);
LODWORD(v24) = a1a[1] - (8 * HIDWORD(a2a[0]) + 40);
HvpApplyLogEntryDataToFileBackedHive(
BugCheckParameter2,
(INT64)a1a,
DataSize + 40,
DataSize + 40 + 8i64 * HIDWORD(a2a[0]),
v24,
(INT64)&a3a);
v22 = (a1a[2] & 1) == 0;
*(_DWORD *)(a1 + 40) = a2a[0];
if( !v22 )
*(_DWORD *)(a1 + 144) |= 1u;
v18 = 1;
++v14;
CmpTraceHiveMountLogEntryApplied(a1a[1], a3a);
if( v29 )
HvpUpdateRecoveryVector(v21, HIDWORD(a2a[0]), v29);
v13 = (_HHIVE *)v30;
++v15;
v17 += a1a[1];
if( !v17 )
{
result = 2147483674i64;
break;
}
}
if( (_DWORD)result == -1073741801 || (_DWORD)result == -1073741670 || (_DWORD)result == -1073741492 )
return result;
LABEL_17:
result = v18 != 0 ? 0x40000009 : 0;
if( v31 )
*v31 = v15;
if( v32 )
*v32 = v14;
if( a13 )
{
if( v18 )
*(_DWORD *)a13 = v17;
else
*(_DWORD *)a13 = 0;
}
return result;
}Referenced by:
HvApplyLogFile