CmpFlushBackupHive
NTSTATUS __stdcall CmpFlushBackupHive(UINT64 Index){
__int64 v1;
unsigned int v2;
CMP_OFFSET_ARRAY *v3;
unsigned int v4;
__int64 v5;
wchar_t *v6;
WCHAR v7;
WCHAR v8;
void *v9;
NTSTATUS inited;
WCHAR v11;
UINT64 v12;
void *v13;
_QWORD *v14;
void *v15;
char FileInformation[3];
__int16 ObjectInformation;
int v19;
int v20;
INT64 v21;
struct _STRING Destination;
UINT64 FileLength;
PVOID P;
struct _UNICODE_STRING DestinationString;
struct _IO_STATUS_BLOCK IoStatusBlock;
KAPC_STATE ApcState;
INT64 result[54];
char v29;
v1 = (unsigned int)Index;
P = 0i64;
v21 = 0i64;
FileLength = 0i64;
DestinationString = 0i64;
v2 = 0;
*(_QWORD *)&Destination.Length = 0x800000i64;
v3 = 0i64;
FileInformation[1] = 1;
v4 = 0;
IoStatusBlock = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
memset((INT64)result, 0i64);
v5 = 25 * v1;
Destination.Buffer = &v29;
v6 = CmpMachineHiveList[v5 + 6];
RtlInitUnicodeString(&DestinationString, L"\\SystemRoot\\System32\\Config\\RegBack\\", v7);
RtlAppendStringToString(&Destination, (const _STRING *)&DestinationString);
RtlInitUnicodeString(&DestinationString, CmpMachineHiveList[v5], v8);
RtlAppendStringToString(&Destination, (const _STRING *)&DestinationString);
RtlAppendUnicodeToString((UNICODE_STRING *)&Destination, (PWCHAR)L".OLD");
v9 = (void *)*((_QWORD *)v6 + 195);
if( !v9 )
return -1073741431;
inited = CmpCmdRenameHive(v9, 0i64, (_UNICODE_STRING *)&Destination, 0i64, 1u);
if( inited >= 0 )
{
Destination.Length -= 8;
*((_QWORD *)v6 + 195) = 0i64;
inited = CmpInitBackupHive((__int64)v6, CmpMachineHiveList[v5], v11);
if( inited < 0 )
goto LABEL_14;
CmpAttachToRegistryProcess(&ApcState);
CmpLockRegistry();
if( CmpDoIdleProcessing )
{
ExAcquirePushLockExclusiveEx((UINT64)(v6 + 36), 0i64);
inited = HvSnapshotHiveToOffsetArray((INT64)v6, &v21, (CHAR **)&FileLength, (UINT64 *)((char *)&v21 + 4));
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v6 + 9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)v6 + 9);
KeAbPostRelease(v6 + 36);
v2 = v21;
v3 = (CMP_OFFSET_ARRAY *)FileLength;
v4 = HIDWORD(v21);
}
else
{
inited = -1073741431;
}
CmpUnlockRegistry();
KiUnstackDetachProcess(&ApcState, 0i64);
if( inited < 0 )
goto LABEL_14;
inited = CmpWriteOffsetArrayToFile(v12, (CMP_OFFSET_ARRAY *)v2, (UINT64)v3, (PVOID)v4);
CmpFreeOffsetArray(v2, v3);
if( inited < 0
|| (v13 = (void *)*((_QWORD *)v6 + 195),
ObjectInformation = 0,
ZwSetInformationObject(v13, ObjectHandleFlagInformation, &ObjectInformation, 2ui64),
ZwClose(*((HANDLE *)v6 + 195)),
*((_QWORD *)v6 + 195) = 0i64,
FileInformation[0] = 0,
inited = CmpCmdHiveOpen(
(const UNICODE_STRING *)&Destination,
0,
FileInformation,
(ULONG_PTR *)&P,
0x1100001u,
0,
0i64,
0i64,
result),
inited < 0) )
{
LABEL_14:
v15 = (void *)*((_QWORD *)v6 + 195);
if( v15 )
{
LOWORD(v20) = 0;
ZwSetInformationObject(v15, ObjectHandleFlagInformation, &v20, 2ui64);
ZwClose(*((HANDLE *)v6 + 195));
*((_QWORD *)v6 + 195) = 0i64;
}
if( CmpCmdRenameHive(v9, 0i64, (_UNICODE_STRING *)&Destination, 0i64, 1u) >= 0 )
*((_QWORD *)v6 + 195) = v9;
}
else
{
v14 = P;
*((_QWORD *)v6 + 195) = *((_QWORD *)P + 192);
v14[192] = 0i64;
CmpAttachToRegistryProcess(&ApcState);
CmpDestroyHive(v14);
KiUnstackDetachProcess(&ApcState, 0i64);
ZwSetInformationFile(v9, &IoStatusBlock, &FileInformation[1], 1ui64, FileDispositionInformation);
LOWORD(v19) = 0;
ZwSetInformationObject(v9, ObjectHandleFlagInformation, &v19, 2ui64);
ZwClose(v9);
}
}
return inited;
}Referenced by:
CmpSyncNextBackupHive