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.