MiUpdateCfgSystemWideBitmapWorker
INT64 __fastcall MiUpdateCfgSystemWideBitmapWorker(INT64 a1, _DWORD *a2, UINT64 a3, UINT64 a4){
unsigned int v4;
ULONG_PTR v7;
UINT64 v8;
INT64 result;
unsigned __int64 v10;
_CONTROL_AREA *v11;
__int64 *PagefileSubsection;
__int64 v13;
_DWORD *v14;
unsigned int v15;
int v16;
unsigned __int64 v17;
unsigned __int64 v18;
unsigned __int8 *v19;
__int64 v20;
__int64 v21;
int v22;
unsigned int v23;
unsigned int v24;
int v25;
__int64 v26;
__int64 v27;
int v28;
CHAR *AnyMultiplexedVm;
int *v30;
int a3a;
_RTL_BITMAP_EX ViewSize;
__int64 v33;
PVOID MappedBase;
_DWORD *v35;
_LARGE_INTEGER SectionOffset;
ULONG_PTR BugCheckParameter3;
unsigned int v38;
v4 = 0;
v35 = a2;
MappedBase = 0i64;
a3a = 0;
BugCheckParameter3 = 0i64;
v38 = 0;
v7 = 0i64;
if( a2 )
v7 = *((_QWORD *)a2 + 2);
v8 = a3 >> 3;
SectionOffset.QuadPart = a3 >> 3;
ViewSize.SizeOfBitMap = a4 >> 3;
v33 = (a4 >> 15) + ((((a3 >> 3) & 0xFFF) + 4095 + ((a4 >> 3) & 0xFFF)) >> 12);
result = MiMapViewInSystemSpace((VOID *)a1, &Session, &MappedBase, &ViewSize.SizeOfBitMap, &SectionOffset, 0i64);
if( (int)result >= 0 )
{
v10 = (unsigned __int64)MappedBase | (unsigned __int16)v8;
v11 = MiSectionControlArea((_SECTION *)a1);
ViewSize.SizeOfBitMap = v8 >> 12;
PagefileSubsection = (__int64 *)MiLocatePagefileSubsection((unsigned int *)v11 + 32, &ViewSize.SizeOfBitMap);
v13 = v33;
if( (unsigned int)MiChargeSegmentCommit(
PagefileSubsection,
(__int64 *)(PagefileSubsection[1] + 8 * ViewSize.SizeOfBitMap),
v33) )
{
v14 = v35;
if( v35 && (*v35 & 1) != 0 && v7 )
{
ViewSize.Buffer = (unsigned __int64 *)v10;
ViewSize.SizeOfBitMap = a4;
RtlClearAllBitsEx(&ViewSize);
v15 = RtlEnumRvaListFirst(v7, &BugCheckParameter3, &a3a);
if( v15 )
{
LOBYTE(v16) = a3a;
do
{
if( (v16 & 1) != 0 )
{
v17 = (unsigned __int64)v15 >> 4;
if( (v15 & 0xF) == v14[1] )
{
v18 = 2 * v17;
if( (v16 & 4) != 0 )
++v18;
_bittestandset64((signed __int64 *)v10, v18);
}
else
{
RtlSetBitsEx((INT64)&ViewSize, 2 * v17, 2ui64);
}
}
++HIDWORD(BugCheckParameter3);
v19 = (unsigned __int8 *)(v38 + *(_QWORD *)(v7 + 16));
v15 = BugCheckParameter3;
v20 = *(_QWORD *)(v7 + 24) - v38;
if( !v20 )
break;
while( 1 )
{
--v20;
v21 = *v19 >> 6;
v22 = *v19++ & 0x3F;
v15 += v22 * *((_DWORD *)RtlpRvaCompressionTableScales + v21);
if( (_DWORD)v21 == 3 )
break;
if( !v20 )
KeBugCheckEx(0x1Au, 0x43666720ui64, v7, (ULONG_PTR)&BugCheckParameter3, v15);
}
LODWORD(BugCheckParameter3) = v15;
LOBYTE(v16) = 0;
v38 = (_DWORD)v19 - *(_DWORD *)(v7 + 16);
v23 = *(_DWORD *)(v7 + 8);
if( v23 <= 1 )
{
if( v23 == 1 )
{
v30 = *(int **)(v7 + 48);
if( v30 )
v16 = *v30;
else
LOBYTE(v16) = 1;
}
}
else
{
v24 = 0;
v25 = 1;
v26 = 0i64;
do
{
if( _bittest64(*(const signed __int64 **)(v7 + 40), HIDWORD(BugCheckParameter3) * v23 + v24) )
{
v27 = *(_QWORD *)(v7 + 48);
if( v27 )
v28 = *(_DWORD *)(v26 + v27);
else
LOBYTE(v28) = v25;
LOBYTE(v16) = v28 | v16;
}
++v24;
v25 = __ROL4__(v25, 1);
v26 += 4i64;
}
while( v24 < v23 );
v14 = v35;
}
}
while( v15 );
v13 = v33;
}
AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
MiEliminateZeroPages((INT64)AnyMultiplexedVm, v10 & 0xFFFFFFFFFFFFF000ui64, v13 << 12);
}
else
{
memset(v10, 255i64);
}
}
else
{
v4 = -1073741523;
}
MmUnmapViewInSystemSpace(MappedBase);
return v4;
}
return result;
}Referenced by:
MiUpdateCfgSystemWideBitmap