CmpCheckKey
INT64 __fastcall CmpCheckKey(
_HHIVE *HiveToCheck,
UINT64 CheckFlags,
UINT64 Cell,
UINT64 ParentCell,
UINT8 ResetSD,
_RTL_BITMAP *Bitmap){
_HIVE_LOAD_FAILURE *v6;
unsigned int v8;
unsigned int v9;
unsigned int v10;
_CELL_DATA *v12;
_CELL_DATA *v13;
unsigned int v14;
unsigned int NameLength;
unsigned int v16;
char v17;
unsigned int v18;
unsigned int v19;
int v20;
UINT64 v21;
unsigned int ClassLength;
unsigned int Class;
unsigned int Security;
_CELL_DATA *v25;
bool v26;
void(__fastcall *ReleaseCellRoutine)(_HHIVE *, _HV_GET_CELL_CONTEXT *);
unsigned int v28;
_CELL_DATA *v29;
_CELL_DATA *v30;
_CELL_DATA *v31;
_CELL_DATA *v32;
_CELL_DATA *v33;
unsigned __int16 v34;
int v35;
unsigned __int16 v36;
unsigned int v37;
unsigned __int16 Flags;
UINT64 v39;
UINT64 v40;
__int64 v41;
unsigned __int16 v42;
unsigned int v43;
_CELL_DATA *(__fastcall *GetCellRoutine)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *);
_CELL_DATA *v45;
unsigned __int64 v46;
int v47;
_CELL_DATA *v48;
int v49;
_RTL_BITMAP *v50;
_CELL_DATA *v51;
_CM_KEY_INDEX *v52;
unsigned int v53;
unsigned __int16 Signature;
int v55;
bool v56;
int v57;
int v58;
int Count;
int v60;
int v61;
unsigned int v62;
char *v63;
_CELL_DATA *v64;
_CM_KEY_INDEX *v65;
unsigned int v66;
unsigned __int16 v67;
int v68;
__int16 v69;
int v70;
int v71;
int v72;
int v73;
bool v74;
bool v75;
UINT64 Point;
_RTL_BITMAP *Bitmapa;
_CELL_DATA *v78;
int v79[2];
UINT64 v80;
unsigned int v81;
int v82[2];
int v83;
int v84;
int v85[2];
int v86[2];
UINT64 Index;
int v88[2];
int v89[2];
UINT64 Cella;
unsigned int v91;
unsigned int CellIndex;
unsigned int v93;
_HIVE_LOAD_FAILURE *HiveLoadFailure;
char HiveLoadFailurea;
v93 = ParentCell;
CellIndex = Cell;
v91 = CheckFlags;
v6 = HiveLoadFailure;
v85[1] = 0;
v80 = 0i64;
v85[0] = -1;
v8 = ParentCell;
v88[0] = -1;
v9 = Cell;
v82[0] = -1;
v10 = CheckFlags;
v79[0] = -1;
v89[0] = -1;
v88[1] = 0;
v82[1] = 0;
v79[1] = 0;
v89[1] = 0;
HiveLoadFailurea = 0;
v78 = 0i64;
if( v6 )
{
v6->CheckKey.Cell = Cell;
v6->CheckKey.CellPoint = 0i64;
v6->CheckKey.RootPoint = 0i64;
v6->CheckKey.Index = -1;
}
if( !HvIsCellAllocated(HiveToCheck, (unsigned int)Cell, Bitmap) )
{
LODWORD(Point) = 0;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
return 3221225804i64;
}
v12 = HiveToCheck->GetCellRoutine(HiveToCheck, v9, v88);
v13 = v12;
if( !v12 )
{
LODWORD(Point) = 16;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225626i64, Point);
return 3221225626i64;
}
if( v6 )
v6->CheckKey.CellPoint = v12;
v14 = -4 - *(_DWORD *)&v12[-1].u.KeyString[38];
if( v14 - 76 > 0x410 )
{
LODWORD(Point) = 32;
LABEL_353:
v18 = -1073741492;
LABEL_354:
v21 = 0i64;
LABEL_355:
SetFailureLocation(v6, v21, _CmpCheckKey, v18, Point);
goto LABEL_356;
}
NameLength = v12->u.KeyNode.NameLength;
if( !(_WORD)NameLength || NameLength + 76 > v14 )
{
LODWORD(Point) = 48;
goto LABEL_353;
}
if( (v12->u.KeyValue.NameLength & 0x20) != 0 )
{
if( (unsigned __int16)NameLength <= 0x100u )
{
if( LOBYTE(v12->u.KeyString[38]) )
{
v16 = 0;
while( *((_BYTE *)&v12->u.KeyString[38] + v16) != 92 )
{
if( ++v16 >= NameLength )
goto LABEL_20;
}
LODWORD(Point) = 1280;
}
else
{
LODWORD(Point) = 64;
}
}
else
{
LODWORD(Point) = 53;
}
goto LABEL_353;
}
if( (unsigned __int16)NameLength > 0x200u )
{
LODWORD(Point) = 69;
goto LABEL_353;
}
if( (NameLength & 1) != 0 )
{
LODWORD(Point) = 80;
goto LABEL_353;
}
if( !v12->u.KeyNode.Name[0] )
{
LODWORD(Point) = 96;
goto LABEL_353;
}
v19 = NameLength >> 1;
v20 = 0;
if( v19 )
{
while( v12->u.KeyNode.Name[v20] != 92 )
{
if( ++v20 >= v19 )
goto LABEL_20;
}
LODWORD(Point) = 1296;
goto LABEL_353;
}
LABEL_20:
v17 = 1;
if( v12->u.KeyNode.Signature != 27502 )
{
HiveLoadFailurea = 1;
v18 = -1073741492;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 144;
v21 = 1i64;
goto LABEL_355;
}
LODWORD(Point) = 112;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 128;
goto LABEL_354;
}
v13->u.KeyNode.Signature = 27502;
HiveToCheck->BaseBlock->BootType |= 4u;
}
if( (HiveToCheck->BaseBlock->Flags & 2) == 0 && (*((_BYTE *)&v13->u.KeyNode + 13) & 3) != 0 )
{
HiveLoadFailurea = 1;
v18 = -1073741492;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 148;
goto LABEL_354;
}
LODWORD(Point) = 146;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 150;
goto LABEL_354;
}
*((_BYTE *)&v13->u.KeyNode + 13) &= 0xFCu;
HiveToCheck->BaseBlock->BootType |= 4u;
}
if( v8 == -1 )
{
if( (*((_BYTE *)&v13->u.KeyNode + 13) & 1) != 0 )
{
HiveLoadFailurea = 1;
v18 = -1073741492;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 492;
goto LABEL_354;
}
LODWORD(Point) = 484;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 488;
goto LABEL_354;
}
*((_BYTE *)&v13->u.KeyNode + 13) = *((_BYTE *)&v13->u.KeyNode + 13) & 0xFC | 2;
goto LABEL_58;
}
}
else
{
if( (*((_BYTE *)&HiveToCheck->GetCellRoutine(HiveToCheck, v8, v82)->u.KeyNode + 13) & 3) == 3
&& (((*((_BYTE *)&v13->u.KeyNode + 13) & 3) - 1) & 0xFD) != 0 )
{
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
HiveLoadFailurea = 1;
v18 = -1073741492;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 156;
goto LABEL_354;
}
LODWORD(Point) = 152;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 154;
goto LABEL_354;
}
*((_BYTE *)&v13->u.KeyNode + 13) |= 3u;
LABEL_58:
HiveToCheck->BaseBlock->BootType |= 4u;
goto LABEL_59;
}
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
}
LABEL_59:
ClassLength = v13->u.KeyNode.ClassLength;
Class = v13->u.KeyNode.Class;
Security = v13->u.KeyNode.Security;
HIDWORD(Index) = v13->u.KeyNode.ValueList.Count;
LODWORD(Cella) = v13->u.KeyNode.ValueList.List;
v81 = ClassLength;
if( ClassLength )
{
if( Class == -1 )
{
HiveLoadFailurea = 1;
v18 = -1073741492;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 157;
goto LABEL_354;
}
LODWORD(Point) = 155;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 159;
goto LABEL_354;
}
v81 = 0;
v13->u.KeyNode.ClassLength = 0;
goto LABEL_93;
}
if( (*((_BYTE *)&v13->u.KeyNode + 13) & 3) == 1 )
{
LODWORD(Point) = 158;
LABEL_80:
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
goto LABEL_81;
}
if( !HvIsCellAllocated(HiveToCheck, Class, Bitmap) )
{
LABEL_81:
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 192;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
v18 = -1073741492;
goto LABEL_356;
}
LODWORD(Point) = 160;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 176;
goto LABEL_354;
}
HiveLoadFailurea = 1;
v13->u.KeyNode.ClassLength = 0;
v13->u.KeyNode.Class = -1;
v81 = 0;
HiveToCheck->BaseBlock->BootType |= 4u;
goto LABEL_93;
}
v25 = HiveToCheck->GetCellRoutine(HiveToCheck, Class, v89);
if( !v25 )
{
v18 = -1073741670;
LODWORD(Point) = 208;
goto LABEL_354;
}
v26 = v81 <= -4 - *(_DWORD *)&v25[-1].u.KeyString[38];
ReleaseCellRoutine = HiveToCheck->ReleaseCellRoutine;
if( !v26 )
{
ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v89);
LODWORD(Point) = 224;
goto LABEL_80;
}
ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v89);
}
else if( Class != -1 )
{
HiveLoadFailurea = 1;
v18 = -1073741492;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 228;
goto LABEL_354;
}
LODWORD(Point) = 232;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 236;
v21 = 1i64;
goto LABEL_355;
}
v13->u.KeyNode.Class = -1;
HiveToCheck->BaseBlock->BootType |= 4u;
goto LABEL_93;
}
v17 = HiveLoadFailurea;
LABEL_93:
if( Security == -1 )
{
LODWORD(Point) = 256;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
v28 = v93;
goto LABEL_111;
}
v28 = v93;
if( v93 == -1 )
goto LABEL_150;
if( (v10 & 0x20000) == 0 && (BYTE3(NlsMbCodePageTag) || (*(&CmpDummyThreadEvent + 2744) & 6) != 0) && ResetSD )
goto LABEL_111;
while( 1 )
{
if( v28 == -1 )
{
LABEL_150:
Flags = v13->u.KeyNode.Flags;
if( (Flags & 0x50) != 0 )
{
LODWORD(Point) = 432;
goto LABEL_346;
}
if( (Flags & 2) == 0 )
goto LABEL_158;
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 480;
goto LABEL_347;
}
LODWORD(Point) = 448;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
v37 = CellIndex;
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 464;
goto LABEL_347;
}
v13->u.KeyNode.Flags &= ~2u;
HiveToCheck->BaseBlock->BootType |= 4u;
}
else
{
if( v13->u.KeyNode.Parent != v28 )
{
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 352;
goto LABEL_347;
}
LODWORD(Point) = 320;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 336;
goto LABEL_347;
}
v13->u.KeyNode.Parent = v28;
HiveToCheck->BaseBlock->BootType |= 4u;
}
v32 = HiveToCheck->GetCellRoutine(HiveToCheck, v28, v82);
v33 = v32;
if( !v32 )
{
v18 = -1073741670;
LODWORD(Point) = 368;
goto LABEL_347;
}
v34 = 2 * v13->u.KeyNode.NameLength;
v35 = *(_DWORD *)&v32->u.KeyString[26];
if( (v13->u.KeyValue.NameLength & 0x20) == 0 )
v34 = v13->u.KeyNode.NameLength;
if( (unsigned __int16)v35 < (unsigned int)v34 )
{
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 370;
v40 = 0i64;
goto LABEL_165;
}
LODWORD(Point) = 372;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)v93, 0) )
{
LODWORD(Point) = 374;
v40 = 1i64;
goto LABEL_164;
}
v36 = 2 * v13->u.KeyNode.NameLength;
if( (v13->u.KeyValue.NameLength & 0x20) == 0 )
v36 = v13->u.KeyNode.NameLength;
v33->u.KeyString[26] = v36;
HiveToCheck->BaseBlock->BootType |= 4u;
}
if( v33->u.KeyNode.MaxClassLen < v81 )
{
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 376;
v40 = 0i64;
goto LABEL_165;
}
LODWORD(Point) = 378;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)v93, 0) )
{
LODWORD(Point) = 380;
v40 = 0i64;
LABEL_164:
v18 = -1073741443;
LABEL_165:
SetFailureLocation(v6, v40, _CmpCheckKey, v18, Point);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
goto LABEL_349;
}
v33->u.KeyNode.MaxClassLen = v81;
HiveToCheck->BaseBlock->BootType |= 4u;
}
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v82);
if( (v13->u.KeyValue.NameLength & 0xE) == 0 )
{
v28 = v93;
LABEL_158:
v37 = CellIndex;
goto LABEL_159;
}
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 416;
goto LABEL_347;
}
LODWORD(Point) = 384;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
v37 = CellIndex;
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 400;
goto LABEL_347;
}
v28 = v93;
v13->u.KeyNode.Flags &= 0xFFF1u;
HiveToCheck->BaseBlock->BootType |= 4u;
}
LABEL_159:
v39 = v13->u.KeyNode.Security;
LODWORD(Index) = 0;
if( CmpFindSecurityCellCacheIndex((CMHIVE *)HiveToCheck, v39, &Index) )
break;
LODWORD(Point) = 496;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
LABEL_111:
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 304;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225804i64, Point);
v18 = -1073741492;
goto LABEL_349;
}
v86[0] = -1;
v86[1] = 0;
v83 = -1;
v84 = 0;
if( v28 == -1 )
{
LODWORD(Point) = 272;
LABEL_346:
v18 = -1073741492;
LABEL_347:
SetFailureLocation(v6, 0i64, _CmpCheckKey, v18, Point);
goto LABEL_349;
}
v29 = HiveToCheck->GetCellRoutine(HiveToCheck, v28, v86);
v30 = v29;
if( !v29 )
{
v18 = -1073741670;
LODWORD(Point) = 276;
goto LABEL_347;
}
v31 = HiveToCheck->GetCellRoutine(HiveToCheck, v29->u.KeyNode.Security, &v83);
if( !v31 )
{
LODWORD(Point) = 280;
v18 = -1073741670;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225626i64, Point);
goto LABEL_343;
}
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
LODWORD(Point) = 284;
goto LABEL_341;
}
if( !HvMarkCellDirty(HiveToCheck, (PVOID)v30->u.KeyNode.Security, 0) )
{
LODWORD(Point) = 288;
LABEL_341:
v18 = -1073741443;
SetFailureLocation(v6, 0i64, _CmpCheckKey, 3221225853i64, Point);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
LABEL_343:
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v86);
goto LABEL_349;
}
v13->u.KeyNode.Security = v30->u.KeyNode.Security;
++v31->u.KeyValue.Type;
HiveToCheck->BaseBlock->BootType |= 4u;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v86);
v28 = v93;
v17 = 1;
HiveLoadFailurea = 1;
}
v41 = *(_QWORD *)&HiveToCheck[1].Storage[0].FreeDisplay[1].Display.Buffer[4 * (unsigned int)Index + 2];
++*(_DWORD *)(v41 + 28);
v42 = v13->u.KeyNode.Flags;
if( (v42 & 0x40) != 0 )
{
if( (v42 & 0x1E) != 0 )
{
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 656;
goto LABEL_347;
}
v37 = CellIndex;
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 640;
goto LABEL_347;
}
v13->u.KeyNode.Flags &= 0xFFE1u;
HiveToCheck->BaseBlock->BootType |= 4u;
}
if( (v13->u.KeyNode.ValueList.Count & 0x80000000) == 0 )
{
LODWORD(Point) = 672;
goto LABEL_346;
}
}
else
{
if( !HIDWORD(Index) )
goto LABEL_189;
if( (*((_BYTE *)&v13->u.KeyNode + 13) & 3) == 1 )
{
LODWORD(Point) = 504;
goto LABEL_178;
}
v43 = Cella;
if( !HvIsCellAllocated(HiveToCheck, (unsigned int)Cella, Bitmap) )
{
LODWORD(Point) = 512;
goto LABEL_178;
}
v84 = 0;
GetCellRoutine = HiveToCheck->GetCellRoutine;
v83 = -1;
v45 = GetCellRoutine(HiveToCheck, v43, (_HV_GET_CELL_CONTEXT *)&v83);
if( !v45 )
{
v18 = -1073741670;
LODWORD(Point) = 528;
goto LABEL_347;
}
v46 = 4i64 * HIDWORD(Index);
if( v46 > 0xFFFFFFFF || (unsigned int)v46 > -4 - *(_DWORD *)&v45[-1].u.KeyString[38] )
{
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
LODWORD(Point) = 544;
LABEL_178:
v18 = -1073741492;
}
else
{
LODWORD(Bitmapa) = v10;
LODWORD(Point) = CellIndex;
v18 = CmpCheckValueList(
HiveToCheck,
(v13->u.KeyValue.NameLength & 0x10) != 0,
v45,
HIDWORD(Index),
Point,
Bitmapa,
&Bitmap->SizeOfBitMap,
(UINT *)v6,
(UINT64)&v80);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)&v83);
if( v18 == -2147483606 )
{
v17 = 1;
HiveLoadFailurea = 1;
LABEL_188:
v37 = CellIndex;
goto LABEL_189;
}
if( (v18 & 0x80000000) == 0 )
goto LABEL_188;
if( v18 != -1073741492 )
goto LABEL_349;
if( v6 )
v6->CheckKey.CellPoint = v45;
LODWORD(Point) = 560;
}
SetFailureLocation(v6, 1ui64, _CmpCheckKey, v18, Point);
while( 1 )
{
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 592;
goto LABEL_347;
}
v37 = CellIndex;
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 576;
goto LABEL_347;
}
v13->u.KeyNode.ValueList.List = -1;
v13->u.KeyNode.ValueList.Count = 0;
v17 = 1;
HiveLoadFailurea = 1;
HiveToCheck->BaseBlock->BootType |= 4u;
LABEL_189:
if( v13->u.KeyNode.ValueList.Count )
break;
if( v13->u.KeyNode.ValueList.List == -1 )
{
v80 = 0i64;
break;
}
LODWORD(Point) = 608;
v18 = -1073741492;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, 3221225804i64, Point);
}
if( v13->u.KeyNode.MaxValueNameLen < (unsigned int)v80 )
{
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 610;
goto LABEL_347;
}
v37 = CellIndex;
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 612;
goto LABEL_347;
}
v13->u.KeyNode.MaxValueNameLen = v80;
HiveToCheck->BaseBlock->BootType |= 4u;
}
v47 = v10 & 0x20000;
if( v13->u.KeyNode.MaxValueDataLen < HIDWORD(v80) )
{
v17 = 1;
v18 = -1073741492;
HiveLoadFailurea = 1;
if( v47 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 614;
goto LABEL_347;
}
v37 = CellIndex;
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 616;
goto LABEL_347;
}
v13->u.KeyNode.MaxValueDataLen = HIDWORD(v80);
HiveToCheck->BaseBlock->BootType |= 4u;
}
if( !v47 )
{
if( v13->u.KeyNode.MaxValueNameLen != (_DWORD)v80 && HvMarkCellDirty(HiveToCheck, (PVOID)v37, 0) )
v13->u.KeyNode.MaxValueNameLen = v80;
if( v13->u.KeyNode.MaxValueDataLen != HIDWORD(v80) && HvMarkCellDirty(HiveToCheck, (PVOID)v37, 0) )
v13->u.KeyNode.MaxValueDataLen = HIDWORD(v80);
}
}
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v88);
v48 = HiveToCheck->GetCellRoutine(HiveToCheck, v37, v88);
v13 = v48;
if( !v48 )
{
v18 = -1073741670;
LODWORD(Point) = 688;
goto LABEL_347;
}
if( v6 )
v6->CheckKey.CellPoint = v48;
if( (v37 & 0x80000000) != 0 )
{
if( v48->u.KeyNode.SubKeyCounts[0] )
{
LODWORD(Point) = 704;
goto LABEL_346;
}
LABEL_308:
v73 = -1;
goto LABEL_309;
}
if( !v48->u.KeyNode.SubKeyCounts[0] )
goto LABEL_308;
if( (*((_BYTE *)&v48->u.KeyNode + 13) & 3) == 1 )
{
v18 = -1073741492;
v49 = 712;
goto LABEL_314;
}
v50 = Bitmap;
if( !HvIsCellAllocated(HiveToCheck, v48->u.KeyNode.SubKeyLists[0], Bitmap) )
{
v18 = -1073741492;
v49 = 720;
goto LABEL_314;
}
v51 = HiveToCheck->GetCellRoutine(HiveToCheck, v13->u.KeyNode.SubKeyLists[0], v79);
v78 = v51;
v52 = (_CM_KEY_INDEX *)v51;
if( !v51 )
{
v18 = -1073741670;
LODWORD(Point) = 736;
goto LABEL_354;
}
v53 = -4 - *(_DWORD *)&v51[-1].u.KeyString[38];
if( v53 < 8 )
goto LABEL_312;
Signature = v51->u.KeyNode.Signature;
v55 = v51->u.KeyNode.Flags;
v56 = ((v51->u.KeyNode.Signature - 26220) & 0xFDFF) == 0;
v57 = 8;
if( !v56 )
v57 = 4;
if( (unsigned __int64)(unsigned int)(v55 * v57) + 4 < 4 )
goto LABEL_312;
v58 = 8;
if( ((Signature - 26220) & 0xFDFF) != 0 )
v58 = 4;
if( (unsigned __int64)(unsigned int)(v55 * v58) + 4 > v53 )
{
LABEL_312:
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v49 = 752;
goto LABEL_313;
}
if( !(_WORD)v55 )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v49 = 784;
goto LABEL_313;
}
if( v6 )
{
v6->CheckKey.RootPoint = v52;
Signature = v52->Signature;
}
if( Signature != 26988 && Signature != 26220 && Signature != 26732 && Signature != 26994 )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v49 = 992;
goto LABEL_313;
}
Count = v52->Count;
if( Signature != 26994 )
{
if( Count != v13->u.KeyNode.SubKeyCounts[0] )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v49 = 816;
goto LABEL_313;
}
HIDWORD(Point) = HIDWORD(v6);
v60 = CmpCheckLeaf(HiveToCheck, v10, v52, v13->u.KeyNode.SubKeyLists[0]);
v18 = v60;
if( v60 == -2147483606 )
{
v17 = 1;
}
else if( v60 < 0 )
{
if( v60 == -1073741492 )
{
v49 = 832;
goto LABEL_314;
}
goto LABEL_349;
}
goto LABEL_307;
}
v61 = 0;
v62 = 0;
if( !(_WORD)Count )
{
LABEL_304:
if( v13->u.KeyNode.SubKeyCounts[0] != v61 )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v10 = v91;
v49 = 960;
goto LABEL_313;
}
v17 = HiveLoadFailurea;
v10 = v91;
LABEL_307:
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v78 = 0i64;
goto LABEL_308;
}
while( 2 )
{
if( v6 )
v6->CheckKey.Index = v62;
v63 = (char *)v52 + 4 * v62;
if( !HvIsCellAllocated(HiveToCheck, *((unsigned int *)v63 + 1), v50) )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v10 = v91;
v49 = 848;
goto LABEL_313;
}
v64 = HiveToCheck->GetCellRoutine(HiveToCheck, *((unsigned int *)v63 + 1), v85);
v65 = (_CM_KEY_INDEX *)v64;
if( !v64 )
{
v18 = -1073741670;
LODWORD(Point) = 864;
goto LABEL_347;
}
v66 = -4 - *(_DWORD *)&v64[-1].u.KeyString[38];
if( v66 < 8 )
goto LABEL_301;
v67 = v64->u.KeyNode.Signature;
v68 = v64->u.KeyNode.Flags;
v69 = v64->u.KeyNode.Signature - 26220;
v70 = 8;
if( (v69 & 0xFDFF) != 0 )
v70 = 4;
if( (unsigned __int64)(unsigned int)(v68 * v70) + 4 < 4 )
goto LABEL_301;
v71 = 8;
if( ((v67 - 26220) & 0xFDFF) != 0 )
v71 = 4;
if( (unsigned __int64)(unsigned int)(v68 * v71) + 4 > v66 )
{
LABEL_301:
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v10 = v91;
v49 = 880;
goto LABEL_313;
}
if( !(_WORD)v68 )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v10 = v91;
v49 = 912;
goto LABEL_313;
}
if( ((v67 - 26220) & 0xFCFF) != 0 || v67 == 26476 )
{
v18 = -1073741492;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v10 = v91;
v49 = 944;
goto LABEL_313;
}
HIDWORD(Point) = HIDWORD(v6);
v72 = CmpCheckLeaf(HiveToCheck, v91, v65, *((unsigned int *)v63 + 1));
v18 = v72;
if( v72 == -2147483606 )
{
HiveLoadFailurea = 1;
LABEL_295:
v61 += v65->Count;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
v52 = (_CM_KEY_INDEX *)v78;
if( ++v62 >= v78->u.KeyNode.Flags )
goto LABEL_304;
v50 = Bitmap;
continue;
}
break;
}
if( v72 >= 0 )
goto LABEL_295;
if( v72 != -1073741492 )
goto LABEL_349;
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v85);
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
v10 = v91;
v49 = 952;
LABEL_313:
v78 = 0i64;
LABEL_314:
LODWORD(Point) = v49;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, v18, Point);
if( (v10 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 1040;
goto LABEL_347;
}
LODWORD(Point) = 1008;
SetFailureLocation(v6, 1ui64, _CmpCheckKey, v18, Point);
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 1024;
goto LABEL_347;
}
v13->u.KeyNode.SubKeyCounts[0] = 0;
v73 = -1;
v13->u.KeyNode.SubKeyLists[0] = -1;
v17 = 1;
HiveToCheck->BaseBlock->BootType |= 4u;
LABEL_309:
v74 = v13->u.KeyNode.SubKeyLists[1] != -1 || v13->u.KeyNode.SubKeyCounts[1];
if( (v10 & 0x40000) != 0 && v74 )
{
LODWORD(Point) = 1040;
goto LABEL_346;
}
v75 = (v10 & 2) != 0;
if( (v10 & 0xD) != 0 && v74 )
v75 = 1;
if( (v10 & 8) != 0 && HiveToCheck->Version < 4 || v75 )
{
if( !HvMarkCellDirty(HiveToCheck, (PVOID)CellIndex, 0) )
{
v18 = -1073741443;
LODWORD(Point) = 1056;
goto LABEL_347;
}
v13->u.KeyNode.SubKeyCounts[1] = 0;
if( (v10 & 4) != 0 && HiveToCheck->Version >= 4 )
v73 = -1163005939;
v13->u.KeyNode.SubKeyLists[1] = v73;
}
v18 = v17 != 0 ? 0x8000002A : 0;
LABEL_349:
if( v78 )
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v79);
LABEL_356:
if( v13 )
HiveToCheck->ReleaseCellRoutine(HiveToCheck, (_HV_GET_CELL_CONTEXT *)v88);
return v18;
}Referenced by:
CmpCheckRegistry2