CmpLoadHiveVolatile
INT64 __stdcall CmpLoadHiveVolatile(_CM_KEY_BODY *KeyBody, PVOID FileHandle){
_CM_KEY_CONTROL_BLOCK *KeyControlBlock;
_UNICODE_STRING *v5;
int v7;
_HHIVE *KeyHive;
int Hive;
unsigned int v10;
unsigned int v11;
__int64 v12;
_UNICODE_STRING *v13;
__int16 v14;
unsigned __int16 v15;
unsigned __int16 v16;
__int16 v17;
_QWORD *v18;
_QWORD *v19;
INT64 a5;
CHAR a6;
INT64 a6a;
INT64 a7;
UINT64 Flags;
UINT64 Flagsa;
PVOID P;
_UNICODE_STRING DestinationString;
PVOID v28;
int v29[2];
_UNICODE_STRING Source;
INT64 v31;
__int128 v32;
__int64 v33;
UUID a10;
UUID Uuid;
INT64 a12[54];
KeyControlBlock = KeyBody->KeyControlBlock;
v29[0] = -1;
P = 0i64;
v28 = 0i64;
v33 = 0i64;
v29[1] = 0;
v5 = 0i64;
Source = 0i64;
DestinationString = 0i64;
Uuid = 0i64;
a10 = 0i64;
v32 = 0i64;
memset(a12, 0i64, sizeof(a12));
if( !CmpAcquireShutdownRundown() )
return 3221225865i64;
v7 = CmpUuidCreate(&Uuid);
if( v7 >= 0 )
{
v7 = CmpUuidCreate(&a10);
if( v7 >= 0 )
{
KeyHive = KeyControlBlock->KeyHash.KeyHive;
if( KeyHive == *(_HHIVE **)&CmpMasterHive )
{
v33 = 0i64;
LODWORD(Flags) = 17825793;
v32 = 0i64;
v31 = (INT64)FileHandle;
Hive = CmpCreateHive(
(INT64)&v28,
2ui64,
0x8000ui64,
0i64,
0i64,
(INT64)&v31,
0i64,
Flags,
0i64,
0i64,
0i64,
(INT64)a12);
if( Hive >= 0 )
{
LODWORD(Flagsa) = 17825792;
v7 = CmpCreateHive(
(INT64)&P,
0i64,
1ui64,
0i64,
0i64,
0i64,
0i64,
Flagsa,
(INT64)&Uuid,
(INT64)&a10,
0i64,
(INT64)a12);
if( v7 >= 0 )
{
CmpLockRegistryExclusive();
if( CmpIsKeyDeletedForKeyBody(KeyBody, 0i64) )
{
v7 = -1073741444;
}
else if( LOBYTE(KeyHive[1].Storage[1].FreeDisplay[19].Display.SizeOfBitMap) == 1 )
{
v7 = -1073741431;
}
else
{
LODWORD(a7) = 1;
v10 = CmpCopyKeyPartial(
(UINT64)v28,
*(unsigned int *)(*((_QWORD *)v28 + 8) + 36i64),
(UINT64)P,
0xFFFFFFFFui64,
2,
a6,
a7);
v11 = v10;
if( v10 != -1 )
{
LODWORD(a6a) = 0;
*(_DWORD *)(*((_QWORD *)P + 8) + 36i64) = v10;
if( CmpCopySyncTree(
(UINT64)v28,
*(unsigned int *)(*((_QWORD *)v28 + 8) + 36i64),
(UINT64)P,
v10,
2,
a6a) )
{
v12 = (*((__int64(__fastcall **)(PVOID, _QWORD, int *))P + 1))(P, v11, v29);
if( v12 )
{
v13 = CmpConstructName(KeyControlBlock);
v14 = 2 * *(_WORD *)(v12 + 72);
v5 = v13;
if( (*(_BYTE *)(v12 + 2) & 0x20) == 0 )
v14 = *(_WORD *)(v12 + 72);
v15 = v13->Length + v14 + 2;
DestinationString.Buffer = (wchar_t *)ExAllocatePoolWithTag(1ui64, v15, 538987843i64);
if( DestinationString.Buffer )
{
DestinationString.MaximumLength = v15;
DestinationString.Length = v15;
RtlCopyUnicodeString(&DestinationString, v5);
RtlAppendUnicodeToString(&DestinationString, (WCHAR *)L"\\");
v16 = *(_WORD *)(v12 + 72);
if( (*(_BYTE *)(v12 + 2) & 0x20) != 0 )
{
CmpCopyCompressedName(
&DestinationString.Buffer[(unsigned __int64)DestinationString.Length >> 1],
DestinationString.MaximumLength - (unsigned int)DestinationString.Length,
(PWCHAR)(v12 + 76),
(unsigned __int16)(2 * v16));
v17 = 2 * *(_WORD *)(v12 + 72);
if( (*(_BYTE *)(v12 + 2) & 0x20) == 0 )
v17 = *(_WORD *)(v12 + 72);
DestinationString.Length += v17;
}
else
{
Source.MaximumLength = *(_WORD *)(v12 + 72);
Source.Length = v16;
Source.Buffer = (wchar_t *)(v12 + 76);
RtlAppendUnicodeStringToString(&DestinationString, &Source);
}
(*((void(__fastcall **)(PVOID, int *))P + 2))(P, v29);
LODWORD(a5) = 512;
v7 = CmpLinkHiveToMaster(
&DestinationString,
0i64,
(_CMHIVE *)P,
0i64,
a5,
0,
0i64,
0i64,
0i64,
0i64,
1u);
if( v7 >= 0 )
{
CmpAddToHiveFileList((_CMHIVE *)P);
CmpLockHiveListExclusive();
v18 = (_QWORD *)qword_140D2D918;
v19 = (char *)P + 1600;
if( *(__int64 **)qword_140D2D918 != &CmpHiveListHead )
__fastfail(3u);
*v19 = &CmpHiveListHead;
v19[1] = v18;
*v18 = v19;
qword_140D2D918 = (__int64)v19;
CmpUnlockHiveList();
if( !CmpProfileLoaded )
{
CmpGlobalQuotaAllowed = CmpGlobalQuota;
CmpProfileLoaded = 1;
}
}
CmpUnlockRegistry();
if( v7 < 0 )
CmpDestroyHive(P);
CmpDestroyHive(v28);
ExFreePoolWithTag(DestinationString.Buffer, 0);
ExFreePoolWithTag(v5, 0x624E4D43u);
goto LABEL_25;
}
(*((void(__fastcall **)(PVOID, int *))P + 2))(P, v29);
}
}
}
v7 = -1073741670;
}
CmpUnlockRegistry();
CmpDestroyHive(P);
}
CmpDestroyHive(v28);
if( v5 )
CmpFreeTransientPoolWithTag(v5, 0x624E4D43ui64);
}
else
{
v7 = Hive;
}
}
else
{
v7 = -1073741811;
}
}
}
LABEL_25:
CmpReleaseShutdownRundown();
return(unsigned int)v7;
}Referenced by:
CmRestoreKey