HvpGenerateLogEntry

NTSTATUS __stdcall HvpGenerateLogEntry(_HHIVE *Hive, UINT8 **Entry, UINT64 *EntrySize){
  unsigned int *v3; 
  unsigned int CurrentLogOffset; 
  bool v6; 
  unsigned int v7; 
  int v8; 
  UINT64 v9; 
  unsigned int v10; 
  VOID **PoolWithTag; 
  int v12; 
  INT64 v13; 
  __int64 v14; 
  NTSTATUS v15; 
  UINT8 *v16; 
  INT64 v17; 
  INT64 v18; 
  unsigned int v19; 
  PVOID *v20; 
  PVOID *v22; 
  INT64 v23; 
  INT64 v24; 
  INT64 v25; 
  INT64 v26; 
  UINT64 a3; 
  UINT64 EntrySizea; 
  INT64 a2; 
  UINT64 a4; 
  UINT8 **v31; 
  UINT64 *v32; 
  unsigned int *v33; 

  v33 = v3;
  v32 = EntrySize;
  v31 = Entry;
  CurrentLogOffset = Hive->CurrentLogOffset;
  a2 = 0i64;
  a3 = 0i64;
  v6 = CurrentLogOffset == 0;
  LODWORD(EntrySizea) = 0;
  LODWORD(a4) = 0;
  HvpGenerateLogMetadata(&Hive->DirtyVector, 0i64, (UINT64 *)((char *)&a3 + 4));
  v7 = RtlNumberOfSetBits((UINT64 *)&Hive->DirtyVector.SizeOfBitMap);
  v8 = HIDWORD(a3);
  CmpLogDirtyVectorUse((_CMHIVE *)Hive, DirtyDataCaptureStart, HIDWORD(a3), v7);
  v9 = (unsigned int)(8 * v8);
  v10 = (v9 + (CurrentLogOffset != 0 ? 4135 : 4647) + (Hive->DirtyCount << 9)) & 0xFFFFF000;
  PoolWithTag = ExAllocatePoolWithTag(5ui64, v9, 1867074883i64);
  if( !PoolWithTag )
    return -1073741801;
  v12 = HvpAllocateLogBuffers((PVOID **)&a2, &EntrySizea, v10);
  v14 = (unsigned int)EntrySizea;
  v15 = v12;
  if( v12 < 0 )
  {
    v20 = (PVOID *)a2;
  }
  else
  {
    LODWORD(v25) = v8;
    v16 = (UINT8 *)a2;
    LODWORD(v23) = v10;
    HvpGenerateLogEntryHeader((INT64)Hive, a2, v13, &a4, &a3, v23, v25, v6);
    LODWORD(v26) = HIDWORD(a3);
    HvpGenerateLogEntryMetadata((INT64)Hive, (INT64)v16, v17, &a4, &a3, (INT64)PoolWithTag, v26);
    HvpGenerateLogEntryDirtyData(Hive, (INT64)v16, v18, &a4, &a3, v24);
    v19 = *(_DWORD *)&v16[24 * (unsigned int)a4 + 16];
    if( (unsigned int)a3 < v19 )
      memset((VOID *)(*(_QWORD *)&v16[24 * (unsigned int)a4 + 8] + (unsigned int)a3), 0i64, v19 - a3);
    HvpGenerateLogEntryChecksums(v16, (unsigned int)v14);
    *v31 = v16;
    *(_DWORD *)v32 = v14;
    *v33 = v10;
    v20 = 0i64;
    v15 = 0;
  }
  ExFreePoolWithTag(PoolWithTag, 0);
  if( v20 )
  {
    if( (_DWORD)v14 )
    {
      v22 = v20 + 1;
      do
      {
        if( *v22 )
        {
          ExFreePoolWithTag(*v22, 0);
          *v22 = 0i64;
        }
        v22 += 3;
        --v14;
      }
      while( v14 );
    }
    ExFreePoolWithTag(v20, 0);
  }
  return v15;
}

Referenced by:

HvStoreModifiedData