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.