CmpLoadHiveThread

VOID __stdcall CmpLoadHiveThread(PVOID StartContext){
  int v1; 
  unsigned int v2; 
  __int64 v3; 
  ULONG_PTR inited; 
  wchar_t *v5; 
  WCHAR v6; 
  int v7; 
  struct _KEVENT *v8; 
  __int64 v9; 
  _DWORD *v10; 
  int v11; 
  STRING *v12; 
  int v13; 
  PVOID v14; 
  NTSTATUS FileSize; 
  UINT64 v16; 
  unsigned int v17; 
  PVOID v18; 
  NTSTATUS v19; 
  UINT64 v20; 
  unsigned int v21; 
  __int128 v22; 
  UINT64 v23; 
  ULONG v24; 
  unsigned int i; 
  __int64 v26; 
  int v27; 
  EVENT_DESCRIPTOR *v28; 
  __int64 v29; 
  WCHAR v30; 
  NTSTATUS v31; 
  wchar_t *v32; 
  PLARGE_INTEGER Timeout; 
  PLARGE_INTEGER Timeouta; 
  PLARGE_INTEGER Timeoutb; 
  _GUID *a7; 
  UINT8 *a8; 
  int HiveLoadFailure; 
  INT64 a4; 
  INT64 v40; 
  ULONG_PTR v41; 
  void *a3; 
  ULONG Length[2]; 
  PVOID v44; 
  PVOID FileHandle; 
  PVOID v46; 
  UINT64 FileLength; 
  STRING *Source; 
  UINT64 v49[2]; 
  int v50; 
  UINT64 Parameters; 
  ULONG_PTR BugCheckParameter3; 
  ULONG_PTR BugCheckParameter2[54]; 
  v1 = 0;
  v44 = StartContext;
  v2 = (unsigned int)StartContext;
  v41 = 0i64;
  FileLength = 0i64;
  FileHandle = 0i64;
  v40 = 0i64;
  v46 = 0i64;
  LOBYTE(HiveLoadFailure) = 0;
  a4 = 0i64;
  a3 = 0i64;
  memset((INT64)BugCheckParameter2, 0i64);
  v3 = 25i64 * v2;
  *(_QWORD *)Length = 0i64;
  v50 = 0;
  BugCheckParameter3 = v2;
  LODWORD(inited) = 0;
  KeWaitForSingleObject(&CmpMachineHiveList[v3 + 8], Executive, 0, 0, 0i64);
  if( v2 == CmpCheckHiveIndex )
  {
    KeWaitForSingleObject(&CmpLoadWorkerDebugEvent, Executive, 0, 0, 0i64);
    if( (_BYTE)KdDebuggerEnabled )
    {
      if( !(_BYTE)KdDebuggerNotPresent )
        __debugbreak();
    }
  }
  v5 = CmpMachineHiveList[v3 + 3];
  BYTE2(CmpMachineHiveList[v3 + 7]) = 1;
  if( v5 )
  {
    v10 = v5 + 80;
    v41 = (ULONG_PTR)v5;
    v11 = *((_DWORD *)v5 + 40);
    if( (v11 & 0x8001) != 0 )
    {
      if( CmpMiniNTBoot || CmpVolatileBoot )
      {
        if( (v11 & 2) != 0 )
        {
          CmpLockRegistry();
          HvLockHiveFlusherExclusive((INT64)v5);
          *v10 &= ~2u;
          HvUnlockHiveFlusherExclusive((INT64)v5);
          CmpUnlockRegistry();
        }
        *(_DWORD *)&SystemHiveFullPathName.Length = 0x800000;
        SystemHiveFullPathName.Buffer = (char *)SystemHiveFullPathBuffer;
        RtlAppendStringToString(&SystemHiveFullPathName, (const _STRING *)&CmpMachineHiveList[v3 + 23]);
      }
      v27 = (int)v44;
    }
    else
    {
      v12 = (STRING *)&CmpMachineHiveList[v3 + 23];
      Source = v12;
      LODWORD(Timeout) = 7;
      LODWORD(inited) = CmpOpenHiveFile(
                          (_UNICODE_STRING *)v12,
                          0i64,
                          &a3,
                          &a4,
                          (INT64)Timeout,
                          0i64,
                          (INT64)Length,
                          0i64,
                          0i64);
      if( (inited & 0x80000000) != 0i64 )
        goto LABEL_83;
      v13 = (16 * ((_DWORD)a4 == 2)) | 2;
      LODWORD(Timeouta) = v13;
      LODWORD(inited) = CmpOpenHiveFile(
                          (_UNICODE_STRING *)v12,
                          4ui64,
                          &FileHandle,
                          (INT64 *)((char *)&a4 + 4),
                          (INT64)Timeouta,
                          0i64,
                          0i64,
                          0i64,
                          0i64);
      if( (inited & 0x80000000) != 0i64 )
      {
        v1 = 16;
        goto LABEL_83;
      }
      LODWORD(Timeouta) = v13;
      LODWORD(inited) = CmpOpenHiveFile(
                          (_UNICODE_STRING *)v12,
                          5ui64,
                          &v46,
                          &v40,
                          (INT64)Timeouta,
                          0i64,
                          0i64,
                          0i64,
                          0i64);
      if( (inited & 0x80000000) != 0i64 )
      {
        v1 = 32;
        goto LABEL_83;
      }
      LODWORD(inited) = CmpGetFileSize(a3, &FileLength);
      if( (inited & 0x80000000) != 0i64 )
      {
        v1 = 40;
        goto LABEL_83;
      }
      v14 = FileHandle;
      FileSize = CmpGetFileSize(FileHandle, v49);
      v17 = FileSize;
      if( FileSize < 0 )
      {
        CmpLogFailureToGetFileSize(v16, 4i64, (unsigned int)FileSize);
        LODWORD(Timeouta) = 43;
        *((_QWORD *)v5 + 7) = BugCheckParameter2;
        BugCheckParameter2[0] = (ULONG_PTR)v5;
        SetFailureLocation((INT64)BugCheckParameter2, 1i64, 22i64, v17, (INT64)Timeouta);
        v49[0] = 0i64;
      }
      v18 = v46;
      v19 = CmpGetFileSize(v46, &v49[1]);
      v21 = v19;
      if( v19 < 0 )
      {
        CmpLogFailureToGetFileSize(v20, 5i64, (unsigned int)v19);
        LODWORD(Timeouta) = 45;
        *((_QWORD *)v5 + 7) = BugCheckParameter2;
        BugCheckParameter2[0] = (ULONG_PTR)v5;
        SetFailureLocation((INT64)BugCheckParameter2, 1i64, 22i64, v21, (INT64)Timeouta);
        v49[1] = 0i64;
      }
      CmpBecomeActiveFlusherAndReconciler((__int64)v5);
      CmpLockRegistry();
      HvLockHiveFlusherExclusive((INT64)v5);
      v22 = *(_OWORD *)v49;
      *((_QWORD *)v5 + 192) = a3;
      v23 = FileLength;
      *((_QWORD *)v5 + 196) = v14;
      *((_QWORD *)v5 + 197) = v18;
      *((_QWORD *)v5 + 224) = v23;
      *(_OWORD *)(v5 + 900) = v22;
      *v10 &= ~2u;
      *((_DWORD *)v5 + 1038) = HIDWORD(CmpMachineHiveList[v3 + 4]);
      *((_DWORD *)v5 + 46) = Length[1];
      if( (int)CmpDoFileSetSizeEx((INT64)v5, 0i64, (unsigned int)(*((_DWORD *)v5 + 68) + 4096), 1) < 0 )
        CmpCannotWriteConfiguration = 1;
      v24 = Length[0];
      if( *((_DWORD *)v5 + 34) != Length[0] )
      {
        for( i = 0; i < *((_DWORD *)v5 + 22); i += v24 )
        {
          if( !RtlAreBitsClear((RTL_BITMAP *)(v5 + 44), i, v24) )
            RtlSetBits((RTL_BITMAP *)(v5 + 44), i, v24);
        }
        *((_DWORD *)v5 + 26) = RtlNumberOfSetBits((PRTL_BITMAP)(v5 + 44));
        *((_DWORD *)v5 + 34) = v24;
      }
      v26 = *((_QWORD *)v5 + 8);
      if( *(_DWORD *)(v26 + 4092) || (*(_DWORD *)(v26 + 4088) & 4) != 0 )
      {
        RtlSetAllBits((RTL_BITMAP *)(v5 + 44));
        *((_DWORD *)v5 + 26) = *((_DWORD *)v5 + 22);
      }
      HvUnlockHiveFlusherExclusive((INT64)v5);
      CmpUnlockRegistry();
      CmpLockRegistryExclusive();
      v27 = (int)v44;
      if( (_DWORD)v44 == 3 )
      {
        HvLockHiveFlusherShared((INT64)v5);
        CmpMarkCurrentValueDirty((WCHAR)v5);
        HvUnlockHiveFlusherShared((INT64)v5);
      }
      CmpMachineHiveList[v3 + 6] = v5;
      LODWORD(inited) = HvpDropPagedBins((_HHIVE *)v5);
      if( (inited & 0x80000000) != 0i64 )
      {
        v12 = Source;
        v1 = 80;
LABEL_83:
        *((_QWORD *)v5 + 7) = BugCheckParameter2;
        BugCheckParameter2[0] = (ULONG_PTR)v5;
        LODWORD(Timeouta) = v1;
        SetFailureLocation((INT64)BugCheckParameter2, 0i64, 22i64, (unsigned int)inited, (INT64)Timeouta);
        Parameters = (UINT64)v12;
        BYTE6(NlsMbCodePageTag) = 1;
        LODWORD(Timeoutb) = 1;
        ExRaiseHardError(3221226008i64, 1ui64, 1ui64, &Parameters, (UINT64)Timeoutb, (UINT64 *)((char *)&v40 + 4));
        KeBugCheckEx(0x74u, 2ui64, 1ui64, BugCheckParameter3, (int)inited);
      }
      CmpUnlockRegistry();
      CmpFinishBeingActiveFlusherAndReconciler((__int64)v5);
      v29 = *((_QWORD *)v5 + 8);
      if( *(_DWORD *)(v29 + 4092) || (*(_DWORD *)(v29 + 4088) & 4) != 0 )
      {
        CmpFlushHive((ULONG_PTR)v5, 12, v28);
        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, Source);
      if( CmpDoIdleProcessing && CmpInitBackupHive((__int64)v5, CmpMachineHiveList[v3], v30) < 0 )
        CmpDoIdleProcessing = 0;
    }
    *((_DWORD *)v5 + 1038) |= 4u;
    if( v27 == 3 )
    {
      CmpLockRegistry();
      HvLockHiveFlusherShared((INT64)v5);
      *v10 |= 0x200u;
      HvUnlockHiveFlusherShared((INT64)v5);
      CmpUnlockRegistry();
    }
    goto LABEL_69;
  }
  LODWORD(Timeout) = 22609921;
  inited = (int)CmpInitHiveFromFile(
                  (_UNICODE_STRING *)&CmpMachineHiveList[v3 + 23],
                  LODWORD(CmpMachineHiveList[v3 + 4]),
                  (_CMHIVE **)&v41,
                  (UINT8 *)&CmpMachineHiveList[v3 + 7] + 3,
                  (UINT64)Timeout,
                  0i64,
                  a7,
                  a8,
                  (_HIVE_LOAD_FAILURE *)&HiveLoadFailure);
  if( v2 == 6 && !BYTE4(CmpMachineHiveList[v3 + 7]) && ((_DWORD)inited == -1073741772 || (_DWORD)inited == -1073741765)
    || (v7 = 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( (inited & 0x80000000) != 0i64
      || (v5 = (wchar_t *)v41, (v7 & (__int64)CmpMachineHiveList[v3 + 4]) == 0)
      && (!*(_QWORD *)(v41 + 1568) || !*(_QWORD *)(v41 + 1576)) )
    {
      BYTE6(NlsMbCodePageTag) = 1;
      KeBugCheckEx(0x74u, 2ui64, (ULONG_PTR)BugCheckParameter2, v2, inited);
    }
    *(_DWORD *)(v41 + 4152) = HIDWORD(CmpMachineHiveList[v3 + 4]) | 4;
    CmpMachineHiveList[v3 + 6] = v5;
    if( (_BYTE)HiveLoadFailure )
    {
      v8 = &stru_140C00F40;
      CmpInitRmLogOnLoad = 1;
      v9 = 7i64;
      do
      {
        KeSetEvent(v8, 0);
        v8 = (struct _KEVENT *)((char *)v8 + 200);
        --v9;
      }
      while( v9 );
    }
    v10 = v5 + 80;
    if( (*((_DWORD *)v5 + 40) & 0x8001) == 0
      && CmpDoIdleProcessing
      && CmpInitBackupHive((__int64)v5, CmpMachineHiveList[v3], v6) < 0 )
    {
      CmpDoIdleProcessing = 0;
    }
LABEL_69:
    if( CmpAcquireShutdownRundown() )
    {
      if( (*v10 & 0x8001) == 0 )
      {
        if( *((_QWORD *)v5 + 192) )
        {
          v31 = CmpApplyAdminSdOnHiveFiles(v5, CmpMachineHiveList[v3]);
          LODWORD(inited) = v31;
          if( v31 < 0 )
            KeBugCheckEx(0x51u, 0x13ui64, (ULONG_PTR)v5, (ULONG_PTR)CmpMachineHiveList[v3], v31);
        }
      }
      CmpReleaseShutdownRundown();
    }
    else
    {
      LODWORD(inited) = -1073741431;
    }
  }
LABEL_75:
  BYTE1(CmpMachineHiveList[v3 + 7]) = 1;
  KeSetEvent((PRKEVENT)&CmpMachineHiveList[v3 + 11], 0);
  if( _InterlockedIncrement(&CmpLoadWorkerIncrement) == 6 && (unsigned int)CmpCheckHiveIndex < 7 )
    KeSetEvent(&CmpLoadWorkerDebugEvent, 0);
  v32 = CmpMachineHiveList[v3 + 24];
  if( v32 )
  {
    ExFreePoolWithTag(v32, 0);
    RtlUnicodeStringInit((PUNICODE_STRING)&CmpMachineHiveList[v3 + 23], 0i64);
  }
  PsTerminateSystemThread((unsigned int)inited);
}

Referenced by:

No references.