MiUpdateCfgSystemWideBitmapWorker
NTSTATUS __stdcall MiUpdateCfgSystemWideBitmapWorker(
_SECTION *Section,
VOID *ControlFlowContext,
UINT64 StartBit,
UINT64 NumberOfBits,
_MI_RVA_LIST_TYPE ListType){
NTSTATUS v5;
INT64 v8;
UINT64 v9;
NTSTATUS result;
size_t v11;
unsigned __int64 v12;
_CONTROL_AREA *v13;
_SUBSECTION *PagefileSubsection;
UINT64 v15;
_DWORD *v16;
__int64 v17;
unsigned int v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int8 *v21;
__int64 v22;
__int64 v23;
int v24;
unsigned int v25;
unsigned int v26;
int v27;
__int64 v28;
__int64 v29;
int v30;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
unsigned int *v32;
unsigned int v33;
_RTL_BITMAP_EX ViewSize;
UINT64 QuotaCharge;
VOID *MappedBase;
_DWORD *v37;
UINT64 v38;
__int64 BugCheckParameter3;
unsigned int v40;
v5 = 0;
v37 = ControlFlowContext;
MappedBase = 0i64;
v33 = 0;
BugCheckParameter3 = 0i64;
v40 = 0;
v8 = 0i64;
if( ControlFlowContext )
v8 = *((_QWORD *)ControlFlowContext + 2);
v9 = StartBit >> 3;
v38 = StartBit >> 3;
ViewSize.SizeOfBitMap = NumberOfBits >> 3;
QuotaCharge = (NumberOfBits >> 15) + ((((StartBit >> 3) & 0xFFF) + 4095 + ((NumberOfBits >> 3) & 0xFFF)) >> 12);
MiMapViewInSystemSpace(Section, &Session, &MappedBase, &ViewSize.SizeOfBitMap);
if( result >= 0 )
{
v11 = LODWORD(ViewSize.SizeOfBitMap) - (unsigned __int16)v9;
v12 = (unsigned __int64)MappedBase | (unsigned __int16)v9;
v13 = MiSectionControlArea(Section);
ViewSize.SizeOfBitMap = v9 >> 12;
PagefileSubsection = MiLocatePagefileSubsection((_SUBSECTION *)&v13[1], &ViewSize.SizeOfBitMap);
v15 = QuotaCharge;
if( MiChargeSegmentCommit(
(VOID **)&PagefileSubsection->ControlArea,
&PagefileSubsection->SubsectionBase[ViewSize.SizeOfBitMap],
QuotaCharge,
(UINT64)PagefileSubsection) )
{
v16 = v37;
if( v37 && (*v37 & 1) != 0 && v8 )
{
ViewSize.Buffer = (unsigned __int64 *)v12;
ViewSize.SizeOfBitMap = NumberOfBits;
RtlClearAllBitsEx(&ViewSize);
v18 = RtlEnumRvaListFirst(v8, (unsigned int *)&BugCheckParameter3, &v33);
if( v18 )
{
v17 = v33;
do
{
if( (v17 & 1) != 0 )
{
v19 = (unsigned __int64)v18 >> 4;
if( (v18 & 0xF) == v16[1] )
{
v20 = 2 * v19;
if( (v17 & 4) != 0 )
++v20;
_bittestandset64((signed __int64 *)v12, v20);
}
else
{
RtlSetBitsEx(&ViewSize, 2 * v19, 2ui64);
}
}
++HIDWORD(BugCheckParameter3);
v21 = (unsigned __int8 *)(v40 + *(_QWORD *)(v8 + 16));
v18 = BugCheckParameter3;
v22 = *(_QWORD *)(v8 + 24) - v40;
if( !v22 )
break;
while( 1 )
{
--v22;
v23 = *v21 >> 6;
v24 = *v21++ & 0x3F;
v18 += v24 * *((_DWORD *)RtlpRvaCompressionTableScales + v23);
if( (_DWORD)v23 == 3 )
break;
if( !v22 )
KeBugCheckEx(0x1Au, (PVOID)0x43666720, (PVOID)v8, &BugCheckParameter3, (PVOID)v18);
}
LODWORD(BugCheckParameter3) = v18;
v17 = 0i64;
v40 = (_DWORD)v21 - *(_DWORD *)(v8 + 16);
v25 = *(_DWORD *)(v8 + 8);
if( v25 <= 1 )
{
if( v25 == 1 )
{
v32 = *(unsigned int **)(v8 + 48);
if( v32 )
v17 = *v32;
else
v17 = 1i64;
}
}
else
{
v26 = 0;
v27 = 1;
v28 = 0i64;
do
{
if( _bittest64(*(const signed __int64 **)(v8 + 40), HIDWORD(BugCheckParameter3) * v25 + v26) )
{
v29 = *(_QWORD *)(v8 + 48);
if( v29 )
v30 = *(_DWORD *)(v28 + v29);
else
v30 = v27;
v17 = v30 | (unsigned int)v17;
}
++v26;
v27 = __ROL4__(v27, 1);
v28 += 4i64;
}
while( v26 < v25 );
v16 = v37;
}
}
while( v18 );
v15 = QuotaCharge;
}
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, (VOID *)v17);
MiEliminateZeroPages(AnyMultiplexedVm, (VOID *)(v12 & 0xFFFFFFFFFFFFF000ui64), v15 << 12);
}
else
{
memset((VOID *)v12, 255i64, v11);
}
}
else
{
v5 = -1073741523;
}
MmUnmapViewInSystemSpace(MappedBase);
return v5;
}
return result;
}Referenced by:
MiUpdateCfgSystemWideBitmap