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