HvStoreModifiedData
_HV_STORE_DATA_RESULT __stdcall HvStoreModifiedData(PVOID Hive, UINT8 CaptureBaseBlock, UINT8 CaptureUnreconciledData){
bool v3;
unsigned int *v5;
UINT8 *v6;
unsigned int *v7;
VOID **v8;
size_t v9;
UINT64 v10;
VOID **PoolWithTag;
NTSTATUS v12;
unsigned int v13;
unsigned int v14;
int v15;
_HV_STORE_DATA_RESULT v16;
VOID **v18;
__int64 v19;
_OWORD *v20;
_OWORD *v21;
__int128 v22;
VOID **v23;
VOID **v24;
char *v25;
UINT8 *v26;
int v27;
int v28;
int v29;
unsigned int v30;
PVOID v31;
PVOID *v32;
__int64 v33;
PVOID *v34;
__int64 v35;
size_t Size;
UINT64 EntrySize;
unsigned int v38;
unsigned int SizeOfBitMap;
int v40;
UINT8 *Entry;
PVOID P;
UINT64 Current;
_RTL_BITMAP Destination;
UINT8 *Address;
_RTL_BITMAP Source;
unsigned int v47;
UINT64 Offset;
v3 = (*((_DWORD *)Hive + 40) & 0x8000) == 0;
Address = 0i64;
v5 = 0i64;
LODWORD(Offset) = 0;
v6 = 0i64;
Entry = 0i64;
v7 = 0i64;
EntrySize = 0i64;
v8 = 0i64;
v40 = 0;
v47 = 0;
P = 0i64;
Source = 0i64;
Destination = 0i64;
if( !v3 )
return 1;
*((_DWORD *)Hive + 430) = HvpTruncateBins((_HHIVE *)Hive);
if( (*((_DWORD *)Hive + 40) & 1) != 0 )
return 1;
v9 = *((_DWORD *)Hive + 27);
v10 = v9;
Size = v9;
if( *((_DWORD *)Hive + 26) )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, v9, 808799555i64);
v5 = (unsigned int *)PoolWithTag;
if( !PoolWithTag )
return 2;
memmove(PoolWithTag, *((const VOID **)Hive + 12), v10);
SizeOfBitMap = *((_DWORD *)Hive + 22);
Source.SizeOfBitMap = SizeOfBitMap;
Source.Buffer = v5;
v12 = HvpGenerateLogEntry((_HHIVE *)Hive, &Entry, &EntrySize);
v6 = Entry;
if( v12 < 0 )
goto LABEL_48;
}
else
{
SizeOfBitMap = Source.SizeOfBitMap;
}
if( !CaptureUnreconciledData && !CaptureBaseBlock )
goto LABEL_8;
v18 = ExAllocatePoolWithTag(1ui64, 0x1000ui64, 808799555i64);
P = v18;
if( v18 )
{
memset(v18, 0i64, 0x1000u);
v19 = 4i64;
*(_DWORD *)(*((_QWORD *)Hive + 8) + 40i64) = *((_DWORD *)Hive + 68);
v20 = (_OWORD *)*((_QWORD *)Hive + 8);
v21 = P;
do
{
*v21 = *v20;
v21[1] = v20[1];
v21[2] = v20[2];
v21[3] = v20[3];
v21[4] = v20[4];
v21[5] = v20[5];
v21[6] = v20[6];
v21 += 8;
v22 = v20[7];
v20 += 8;
*(v21 - 1) = v22;
--v19;
}
while( v19 );
if( !CaptureUnreconciledData )
{
LABEL_8:
v13 = Destination.SizeOfBitMap;
LABEL_9:
v14 = *((_DWORD *)Hive + 68);
if( *((_DWORD *)Hive + 446) < v14 || *((_DWORD *)Hive + 430) )
*((_DWORD *)Hive + 446) = v14;
if( *((_DWORD *)Hive + 26) )
{
*((_DWORD *)Hive + 420) = SizeOfBitMap;
*((_QWORD *)Hive + 211) = v5;
v5 = 0i64;
*((_DWORD *)Hive + 424) = Size;
*((_DWORD *)Hive + 428) = EntrySize;
v15 = v40;
*((_QWORD *)Hive + 213) = v6;
v6 = 0i64;
*((_DWORD *)Hive + 429) = v15;
HvResetDirtyData((_HHIVE *)Hive);
}
if( CaptureBaseBlock || CaptureUnreconciledData )
{
v31 = P;
P = 0i64;
v3 = *((_BYTE *)Hive + 191) == 0;
*((_QWORD *)Hive + 221) = v31;
if( !v3 )
*((_BYTE *)Hive + 1724) = 1;
if( CaptureUnreconciledData )
{
*((_QWORD *)Hive + 217) = v7;
v7 = 0i64;
*((_DWORD *)Hive + 432) = v13;
*((_QWORD *)Hive + 219) = v8;
v8 = 0i64;
*((_DWORD *)Hive + 436) = Size;
*((_DWORD *)Hive + 440) = v47;
if( *((_QWORD *)Hive + 15) )
{
RtlClearAllBits((PRTL_BITMAP)Hive + 7);
*((_DWORD *)Hive + 32) = 0;
*((_BYTE *)Hive + 191) = 0;
}
}
}
v16 = StoreDataSuccess;
goto LABEL_16;
}
v23 = ExAllocatePoolWithTag(1ui64, v10, 808799555i64);
v7 = (unsigned int *)v23;
if( v23 )
{
memmove(v23, *((const VOID **)Hive + 15), v10);
LODWORD(Entry) = *((_DWORD *)Hive + 28);
Destination.SizeOfBitMap = (unsigned int)Entry;
Destination.Buffer = v7;
if( *((_DWORD *)Hive + 26) )
RtlMergeBitMaps(&Destination, &Source);
v47 = HvpCountSetRangesInVector(&Destination);
v24 = ExAllocatePoolWithTag(1ui64, 24i64 * v47, 842353987i64);
v8 = v24;
if( v24 )
{
memset(v24, 0i64, 24 * v47);
v38 = 0;
LODWORD(Current) = 0;
if( v47 )
{
v25 = (char *)(v8 + 1);
do
{
if( !HvpFindNextDirtyBlock(
Hive,
&Destination,
&Current,
&Address,
(UINT64 *)((char *)&EntrySize + 4),
&Offset,
1u) )
break;
v26 = Address;
if( !Address )
goto LABEL_48;
v27 = Offset;
v28 = HIDWORD(EntrySize);
*((_DWORD *)v25 + 2) = HIDWORD(EntrySize);
*((_DWORD *)v25 - 2) = v27;
v29 = v28 + v27;
v30 = v38 + 1;
*(_QWORD *)v25 = v26;
v25 += 24;
LODWORD(Offset) = v29;
v38 = v30;
}
while( v30 < v47 );
}
memmove(v7, *((const VOID **)Hive + 15), Size);
v13 = (unsigned int)Entry;
goto LABEL_9;
}
}
}
LABEL_48:
v16 = StoreDataFailure;
LABEL_16:
if( v5 )
ExFreePoolWithTag(v5, 0);
if( v6 )
{
if( (_DWORD)EntrySize )
{
v32 = (PVOID *)(v6 + 8);
v33 = (unsigned int)EntrySize;
do
{
if( *v32 )
{
ExFreePoolWithTag(*v32, 0);
*v32 = 0i64;
}
v32 += 3;
--v33;
}
while( v33 );
}
ExFreePoolWithTag(v6, 0);
}
if( v7 )
ExFreePoolWithTag(v7, 0);
if( v8 )
{
if( v47 )
{
v34 = v8 + 1;
v35 = v47;
do
{
if( *v34 )
ExFreePoolWithTag(*v34, 0);
v34 += 3;
--v35;
}
while( v35 );
}
ExFreePoolWithTag(v8, 0);
}
if( P )
ExFreePoolWithTag(P, 0);
return v16;
}Referenced by:
CmpFlushHive