HvpGenerateLogEntry

INT64 __fastcall HvpGenerateLogEntry(_HHIVE *Hive, UINT8 **Entry, UINT *EntrySize){
  unsigned int *v3; 
  unsigned int CurrentLogOffset; 
  bool v6; 
  ULONG v7; 
  int v8; 
  UINT64 v9; 
  unsigned int v10; 
  void *PoolWithTag; 
  int v12; 
  INT64 v13; 
  __int64 v14; 
  unsigned int v15; 
  UINT8 *v16; 
  INT64 v17; 
  INT64 v18; 
  UINT8 *v19; 
  PVOID *v21; 
  INT64 a6; 
  INT64 a6a; 
  INT64 v24; 
  INT64 v25; 
  UINT64 Context1; 
  UINT64 EntrySizea; 
  UINT8 *LogEntry; 
  UINT64 a4; 
  UINT8 **v30; 
  UINT *v31; 
  unsigned int *v32; 
  v32 = v3;
  v31 = EntrySize;
  v30 = Entry;
  CurrentLogOffset = Hive->CurrentLogOffset;
  LogEntry = 0i64;
  Context1 = 0i64;
  v6 = CurrentLogOffset == 0;
  LODWORD(EntrySizea) = 0;
  LODWORD(a4) = 0;
  HvpGenerateLogMetadata(&Hive->DirtyVector, 0i64, (UINT64 *)((char *)&Context1 + 4));
  v7 = RtlNumberOfSetBits(&Hive->DirtyVector);
  v8 = HIDWORD(Context1);
  CmpLogDirtyVectorUse((_CMHIVE *)Hive, DirtyDataCaptureStart, HIDWORD(Context1), v7);
  v9 = (unsigned int)(8 * v8);
  v10 = (v9 + (CurrentLogOffset != 0 ? 4135 : 4647) + (Hive->DirtyCount << 9)) & 0xFFFFF000;
  PoolWithTag = ExAllocatePoolWithTag(PagedPoolCacheAligned, v9, 0x6F494D43ui64);
  if( PoolWithTag )
  {
    v12 = HvpAllocateLogBuffers((PVOID **)&LogEntry, &EntrySizea, v10);
    v14 = (unsigned int)EntrySizea;
    v15 = v12;
    if( v12 < 0 )
    {
      v19 = LogEntry;
    }
    else
    {
      LODWORD(v24) = v8;
      v16 = LogEntry;
      LODWORD(a6) = v10;
      HvpGenerateLogEntryHeader((INT64)Hive, (INT64)LogEntry, v13, &a4, &Context1, a6, v24, v6);
      LODWORD(v25) = HIDWORD(Context1);
      HvpGenerateLogEntryMetadata((INT64)Hive, (INT64)v16, v17, &a4, &Context1, (INT64)PoolWithTag, v25);
      HvpGenerateLogEntryDirtyData((INT64)Hive, (INT64)v16, v18, &a4, &Context1, a6a);
      if( (unsigned int)Context1 < *(_DWORD *)&v16[24 * (unsigned int)a4 + 16] )
        memset(*(_QWORD *)&v16[24 * (unsigned int)a4 + 8] + (unsigned int)Context1, 0i64);
      HvpGenerateLogEntryChecksums(v16, (unsigned int)v14);
      *v30 = v16;
      *v31 = v14;
      *v32 = v10;
      v19 = 0i64;
      v15 = 0;
    }
    ExFreePoolWithTag(PoolWithTag, 0);
    if( v19 )
    {
      if( (_DWORD)v14 )
      {
        v21 = (PVOID *)(v19 + 8);
        do
        {
          if( *v21 )
          {
            ExFreePoolWithTag(*v21, 0);
            *v21 = 0i64;
          }
          v21 += 3;
          --v14;
        }
        while( v14 );
      }
      ExFreePoolWithTag(v19, 0);
    }
  }
  else
  {
    return(unsigned int)-1073741801;
  }
  return v15;
}

Referenced by:

HvStoreModifiedData