CmReplaceKey
NTSTATUS __stdcall CmReplaceKey(_HHIVE *Hive, UINT64 Cell, _UNICODE_STRING *NewHiveName, _UNICODE_STRING *OldFileName){
char v7;
char v8;
struct _PRIVILEGE_SET *v9;
struct _PRIVILEGE_SET *v10;
NTSTATUS v11;
int v12;
ULONG_PTR v13;
EVENT_DESCRIPTOR *v14;
char v16[8];
ULONG_PTR BugCheckParameter2;
struct _IO_STATUS_BLOCK IoStatusBlock;
KAPC_STATE ApcState;
_UNICODE_STRING ObjectInformation[32];
v16[0] = 0;
BugCheckParameter2 = 0i64;
IoStatusBlock = 0i64;
v7 = 0;
v8 = 0;
memset(&ApcState, 0, sizeof(ApcState));
CmpAllocateTransientPoolWithTag((_HHIVE *)1, 0x1B0ui64, 0x33394D43ui64, (_CHILD_LIST *)OldFileName);
v10 = v9;
if( !v9 )
return -1073741670;
v12 = CmpCmdHiveOpen(NewHiveName, 0, v16, &BugCheckParameter2, 0x1100001u, 0, 0i64, 0i64, v9);
v13 = BugCheckParameter2;
v11 = v12;
if( v12 >= 0 )
{
CmpAttachToRegistryProcess(&ApcState);
v7 = 1;
CmpLockRegistry();
HvLockHiveFlusherExclusive((INT64)Hive);
if( (Hive->HiveFlags & 4) != 0 )
{
LABEL_5:
v11 = -1073741611;
goto LABEL_18;
}
if( (Hive[2].Storage[1].FreeDisplay[6].RealVectorSize & 0x20) != 0 )
goto LABEL_7;
if( Hive == (_HHIVE *)::Hive )
{
v11 = CmpPreserveSystemHiveData((UINT64)Hive, v13);
if( v11 < 0 )
{
LABEL_18:
HvUnlockHiveFlusherExclusive((INT64)Hive);
CmpUnlockRegistry();
if( v8 )
CmpFinishBeingActiveFlusherAndReconciler((__int64)Hive);
goto LABEL_20;
}
}
HvUnlockHiveFlusherExclusive((INT64)Hive);
CmpUnlockRegistry();
v11 = CmpFlushHive(v13, 12, v14);
if( v11 >= 0 )
{
CmpDetachFromRegistryProcess(&ApcState);
v7 = 0;
CmpBecomeActiveFlusherAndReconciler((__int64)Hive);
v8 = 1;
CmpLockRegistry();
HvLockHiveFlusherExclusive((INT64)Hive);
if( (Hive->HiveFlags & 4) != 0 )
goto LABEL_5;
if( (Hive[2].Storage[1].FreeDisplay[6].RealVectorSize & 0x20) == 0 )
{
v11 = CmpCmdRenameHive(
*(PVOID *)&Hive[1].Signature,
(_OBJECT_NAME_INFORMATION *)ObjectInformation,
OldFileName,
0x200ui64,
0);
if( v11 >= 0 )
{
Hive->HiveFlags |= 4u;
v11 = CmpCmdRenameHive(*(PVOID *)(v13 + 1536), 0i64, ObjectInformation, 0i64, 0);
if( v11 < 0 || (v11 = ZwFlushBuffersFile(*(PVOID *)(v13 + 1536), &IoStatusBlock), v11 < 0) )
{
if( CmpCmdRenameHive(*(PVOID *)&Hive[1].Signature, 0i64, ObjectInformation, 0i64, 0) < 0 )
v11 = -1073741492;
}
}
goto LABEL_18;
}
LABEL_7:
v11 = -1073741811;
goto LABEL_18;
}
}
LABEL_20:
if( v13 )
{
if( !v7 )
{
CmpAttachToRegistryProcess(&ApcState);
v7 = 1;
}
if( v11 >= 0 )
{
*(_OWORD *)(v13 + 1536) = 0i64;
*(_OWORD *)(v13 + 1552) = 0i64;
*(_OWORD *)(v13 + 1568) = 0i64;
}
CmpDestroyHive((PVOID)v13);
}
if( v7 )
CmpDetachFromRegistryProcess(&ApcState);
CmSiFreeMemory(v10);
return v11;
}Referenced by:
NtReplaceKey