HvWriteLogFile
INT64 __fastcall HvWriteLogFile(_HHIVE *Hive, INT64 UseCapturedData, UINT64 Flags, UINT64 *LogEntrySize){
UINT64 CurrentLog;
__int64 v7;
unsigned int CurrentLogOffset;
__int64 MinimumLogSequence;
char *Storage;
__int64 v11;
unsigned int v12;
unsigned int *v13;
INT64 result;
unsigned int v15;
if( (Hive->HiveFlags & 0x8001) != 0 )
return 0i64;
CurrentLog = Hive->CurrentLog;
if( !(_DWORD)CurrentLog || !*((_QWORD *)&Hive[1].Signature + CurrentLog) )
return 3221225485i64;
v7 = *(_QWORD *)&Hive[1].CurrentLogSequence;
CurrentLogOffset = Hive[1].CurrentLogOffset;
MinimumLogSequence = Hive[1].MinimumLogSequence;
if( (_DWORD)CurrentLog == 1 || (_DWORD)CurrentLog == 4 )
{
Storage = (char *)&Hive[1].ViewMap.ViewTree.8;
}
else if( (_DWORD)CurrentLog == 5 )
{
Storage = (char *)Hive[1].Storage;
}
else
{
Storage = 0i64;
}
if( MinimumLogSequence + Hive->CurrentLogOffset > *(_QWORD *)Storage )
CmpDoFileSetSizeEx((INT64)Hive, CurrentLog, MinimumLogSequence + Hive->CurrentLogOffset, 1);
v11 = 0i64;
if( !CurrentLogOffset )
{
LABEL_13:
result = CmpFileFlushAndPurge((INT64)Hive, Hive->CurrentLog);
if( (int)result < 0 )
return result;
++Hive->CurrentLogSequence;
v15 = HvpLogTypeToLogArrayIndex(Hive->CurrentLog);
Hive->LogDataPresent[v15] = 1;
CmpTraceHiveFlushWroteLogFile(v15);
*(_DWORD *)LogEntrySize = MinimumLogSequence;
return 0i64;
}
v12 = Hive->CurrentLogOffset;
while( 1 )
{
v13 = (unsigned int *)(v7 + 24 * v11);
*v13 = v12;
result = ((__int64(__fastcall *)(_HHIVE *, _QWORD, unsigned int *, __int64, _DWORD))Hive->FileWrite)(
Hive,
Hive->CurrentLog,
v13,
1i64,
0);
if( (int)result < 0 )
return result;
v11 = (unsigned int)(v11 + 1);
Hive->CurrentLogOffset += v13[4];
v12 = Hive->CurrentLogOffset;
if( (unsigned int)v11 >= CurrentLogOffset )
goto LABEL_13;
}
}Referenced by:
CmpFlushHive