CmpLoadHiveThread

NTSTATUS __fastcall CmpLoadHiveThread(PVOID BugCheckParameter3){
  int v1; 
  unsigned int v2; 
  __int64 v3; 
  void *inited; 
  wchar_t *v5; 
  int v6; 
  _KEVENT *v7; 
  __int64 v8; 
  _DWORD *v9; 
  int v10; 
  _UNICODE_STRING *v11; 
  int v12; 
  __int64 v13; 
  int FileSize; 
  UINT64 v15; 
  unsigned int v16; 
  __int64 v17; 
  int v18; 
  UINT64 v19; 
  unsigned int v20; 
  __int128 v21; 
  __int64 v22; 
  unsigned int v23; 
  unsigned int i; 
  __int64 v25; 
  int v26; 
  __int64 v27; 
  int v28; 
  wchar_t *v29; 
  PLARGE_INTEGER Timeout; 
  PLARGE_INTEGER Timeouta; 
  PLARGE_INTEGER Timeoutb; 
  _GUID *v34; 
  INT64 v35; 
  UINT64 *v36; 
  UINT64 *v37; 
  char HiveLoadFailure[560]; 

  v1 = 0;
  *(_QWORD *)&HiveLoadFailure[48] = BugCheckParameter3;
  v2 = (unsigned int)BugCheckParameter3;
  memset(&HiveLoadFailure[24], 0, 24);
  *(_DWORD *)&HiveLoadFailure[16] = 0;
  *(_DWORD *)&HiveLoadFailure[8] = 0;
  memset(&HiveLoadFailure[56], 0, 24);
  *(_DWORD *)&HiveLoadFailure[12] = 0;
  HiveLoadFailure[0] = 0;
  *(_DWORD *)&HiveLoadFailure[4] = 0;
  memset(&HiveLoadFailure[128], 0i64, 0x1B0u);
  v3 = 25i64 * v2;
  *(_DWORD *)&HiveLoadFailure[104] = 0;
  *(_QWORD *)&HiveLoadFailure[120] = v2;
  LODWORD(inited) = 0;
  KeWaitForSingleObject((UINT64)&CmpMachineHiveList[v3 + 8], 0, 0, 0, 0i64);
  if( v2 == CmpCheckHiveIndex )
  {
    KeWaitForSingleObject((UINT64)&CmpDummyThreadEvent + 2688, 0, 0, 0, 0i64);
    if( (_BYTE)KdDebuggerEnabled )
    {
      if( !(_BYTE)KdDebuggerNotPresent )
        __debugbreak();
    }
  }
  v5 = CmpMachineHiveList[v3 + 3];
  BYTE2(CmpMachineHiveList[v3 + 7]) = 1;
  if( v5 )
  {
    v9 = v5 + 80;
    *(_QWORD *)&HiveLoadFailure[24] = v5;
    v10 = *((_DWORD *)v5 + 40);
    if( (v10 & 0x8001) != 0 )
    {
      if( CmpMiniNTBoot || *(&stru_140CF2E80 + 1867) )
      {
        if( (v10 & 2) != 0 )
        {
          CmpLockRegistry();
          HvLockHiveFlusherExclusive((INT64)v5);
          *v9 &= ~2u;
          HvUnlockHiveFlusherExclusive((INT64)v5);
          CmpUnlockRegistry();
        }
        *(_DWORD *)&SystemHiveFullPathName.Length = 0x800000;
        SystemHiveFullPathName.Buffer = (char *)&SystemHiveFullPathBuffer;
        RtlAppendStringToString(&SystemHiveFullPathName, (const _STRING *)&CmpMachineHiveList[v3 + 23]);
      }
      v26 = *(_DWORD *)&HiveLoadFailure[48];
    }
    else
    {
      v11 = (_UNICODE_STRING *)&CmpMachineHiveList[v3 + 23];
      *(_QWORD *)&HiveLoadFailure[80] = v11;
      LODWORD(inited) = CmpOpenHiveFile(
                          v11,
                          0,
                          (VOID **)&HiveLoadFailure[32],
                          (int *)&HiveLoadFailure[4],
                          7,
                          0i64,
                          (__int64)&HiveLoadFailure[40],
                          0i64,
                          0i64);
      if( (int)inited < 0 )
        goto LABEL_83;
      v12 = (16 * (*(_DWORD *)&HiveLoadFailure[4] == 2)) | 2;
      LODWORD(inited) = CmpOpenHiveFile(
                          v11,
                          4u,
                          (VOID **)&HiveLoadFailure[56],
                          (int *)&HiveLoadFailure[8],
                          v12,
                          0i64,
                          0i64,
                          0i64,
                          0i64);
      if( (int)inited < 0 )
      {
        v1 = 16;
        goto LABEL_83;
      }
      LODWORD(inited) = CmpOpenHiveFile(
                          v11,
                          5u,
                          (VOID **)&HiveLoadFailure[64],
                          (int *)&HiveLoadFailure[12],
                          v12,
                          0i64,
                          0i64,
                          0i64,
                          0i64);
      if( (int)inited < 0 )
      {
        v1 = 32;
        goto LABEL_83;
      }
      LODWORD(inited) = CmpGetFileSize(*(VOID **)&HiveLoadFailure[32], (UINT64 *)&HiveLoadFailure[72]);
      if( (int)inited < 0 )
      {
        v1 = 40;
        goto LABEL_83;
      }
      v13 = *(_QWORD *)&HiveLoadFailure[56];
      FileSize = CmpGetFileSize(*(VOID **)&HiveLoadFailure[56], (UINT64 *)&HiveLoadFailure[88]);
      v16 = FileSize;
      if( FileSize < 0 )
      {
        CmpLogFailureToGetFileSize(v15, 4i64, (unsigned int)FileSize);
        LODWORD(Timeouta) = 43;
        *((_QWORD *)v5 + 7) = &HiveLoadFailure[128];
        *(_QWORD *)&HiveLoadFailure[128] = v5;
        SetFailureLocation(
          (_HIVE_LOAD_FAILURE *)&HiveLoadFailure[128],
          1ui64,
          _CmpLoadHiveThread,
          v16,
          (UINT64)Timeouta);
        *(_QWORD *)&HiveLoadFailure[88] = 0i64;
      }
      v17 = *(_QWORD *)&HiveLoadFailure[64];
      v18 = CmpGetFileSize(*(VOID **)&HiveLoadFailure[64], (UINT64 *)&HiveLoadFailure[96]);
      v20 = v18;
      if( v18 < 0 )
      {
        CmpLogFailureToGetFileSize(v19, 5i64, (unsigned int)v18);
        LODWORD(Timeouta) = 45;
        *((_QWORD *)v5 + 7) = &HiveLoadFailure[128];
        *(_QWORD *)&HiveLoadFailure[128] = v5;
        SetFailureLocation(
          (_HIVE_LOAD_FAILURE *)&HiveLoadFailure[128],
          1ui64,
          _CmpLoadHiveThread,
          v20,
          (UINT64)Timeouta);
        *(_QWORD *)&HiveLoadFailure[96] = 0i64;
      }
      CmpBecomeActiveFlusherAndReconciler((PCMHIVE)v5);
      CmpLockRegistry();
      HvLockHiveFlusherExclusive((INT64)v5);
      v21 = *(_OWORD *)&HiveLoadFailure[88];
      *((_QWORD *)v5 + 192) = *(_QWORD *)&HiveLoadFailure[32];
      v22 = *(_QWORD *)&HiveLoadFailure[72];
      *((_QWORD *)v5 + 196) = v13;
      *((_QWORD *)v5 + 197) = v17;
      *((_QWORD *)v5 + 224) = v22;
      *(_OWORD *)(v5 + 900) = v21;
      *v9 &= ~2u;
      *((_DWORD *)v5 + 1038) = HIDWORD(CmpMachineHiveList[v3 + 4]);
      *((_DWORD *)v5 + 46) = *(_DWORD *)&HiveLoadFailure[44];
      if( (int)CmpDoFileSetSizeEx((INT64)v5, 0i64, (unsigned int)(*((_DWORD *)v5 + 68) + 4096), 1) < 0 )
        CmpCannotWriteConfiguration = 1;
      v23 = *(_DWORD *)&HiveLoadFailure[40];
      if( *((_DWORD *)v5 + 34) != *(_DWORD *)&HiveLoadFailure[40] )
      {
        for( i = 0; i < *((_DWORD *)v5 + 22); i += v23 )
        {
          if( !RtlAreBitsClear((_RTL_BITMAP *)(v5 + 44), i, v23) )
            RtlSetBits((_RTL_BITMAP *)(v5 + 44), i, v23);
        }
        *((_DWORD *)v5 + 26) = RtlNumberOfSetBits((UINT64 *)v5 + 11);
        *((_DWORD *)v5 + 34) = v23;
      }
      v25 = *((_QWORD *)v5 + 8);
      if( *(_DWORD *)(v25 + 4092) || (*(_DWORD *)(v25 + 4088) & 4) != 0 )
      {
        RtlSetAllBits((PRTL_BITMAP)(v5 + 44));
        *((_DWORD *)v5 + 26) = *((_DWORD *)v5 + 22);
      }
      HvUnlockHiveFlusherExclusive((INT64)v5);
      CmpUnlockRegistry();
      CmpLockRegistryExclusive();
      v26 = *(_DWORD *)&HiveLoadFailure[48];
      if( *(_DWORD *)&HiveLoadFailure[48] == 3 )
      {
        HvLockHiveFlusherShared((INT64)v5);
        CmpMarkCurrentValueDirty(v5, *(unsigned int *)(*((_QWORD *)v5 + 8) + 36i64));
        HvUnlockHiveFlusherShared((INT64)v5);
      }
      CmpMachineHiveList[v3 + 6] = v5;
      LODWORD(inited) = HvpDropPagedBins((_HHIVE *)v5);
      if( (int)inited < 0 )
      {
        v11 = *(_UNICODE_STRING **)&HiveLoadFailure[80];
        v1 = 80;
LABEL_83:
        *((_QWORD *)v5 + 7) = &HiveLoadFailure[128];
        *(_QWORD *)&HiveLoadFailure[128] = v5;
        LODWORD(Timeouta) = v1;
        SetFailureLocation(
          (_HIVE_LOAD_FAILURE *)&HiveLoadFailure[128],
          0i64,
          _CmpLoadHiveThread,
          (unsigned int)inited,
          (UINT64)Timeouta);
        *(_QWORD *)&HiveLoadFailure[112] = v11;
        BYTE6(NlsMbCodePageTag) = 1;
        LODWORD(Timeoutb) = 1;
        ExRaiseHardError(
          3221226008i64,
          1u,
          1ui64,
          (UINT64 *)&HiveLoadFailure[112],
          (UINT64)Timeoutb,
          (UINT64 *)&HiveLoadFailure[16],
          v35,
          v37);
        KeBugCheckEx(0x74u, (PVOID)2, (PVOID)1, *(PVOID *)&HiveLoadFailure[120], (PVOID)(int)inited);
      }
      CmpUnlockRegistry();
      CmpFinishBeingActiveFlusherAndReconciler((_EX_PUSH_LOCK *)v5);
      v27 = *((_QWORD *)v5 + 8);
      if( *(_DWORD *)(v27 + 4092) || (*(_DWORD *)(v27 + 4088) & 4) != 0 )
      {
        CmpFlushHive((CMHIVE *)v5, 0xCui64);
        CmpLockRegistry();
        HvLockHiveFlusherExclusive((INT64)v5);
        *(_DWORD *)(*((_QWORD *)v5 + 8) + 4092i64) = 0;
        *(_DWORD *)(*((_QWORD *)v5 + 8) + 4088i64) &= ~4u;
        HvUnlockHiveFlusherExclusive((INT64)v5);
        CmpUnlockRegistry();
      }
      if( CmpCannotWriteConfiguration )
        CmpDiskFullWarning();
      SystemHiveFullPathName.Buffer = (char *)&SystemHiveFullPathBuffer;
      *(_DWORD *)&SystemHiveFullPathName.Length = 0x800000;
      RtlAppendStringToString(&SystemHiveFullPathName, *(const _STRING **)&HiveLoadFailure[80]);
      if( dword_140C50480 && (int)CmpInitBackupHive((_CMHIVE *)v5, CmpMachineHiveList[v3]) < 0 )
        dword_140C50480 = 0;
    }
    *((_DWORD *)v5 + 1038) |= 4u;
    if( v26 == 3 )
    {
      CmpLockRegistry();
      HvLockHiveFlusherShared((INT64)v5);
      *v9 |= 0x200u;
      HvUnlockHiveFlusherShared((INT64)v5);
      CmpUnlockRegistry();
    }
    goto LABEL_69;
  }
  LODWORD(Timeout) = 22609921;
  inited = (void *)(int)CmpInitHiveFromFile(
                          (_UNICODE_STRING *)&CmpMachineHiveList[v3 + 23],
                          LODWORD(CmpMachineHiveList[v3 + 4]),
                          (_CMHIVE **)&HiveLoadFailure[24],
                          (UINT8 *)&CmpMachineHiveList[v3 + 7] + 3,
                          (UINT64)Timeout,
                          0i64,
                          v34,
                          (UINT8 *)v36,
                          (_HIVE_LOAD_FAILURE *)HiveLoadFailure);
  if( v2 == 6 && !BYTE4(CmpMachineHiveList[v3 + 7]) && ((_DWORD)inited == -1073741772 || (_DWORD)inited == -1073741765)
    || (v6 = 0x8000, ((__int64)CmpMachineHiveList[v3 + 4] & 0x8000) != 0)
    && !BYTE4(CmpMachineHiveList[v3 + 7])
    && (_DWORD)inited == -1073741772 )
  {
    LODWORD(inited) = 0;
    goto LABEL_75;
  }
  if( (_DWORD)inited != -1073741431 || !CmpIsShutdownRundownActive() )
  {
    if( (int)inited < 0
      || (v5 = *(wchar_t **)&HiveLoadFailure[24], (v6 & (__int64)CmpMachineHiveList[v3 + 4]) == 0)
      && (!*(_QWORD *)(*(_QWORD *)&HiveLoadFailure[24] + 1568i64)
       || !*(_QWORD *)(*(_QWORD *)&HiveLoadFailure[24] + 1576i64)) )
    {
      BYTE6(NlsMbCodePageTag) = 1;
      KeBugCheckEx(0x74u, (PVOID)2, &HiveLoadFailure[128], (PVOID)v2, inited);
    }
    *(_DWORD *)(*(_QWORD *)&HiveLoadFailure[24] + 4152i64) = HIDWORD(CmpMachineHiveList[v3 + 4]) | 4;
    CmpMachineHiveList[v3 + 6] = v5;
    if( HiveLoadFailure[0] )
    {
      v7 = (_KEVENT *)&stru_140C00F40;
      NeedRmLogStart = 1;
      v8 = 7i64;
      do
      {
        KeSetEvent(v7, 0, 0);
        v7 = (_KEVENT *)((char *)v7 + 200);
        --v8;
      }
      while( v8 );
    }
    v9 = v5 + 80;
    if( (*((_DWORD *)v5 + 40) & 0x8001) == 0
      && dword_140C50480
      && (int)CmpInitBackupHive((_CMHIVE *)v5, CmpMachineHiveList[v3]) < 0 )
    {
      dword_140C50480 = 0;
    }
LABEL_69:
    if( CmpAcquireShutdownRundown() )
    {
      if( (*v9 & 0x8001) == 0 )
      {
        if( *((_QWORD *)v5 + 192) )
        {
          v28 = CmpApplyAdminSdOnHiveFiles(v5, CmpMachineHiveList[v3]);
          LODWORD(inited) = v28;
          if( v28 < 0 )
            KeBugCheckEx(0x51u, (PVOID)0x13, v5, CmpMachineHiveList[v3], (PVOID)v28);
        }
      }
      CmpReleaseShutdownRundown();
    }
    else
    {
      LODWORD(inited) = -1073741431;
    }
  }
LABEL_75:
  BYTE1(CmpMachineHiveList[v3 + 7]) = 1;
  KeSetEvent((PRKEVENT)&CmpMachineHiveList[v3 + 11], 0, 0);
  if( _InterlockedIncrement((_DWORD *)&stru_140CF2E80 + 1186) == 6 && (unsigned int)CmpCheckHiveIndex < 7 )
    KeSetEvent((PRKEVENT)((char *)&CmpDummyThreadEvent + 2688), 0, 0);
  v29 = CmpMachineHiveList[v3 + 24];
  if( v29 )
  {
    ExFreePoolWithTag(v29, 0);
    RtlUnicodeStringInit((PUNICODE_STRING)&CmpMachineHiveList[v3 + 23], 0);
  }
  return PsTerminateSystemThread((unsigned int)inited);
}

Referenced by:

No references.