CmpFlushBackupHive
__int64 __fastcall CmpFlushBackupHive(unsigned int a1){
__int64 v1;
unsigned int v2;
UINT8 *v3;
int v4;
__int64 v5;
wchar_t *v6;
void *v7;
int inited;
__int64 v9;
VOID *v10;
_QWORD *v11;
VOID *v12;
UINT64 FileInformationClass;
UINT64 FileInformationClassa;
INT64 v16;
char FileInformation[3];
__int16 ObjectInformation;
int v19;
int v20;
INT64 a2;
_STRING Destination;
UINT8 *a3;
PVOID P;
_UNICODE_STRING DestinationString;
_IO_STATUS_BLOCK IoStatusBlock;
_KAPC_STATE ApcState;
char v28[432];
char v29;
v1 = a1;
P = 0i64;
a2 = 0i64;
a3 = 0i64;
DestinationString = 0i64;
v2 = 0;
*(_QWORD *)&Destination.Length = 0x800000i64;
v3 = 0i64;
FileInformation[1] = 1;
v4 = 0;
IoStatusBlock = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
memset(v28, 0i64, sizeof(v28));
v5 = 25 * v1;
Destination.Buffer = &v29;
v6 = CmpMachineHiveList[v5 + 6];
RtlInitUnicodeString(&DestinationString, L"\\SystemRoot\\System32\\Config\\RegBack\\");
RtlAppendStringToString(&Destination, (const _STRING *)&DestinationString);
RtlInitUnicodeString(&DestinationString, CmpMachineHiveList[v5]);
RtlAppendStringToString(&Destination, (const _STRING *)&DestinationString);
RtlAppendUnicodeToString((_UNICODE_STRING *)&Destination, (WCHAR *)L".OLD");
v7 = (void *)*((_QWORD *)v6 + 195);
if( v7 )
{
inited = CmpCmdRenameHive(v7, 0i64, (_UNICODE_STRING *)&Destination, 0i64, 1u);
if( inited >= 0 )
{
Destination.Length -= 8;
*((_QWORD *)v6 + 195) = 0i64;
inited = CmpInitBackupHive((_CMHIVE *)v6, CmpMachineHiveList[v5]);
if( inited < 0 )
goto LABEL_14;
CmpAttachToRegistryProcess(&ApcState);
CmpLockRegistry();
if( dword_140C50480 )
{
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v6 + 9, 0i64);
inited = HvSnapshotHiveToOffsetArray((_HHIVE *)v6, &a2, &a3, (UINT64 *)((char *)&a2 + 4));
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v6 + 9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v6 + 9);
KeAbPostRelease(v6 + 36);
v2 = a2;
v3 = a3;
v4 = HIDWORD(a2);
}
else
{
inited = -1073741431;
}
CmpUnlockRegistry();
KiUnstackDetachProcess(&ApcState, 0i64);
if( inited < 0 )
goto LABEL_14;
inited = CmpWriteOffsetArrayToFile(v9, v2, (__int64)v3, v4, *((VOID **)v6 + 195));
CmpFreeOffsetArray(v2, (PVOID *)v3);
if( inited < 0 )
goto LABEL_14;
v10 = (VOID *)*((_QWORD *)v6 + 195);
ObjectInformation = 0;
ZwSetInformationObject(v10, ObjectHandleFlagInformation, &ObjectInformation, 2ui64);
ZwClose(*((_QWORD *)v6 + 195));
*((_QWORD *)v6 + 195) = 0i64;
LODWORD(v16) = 0;
LODWORD(FileInformationClass) = 17825793;
FileInformation[0] = 0;
inited = CmpCmdHiveOpen(
(UNICODE_STRING *)&Destination,
0,
(UINT8 *)FileInformation,
(CMHIVE **)&P,
FileInformationClass,
v16,
0i64);
if( inited < 0 )
{
LABEL_14:
v12 = (VOID *)*((_QWORD *)v6 + 195);
if( v12 )
{
LOWORD(v20) = 0;
ZwSetInformationObject(v12, ObjectHandleFlagInformation, &v20, 2ui64);
ZwClose(*((_QWORD *)v6 + 195));
*((_QWORD *)v6 + 195) = 0i64;
}
if( (int)CmpCmdRenameHive(v7, 0i64, (_UNICODE_STRING *)&Destination, 0i64, 1u) >= 0 )
*((_QWORD *)v6 + 195) = v7;
}
else
{
v11 = P;
*((_QWORD *)v6 + 195) = *((_QWORD *)P + 192);
v11[192] = 0i64;
CmpAttachToRegistryProcess(&ApcState);
CmpDestroyHive(v11);
KiUnstackDetachProcess(&ApcState, 0i64);
LODWORD(FileInformationClassa) = 13;
ZwSetInformationFile((UINT64)v7, (UINT64)&IoStatusBlock, &FileInformation[1], 1ui64, FileInformationClassa);
LOWORD(v19) = 0;
ZwSetInformationObject(v7, ObjectHandleFlagInformation, &v19, 2ui64);
ZwClose((_HANDLE)v7);
}
}
}
else
{
return(unsigned int)-1073741431;
}
return(unsigned int)inited;
}Referenced by:
CmpSyncNextBackupHive