CmpCheckValueList
INT64 __fastcall CmpCheckValueList(
_HHIVE *Hive,
INT64 SymLink,
_CELL_DATA *List,
UINT64 Count,
UINT64 KeyCell,
_RTL_BITMAP *Bitmap,
UINT *MaxValueNameLen,
UINT *MaxValueDataLen,
UINT64 CheckFlags){
unsigned int v9;
char v10;
_RTL_BITMAP *v11;
UINT v13;
unsigned __int64 v14;
UINT8 *v15;
bool v16;
__int64 v17;
unsigned int Length;
_HMAP_ENTRY *v19;
_CELL_DATA *v20;
int *v21;
int v22;
int v23;
unsigned int v24;
unsigned int v25;
__int64 v26;
bool v27;
_CELL_DATA *v28;
_CELL_DATA *v29;
unsigned int v30;
int Flags;
unsigned __int16 v32;
unsigned int v33;
unsigned __int16 v34;
unsigned int LowPart;
UINT Data;
_CELL_DATA *v37;
UINT64 v38;
_CELL_DATA *v39;
__int64 v40;
__int64 v41;
__int64 v42;
__int64 v43;
_CELL_DATA *v44;
__int64 v45;
unsigned int v46;
char v47;
unsigned int v48;
_CELL_DATA *v49;
INT64 v50;
__int64 v51;
int v52;
INT64 v54;
INT64 v55;
UINT v56;
char v57;
int v58[2];
char v59;
UINT8 *v60;
int v61[2];
_CELL_DATA *v62;
int v63[2];
unsigned int v64;
int v65[2];
_RTL_BITMAP *BitMap;
int v67[2];
ULONG_PTR BugCheckParameter3;
_CELL_DATA *v69;
_DWORD *v70;
unsigned int *v71;
_QWORD v72[3];
unsigned int *v73;
v9 = Count;
LODWORD(BugCheckParameter3) = KeyCell;
v10 = SymLink;
v64 = Count;
v11 = (_RTL_BITMAP *)MaxValueNameLen;
v13 = 0;
v58[1] = 0;
v59 = SymLink;
v69 = List;
BitMap = (_RTL_BITMAP *)MaxValueNameLen;
v70 = (_DWORD *)CheckFlags;
v71 = v73;
v56 = 0;
v58[0] = -1;
v61[0] = -1;
v61[1] = 0;
v67[0] = -1;
v67[1] = 0;
v65[0] = -1;
v65[1] = 0;
v63[0] = -1;
v63[1] = 0;
v57 = 0;
strcpy((char *)v72, "SymbolicLinkValue");
if( MaxValueDataLen )
{
*((_QWORD *)MaxValueDataLen + 34) = List;
MaxValueDataLen[70] = -1;
MaxValueDataLen[71] = 0;
*((_QWORD *)MaxValueDataLen + 36) = 0i64;
}
*(_DWORD *)CheckFlags = 0;
*v73 = 0;
if( !v9 )
return 0;
while( 1 )
{
v14 = List->u.KeyList[v13];
v15 = (UINT8 *)List + 4 * v13;
v60 = v15;
if( v10 && v9 != 1 )
{
v33 = -1073741492;
LODWORD(v54) = 64;
goto LABEL_141;
}
if( (_DWORD)v14 == -1 )
{
LODWORD(v54) = 80;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[71] = -1;
goto LABEL_130;
}
goto LABEL_131;
}
v62 = 0i64;
v16 = (*((_BYTE *)Hive + 140) & 1) == 0;
LODWORD(v62) = -1;
if( v16 )
{
v17 = (unsigned int)v14 >> 31;
Length = Hive->Storage[v17].Length;
if( (v14 & 0x7FFFFFFF) >= Length || (v14 & 7) != 0 )
goto LABEL_27;
if( v11 && (v14 & 0x80000000) == 0i64 )
{
if( !_bittest64((const signed __int64 *)v11->Buffer, (unsigned int)v14 >> 3) )
goto LABEL_27;
RtlClearBits(v11, (unsigned int)v14 >> 3, 1ui64);
Length = Hive->Storage[v17].Length;
}
if( (unsigned int)v14 + (v14 & 0x80000000) >= Length )
goto LABEL_27;
v19 = &Hive->Storage[v17].Map->Directory[(v14 >> 21) & 0x3FF]->Table[(v14 >> 12) & 0x1FF];
if( !v19 || (v19->PermanentBinAddress & 2) != 0 )
goto LABEL_27;
v20 = Hive->GetCellRoutine(Hive, (unsigned int)v14, &v62);
if( v20 )
{
v21 = (int *)&v20[-1].u.KeyString[38];
if( v21 )
{
v22 = (int)v21;
v23 = *v21;
v24 = v22 - (v19->PermanentBinAddress & 0xFFFFFFF0);
v25 = -v23;
v27 = 0;
if( v23 < 0 && v25 - 8 <= 0xFFFF8 )
{
v26 = *(unsigned int *)((v19->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64) + 8);
if( v25 <= (unsigned __int64)(v26 - 32) && v24 - v23 <= (unsigned int)v26 && v24 >= 0x20 )
v27 = 1;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)&v62);
if( !v27 )
{
LABEL_27:
LODWORD(v54) = 96;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[71] = v14;
LABEL_130:
MaxValueDataLen[70] = v13;
goto LABEL_131;
}
goto LABEL_131;
}
}
}
}
v28 = Hive->GetCellRoutine(Hive, (unsigned int)v14, v58);
v29 = v28;
if( !v28 )
{
v33 = -1073741670;
LODWORD(v54) = 112;
LABEL_141:
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, v33, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v13;
MaxValueDataLen[71] = v14;
}
return v33;
}
v30 = -4 - *(_DWORD *)&v28[-1].u.KeyString[38];
if( v30 < 0x14 )
{
LODWORD(v54) = 128;
goto LABEL_124;
}
if( v28->u.KeyNode.Signature != 27510 )
{
LODWORD(v54) = 136;
goto LABEL_124;
}
Flags = v28->u.KeyNode.Flags;
if( Flags + 20 > v30 )
{
LODWORD(v54) = 144;
goto LABEL_124;
}
v32 = v28->u.KeyValue.Flags;
if( (v32 & 1) != 0 )
{
if( (unsigned __int16)Flags > 0x3FFFu )
{
LODWORD(v54) = 146;
goto LABEL_124;
}
}
else
{
if( (Flags & 1) != 0 )
{
LODWORD(v54) = 148;
goto LABEL_124;
}
if( (unsigned __int16)Flags > 0x7FFFu )
{
LODWORD(v54) = 150;
goto LABEL_124;
}
}
if( (Hive->BaseBlock->Flags & 2) == 0 && (v32 & 2) != 0 )
{
v57 = 1;
v33 = -1073741492;
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v13;
MaxValueDataLen[71] = v14;
*((_QWORD *)MaxValueDataLen + 36) = v28;
}
if( ((unsigned int)Bitmap & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (CmpBootType & 6) == 0 )
{
LODWORD(v54) = 156;
v50 = 0i64;
LABEL_145:
SetFailureLocation((INT64)MaxValueDataLen, v50, 15i64, v33, v54);
LABEL_146:
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
return v33;
}
LODWORD(v54) = 152;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
if( !HvpMarkCellDirty((UINT64)Hive, (unsigned int)v14, 0) )
{
v33 = -1073741443;
LODWORD(v54) = 154;
v50 = 1i64;
goto LABEL_145;
}
v10 = v59;
v29->u.KeyValue.Flags &= ~2u;
Hive->BaseBlock->BootType |= 4u;
}
if( v10 )
{
if( *(_QWORD *)&v29->u.KeyString[10] != v72[0]
|| *(_QWORD *)&v29->u.KeyString[14] != v72[1]
|| LOBYTE(v29->u.KeyString[18]) != LOBYTE(v72[2]) )
{
LODWORD(v54) = 160;
goto LABEL_149;
}
if( v29->u.KeyValue.Type != 6 && (v29->u.KeyString[8] & 2) == 0 )
{
LODWORD(v54) = 176;
goto LABEL_149;
}
}
v34 = 2 * v29->u.KeyNode.Flags;
if( (v29->u.KeyString[8] & 1) == 0 )
v34 = v29->u.KeyNode.Flags;
if( *v70 < (unsigned int)v34 )
*v70 = v34;
LowPart = v29->u.KeyNode.LastWriteTime.LowPart;
if( v10 )
{
if( (LowPart & 1) != 0 )
{
LODWORD(v54) = 192;
}
else
{
if( LowPart <= 0xFFFF )
goto LABEL_60;
LODWORD(v54) = 208;
}
LABEL_149:
v33 = -1073741492;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225804i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v13;
MaxValueDataLen[71] = v14;
*((_QWORD *)MaxValueDataLen + 36) = v29;
}
goto LABEL_146;
}
LABEL_60:
if( (v29->u.KeyString[8] & 2) != 0 )
{
if( LowPart || v29->u.KeyValue.Type )
{
LODWORD(v54) = 224;
goto LABEL_124;
}
}
else if( LowPart >= 0x80000000 )
{
if( LowPart + 0x80000000 <= 4 )
goto LABEL_113;
LODWORD(v54) = 416;
LABEL_124:
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
goto LABEL_125;
}
Data = v29->u.KeyValue.Data;
v37 = 0i64;
if( LowPart )
{
if( !(unsigned __int8)HvIsCellAllocated(Hive, Data, BitMap) )
{
LODWORD(v54) = 240;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
v13 = v56;
LABEL_125:
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v13;
MaxValueDataLen[71] = v14;
*((_QWORD *)MaxValueDataLen + 36) = v29;
}
goto LABEL_127;
}
v37 = Hive->GetCellRoutine(Hive, Data, v61);
if( !v37 )
{
LODWORD(v54) = 256;
v33 = -1073741670;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225626i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v56;
MaxValueDataLen[71] = Data;
}
goto LABEL_146;
}
}
else if( Data != -1 )
{
LODWORD(v54) = 224;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
v13 = v56;
goto LABEL_125;
}
if( Hive->Version < 4 || LowPart <= 0x3FD8 )
{
if( !LowPart || LowPart <= -4 - *(_DWORD *)&v37[-1].u.KeyString[38] )
goto LABEL_87;
LODWORD(v54) = 400;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
v13 = v56;
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v56;
MaxValueDataLen[71] = v14;
*((_QWORD *)MaxValueDataLen + 36) = v29;
}
LABEL_104:
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
LABEL_127:
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
v15 = v60;
goto LABEL_131;
}
if( (unsigned int)(-4 - *(_DWORD *)&v37[-1].u.KeyString[38]) < 8
|| v37->u.KeyNode.Signature != 25188
|| !v37->u.KeyNode.Flags
|| (v38 = v37->u.KeyNode.LastWriteTime.LowPart, (_DWORD)v38 == -1) )
{
LODWORD(v54) = 272;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v56;
MaxValueDataLen[71] = Data;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
v13 = v56;
v15 = v60;
goto LABEL_131;
}
if( !(unsigned __int8)HvIsCellAllocated(Hive, v38, BitMap) )
{
LODWORD(v54) = 288;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
v13 = v56;
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v56;
MaxValueDataLen[71] = v37->u.KeyNode.LastWriteTime.LowPart;
*((_QWORD *)MaxValueDataLen + 36) = v37;
}
goto LABEL_104;
}
v39 = Hive->GetCellRoutine(Hive, v37->u.KeyNode.LastWriteTime.LowPart, v63);
v62 = v39;
v40 = (__int64)v39;
if( !v39 )
{
LODWORD(v54) = 304;
v33 = -1073741670;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225626i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v56;
MaxValueDataLen[71] = v37->u.KeyNode.LastWriteTime.LowPart;
}
LABEL_160:
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
goto LABEL_146;
}
v41 = v37->u.KeyNode.Flags;
if( (unsigned __int64)(4 * v41) < 4
|| 4 * v41 > (unsigned __int64)(unsigned int)(-4 - *(_DWORD *)&v39[-1].u.KeyString[38]) )
{
LODWORD(v54) = 320;
goto LABEL_99;
}
if( (_DWORD)v41 != (LowPart + 16343) / 0x3FD8 )
{
LODWORD(v54) = 336;
LABEL_99:
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
v13 = v56;
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v56;
MaxValueDataLen[71] = v14;
*((_QWORD *)MaxValueDataLen + 36) = v29;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
goto LABEL_104;
}
v42 = 0i64;
if( !(_DWORD)v41 )
{
LABEL_86:
((void(__fastcall *)(_HHIVE *, int *, __int64, __int64))Hive->ReleaseCellRoutine)(Hive, v63, v41, v40);
LABEL_87:
if( v37 )
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
LowPart = v29->u.KeyNode.LastWriteTime.LowPart;
v13 = v56;
LABEL_113:
v46 = LowPart + 0x80000000;
if( LowPart < 0x80000000 )
v46 = LowPart;
if( *v71 < v46 )
*v71 = v46;
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
v47 = v57;
++v13;
v9 = v64;
v56 = v13;
goto LABEL_138;
}
while( (unsigned __int8)HvIsCellAllocated(Hive, *(unsigned int *)(v40 + 4 * v42), BitMap) )
{
v43 = (__int64)v62;
v44 = Hive->GetCellRoutine(Hive, v62->u.KeyList[v42], v65);
if( !v44 )
{
LODWORD(v54) = 368;
v33 = -1073741670;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225626i64, v54);
if( MaxValueDataLen )
{
v51 = (__int64)v62;
MaxValueDataLen[70] = v42;
MaxValueDataLen[71] = *(_DWORD *)(v51 + 4 * v42);
*((_QWORD *)MaxValueDataLen + 36) = v37;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
goto LABEL_160;
}
if( (unsigned int)(-4 - *(_DWORD *)&v44[-1].u.KeyString[38]) < 0x3FD8 )
{
LODWORD(v54) = 384;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
if( MaxValueDataLen )
{
MaxValueDataLen[70] = v42;
MaxValueDataLen[71] = *(_DWORD *)(v43 + 4 * v42);
*((_QWORD *)MaxValueDataLen + 36) = v37;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v65);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
v13 = v56;
v15 = v60;
goto LABEL_131;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v65);
v42 = (unsigned int)(v42 + 1);
v40 = v43;
if( (unsigned int)v42 >= v37->u.KeyNode.Flags )
goto LABEL_86;
}
LODWORD(v54) = 352;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v54);
if( MaxValueDataLen )
{
v45 = (__int64)v62;
MaxValueDataLen[70] = v42;
MaxValueDataLen[71] = *(_DWORD *)(v45 + 4 * v42);
*((_QWORD *)MaxValueDataLen + 36) = v37;
}
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v63);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v61);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v58);
v13 = v56;
v15 = v60;
LABEL_131:
if( ((unsigned int)Bitmap & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (CmpBootType & 6) == 0 )
{
LODWORD(v55) = 48;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225804i64, v55);
return(unsigned int)-1073741492;
}
LODWORD(v55) = 0;
SetFailureLocation((INT64)MaxValueDataLen, 1i64, 15i64, 3221225804i64, v55);
v48 = BugCheckParameter3;
v49 = Hive->GetCellRoutine(Hive, (unsigned int)BugCheckParameter3, v67);
if( !v49 )
{
LODWORD(v54) = 16;
v33 = -1073741670;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225626i64, v54);
return v33;
}
if( !HvpMarkCellDirty((UINT64)Hive, v48, 0) )
break;
if( !HvpMarkCellDirty((UINT64)Hive, v49->u.KeyNode.ValueList.List, 0) )
{
v52 = 40;
goto LABEL_166;
}
--v49->u.KeyNode.ValueList.Count;
v9 = --v64;
memmove(v15, (UINT8 *)&v69->u.KeyIndex.List[v13], 4i64 * (v64 - v13));
Hive->BaseBlock->BootType |= 4u;
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v67);
v47 = 1;
v57 = 1;
LABEL_138:
if( v13 >= v9 )
{
if( v47 )
return(unsigned int)-2147483606;
return 0;
}
v11 = BitMap;
v10 = v59;
List = v69;
}
v52 = 24;
LABEL_166:
LODWORD(v54) = v52;
v33 = -1073741443;
SetFailureLocation((INT64)MaxValueDataLen, 0i64, 15i64, 3221225853i64, v54);
Hive->ReleaseCellRoutine(Hive, (_HV_GET_CELL_CONTEXT *)v67);
return v33;
}Referenced by:
CmpCheckKey