CmpLinkHiveToMaster
INT64 __fastcall CmpLinkHiveToMaster(
_UNICODE_STRING *LinkName,
VOID *RootDirectory,
_CMHIVE *CmHive,
INT64 Allocate,
UINT64 KcbCacheSize,
UINT8 AppHive,
_KEVENT *UserEvent,
VOID *SecurityDescriptor,
_CM_KEY_CONTROL_BLOCK *LowerLayerKcb,
_CM_KEY_CONTROL_BLOCK **RootKeyControlBlock,
UINT8 RegLockHeld){
_UNICODE_STRING *v12;
char v13;
int v14;
char v15;
int v16;
int v17;
int v18;
NTSTATUS v19;
_CM_KEY_CONTROL_BLOCK **v20;
VOID *PoolWithTag;
UINT64 v22;
UINT8 v23;
UINT8 v24;
PRKEVENT v25;
_CM_KEY_CONTROL_BLOCK **v26;
__int128 v28;
__int128 v29;
__int128 v30;
__int128 v31;
PVOID *Object;
PVOID *Objecta;
IRP *Objectb;
char v35;
char v36;
HANDLE Handle;
PVOID v38;
_UNICODE_STRING *v39;
_CM_KEY_CONTROL_BLOCK *v40;
VOID *v41;
VOID *v42;
PRKEVENT Event;
_CM_KEY_CONTROL_BLOCK **v44;
_QWORD a1[2];
int v46[2];
VOID *v47;
_UNICODE_STRING *v48;
int v49;
int v50;
VOID *v51;
__int64 v52;
_DWORD result[10];
int v54;
_CMHIVE *v55;
_CM_KEY_CONTROL_BLOCK *v56;
int v57;
_QWORD v58[9];
INT64 v59[2];
__int128 v60;
__int128 v61;
__int128 v62;
__int128 v63;
KAPC_STATE ApcState;
_OWORD *v65;
Event = UserEvent;
v42 = SecurityDescriptor;
v40 = LowerLayerKcb;
v44 = RootKeyControlBlock;
v41 = RootDirectory;
v12 = 0i64;
v39 = LinkName;
v46[1] = 0;
v50 = 0;
v13 = 0;
Handle = 0i64;
v35 = 0;
v36 = Allocate;
*(_OWORD *)a1 = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
memset((INT64)result, 0i64);
v57 = -1;
v58[1] = v58;
v58[0] = v58;
memset((INT64)v59, 0i64);
CmpInitializeDelayDerefContext(a1);
v14 = *((_DWORD *)CmHive + 40);
v15 = 1;
if( (v14 & 0x20) == 0 )
{
v35 = 1;
*((_DWORD *)CmHive + 40) = v14 | 0x20;
*((_QWORD *)CmHive + 526) = KeGetCurrentThread();
}
v16 = CmpInitializeKcbCache((__int64)CmHive, KcbCacheSize);
v17 = v16;
if( v16 < 0 )
{
LODWORD(Object) = 16;
SetFailureLocation((INT64)v65, 0i64, 30i64, (unsigned int)v16, (INT64)Object);
LABEL_40:
v15 = 0;
goto LABEL_29;
}
v18 = 67;
v55 = CmHive;
if( AppHive )
v18 = 2115;
result[0] = v18;
if( v36 )
v54 = -1;
else
v54 = *(_DWORD *)(*((_QWORD *)CmHive + 8) + 36i64);
v56 = v40;
v47 = v41;
v48 = v39;
v51 = v42;
v52 = 0i64;
v46[0] = 48;
v49 = 576;
v19 = ObOpenObjectByName((__int64)v46, (__int64)CmKeyObjectType, 0, 0i64, 0x2001Fu, (__int64)result, &Handle);
v17 = v19;
if( v19 < 0 )
{
LODWORD(Objecta) = 32;
SetFailureLocation((INT64)v65, 0i64, 30i64, (unsigned int)v19, (INT64)Objecta);
v13 = 0;
v28 = v60;
v65[22] = *(_OWORD *)v59;
v29 = v61;
v65[23] = v28;
v30 = v62;
v65[24] = v29;
v31 = v63;
v65[25] = v30;
v65[26] = v31;
goto LABEL_40;
}
v38 = 0i64;
ObReferenceObjectByHandle(Handle, 0, (POBJECT_TYPE)CmKeyObjectType, 0, &v38, 0i64);
v20 = (_CM_KEY_CONTROL_BLOCK **)v38;
ZwClose(Handle);
CmpAttachToRegistryProcess(&ApcState);
if( !RegLockHeld )
CmpLockRegistry();
v12 = CmpConstructName(v20[1]);
if( !RegLockHeld )
CmpUnlockRegistry();
if( !v12
|| (PoolWithTag = ExAllocatePoolWithTag(PagedPool, v12->Length, 0x70684D43ui64),
(*((_QWORD *)CmHive + 232) = PoolWithTag) == 0i64) )
{
v17 = -1073741670;
goto LABEL_44;
}
*((_WORD *)CmHive + 924) = 0;
*((_WORD *)CmHive + 925) = v12->Length;
RtlUnicodeStringCopy((UNICODE_STRING *)((char *)CmHive + 1848), v12);
*((_BYTE *)CmHive + 141) = 0;
*((_DWORD *)CmHive + 417) = _InterlockedIncrement(&CmHiveIdentity);
if( !RegLockHeld )
CmpLockRegistry();
if( AppHive )
{
CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)v20[1]);
v25 = Event;
*((_QWORD *)CmHive + 366) = v20[1];
if( v25 )
{
KeResetEvent(v25, v22, v23, v24, Objectb);
CmpRecordUnloadEventForHive((__int64)CmHive, v25);
}
}
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
CmpEtwDumpKcb(v20[1], 0x21u);
CmpDetachFromRegistryProcess(&ApcState);
if( !RegLockHeld )
CmpUnlockRegistry();
v26 = v44;
if( v44 )
{
CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)v20[1]);
*v26 = v20[1];
}
HalPutDmaAdapter((PADAPTER_OBJECT)v38);
if( AppHive )
*((_BYTE *)CmHive + 2936) = 1;
v13 = 1;
v15 = 0;
v17 = 0;
LABEL_29:
v20 = 0i64;
if( v17 >= 0 || !v13 )
goto LABEL_30;
CmpAttachToRegistryProcess(&ApcState);
LABEL_44:
if( !RegLockHeld )
CmpLockRegistry();
CmpRemoveHiveFromNamespace(CmHive, v20[1]);
CmpDrainDelayDerefContext((UINT64 **)a1);
if( !RegLockHeld )
CmpUnlockRegistry();
if( v15 )
CmpDetachFromRegistryProcess(&ApcState);
LABEL_30:
if( v12 )
CmpFreeTransientPoolWithTag(v12, 0x624E4D43ui64);
if( v20 )
HalPutDmaAdapter((PADAPTER_OBJECT)v20);
if( v35 )
{
*((_DWORD *)CmHive + 40) &= ~0x20u;
*((_QWORD *)CmHive + 526) = 0i64;
}
CmpCleanupParseContext((__int64)result, RegLockHeld);
return(unsigned int)v17;
}Referenced by:
CmInitSystem1
CmpFinishSystemHivesLoad
CmpInitializePreloadedHive
CmpInitializeSystemHive
CmpLoadHiveVolatile
CmpLoadKeyCommon