CmpResolveHiveLoadConflict
__int64 __fastcall CmpResolveHiveLoadConflict(
_OBJECT_ATTRIBUTES *ObjectAttributes,
__int64 a2,
unsigned int a3,
__int64 a4,
__int64 a5,
_HIVE_LOAD_FAILURE *HiveLoadFailure,
char a7,
__int64 a8,
__int64 a9){
INT64 v12;
unsigned int v13;
INT64 v14;
int v15;
NTSTATUS v16;
INT64 v17;
CMHIVE *v18;
unsigned int HiveFlags;
__int64 v20;
VOID *ProbeMode;
INT64 ProbeModea;
CMHIVE *CmHive;
_UNICODE_STRING **PathToRoot;
_FILE_OBJECT *FileObject;
_QWORD *v27;
VOID *Object[38];
PathToRoot = (_UNICODE_STRING **)a8;
FileObject = (_FILE_OBJECT *)a2;
v27 = (_QWORD *)a9;
CmHive = 0i64;
v12 = 0i64;
memset(Object, 0i64, 0x128u);
LODWORD(Object[12]) = -1;
Object[19] = &Object[18];
Object[18] = &Object[18];
memset(&Object[27], 0i64, 0x50u);
LOBYTE(ProbeMode) = 0;
if( ObReferenceObjectByNameEx(
ObjectAttributes,
0i64,
(_OBJECT_TYPE *)0x20019,
(CHAR)CmKeyObjectType,
ProbeMode,
Object) >= 0 )
{
LOCK_HIVE_LOAD();
CmpLockRegistryFreezeAware(1u);
if( a4 )
{
if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a4, 0i64) )
{
v13 = -1073741444;
LODWORD(ProbeModea) = 16;
v14 = 3221225852i64;
LABEL_26:
SetFailureLocation(HiveLoadFailure, 0i64, _CmpResolveHiveLoadConflict, v14, ProbeModea);
LABEL_27:
CmpUnlockRegistry();
UNLOCK_HIVE_LOAD();
goto LABEL_28;
}
v12 = *(_QWORD *)(*(_QWORD *)(a4 + 8) + 32i64);
v15 = CmpPerformTrustClassAccessCheck(v12, a7);
v16 = v15;
if( v15 < 0 )
{
LODWORD(ProbeModea) = 32;
v17 = (unsigned int)v15;
goto LABEL_8;
}
}
if( CmpIsHiveAlreadyLoaded(0i64, FileObject, a3, &CmHive, PathToRoot) )
{
v18 = CmHive;
HiveFlags = CmHive->Hive.HiveFlags;
if( ((HiveFlags & 0x8000) == 0 || (a3 & 0x2000) != 0) && ((HiveFlags & 0x8000) != 0 || (a3 & 0x2000) == 0) )
{
CmpLockKcbExclusive(MEMORY[8]);
if( (a3 & 0x800) != 0 )
{
CmpReferenceKeyControlBlock(MEMORY[8]);
*v27 = MEMORY[8];
}
if( !a5 || (v16 = CmpRecordUnloadEventForHive(v18, (KEVENT *)a5), v16 >= 0) )
{
CmpUnlockKcb(MEMORY[8]);
if( v12 )
{
CmpUnJoinClassOfTrust((INT64)v18);
LOBYTE(v20) = a7;
v18->Flags |= 1u;
CmpJoinClassOfTrust(v18, v12, v20);
}
v16 = 0;
goto LABEL_21;
}
CmpUnlockKcb(MEMORY[8]);
v17 = (unsigned int)v16;
LODWORD(ProbeModea) = 80;
LABEL_8:
SetFailureLocation(HiveLoadFailure, 0i64, _CmpResolveHiveLoadConflict, v17, ProbeModea);
LABEL_21:
if( v16 == -1073741275 )
v16 = -1073741823;
v13 = v16;
goto LABEL_27;
}
LODWORD(ProbeModea) = 64;
}
else
{
LODWORD(ProbeModea) = 48;
}
v14 = 3221225539i64;
v13 = -1073741757;
goto LABEL_26;
}
v13 = -1073741275;
LABEL_28:
CmpCleanupParseContext((INT64)Object, 0);
return v13;
}Referenced by:
CmLoadKey