MiMarkSharedImageCfgBits
__int64 __fastcall MiMarkSharedImageCfgBits(__int64 a1, __int64 a2, __int64 a3){
_QWORD *v3;
LARGE_INTEGER **v4;
_EPROCESS *v5;
__int64 v6;
__int64 v7;
__int64 v8;
unsigned __int64 v9;
unsigned __int64 v10;
volatile signed __int64 *v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
int IsCfgBitMapPageShared;
void *v20;
int v21;
INT64 v23;
unsigned int v24;
UINT64 Src;
INT64 v26;
UINT64 v27;
UINT AnyPageLocked;
UINT CapturedOldProtect;
_EPROCESS *v30;
UINT64 v31;
_QWORD *v32;
UINT64 v33[2];
int v34;
AnyPageLocked = 0;
v3 = (_QWORD *)a1;
CapturedOldProtect = 0;
v32 = (_QWORD *)a1;
v4 = *(LARGE_INTEGER ***)(a3 + 72);
v5 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
v30 = v5;
LODWORD(v6) = MiGetControlAreaLoadConfig(*v4);
v8 = v3[2];
v9 = (unsigned __int64)*(unsigned __int8 *)(v7 + 33) << 32;
v10 = (unsigned __int64)*(unsigned __int8 *)(v7 + 32) << 32;
v31 = *(_QWORD *)(v6 + 16);
v11 = (volatile signed __int64 *)(v8 + 40);
v12 = (*(unsigned int *)(v7 + 24) | v10) << 12;
v13 = 2 * (((((*(unsigned int *)(v7 + 28) | v9) + 1) << 12) - v12) >> 4);
v14 = *v3 + ((2 * (v12 >> 4)) >> 3);
v15 = v13 >> 3;
ExAcquirePushLockExclusiveEx(v8 + 40, 0i64);
if( (unsigned int)MiVadDeleted(v8) )
{
if( (_InterlockedExchangeAdd64(v11, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v8 + 40));
KeAbPostRelease((PVOID)(v8 + 40));
return 3221225738i64;
}
v16 = v15 + v14;
v34 = 0;
v17 = (v15 + v14 - 1) | 0xFFF;
v18 = v14 & 0xFFFFFFFFFFFFF000ui64;
*(_OWORD *)v33 = 0i64;
while( v18 <= v17 )
{
IsCfgBitMapPageShared = MiIsCfgBitMapPageShared(v18, v8);
if( IsCfgBitMapPageShared == 2 )
{
v20 = (void *)(v18 | 0xFFF);
goto LABEL_6;
}
if( IsCfgBitMapPageShared != 1 )
{
if( IsCfgBitMapPageShared == 3 )
{
v20 = (void *)v17;
if( (v18 | 0x1FFFFF) <= v17 )
v20 = (void *)(v18 | 0x1FFFFF);
LABEL_6:
LODWORD(v26) = 0;
LODWORD(Src) = 2;
v21 = MiSetProtectionOnSection(
v5,
(_MMVAD *)v8,
(void *)v18,
v20,
Src,
v26,
&CapturedOldProtect,
&AnyPageLocked);
if( v21 < 0 )
goto LABEL_11;
v18 = (unsigned __int64)v20 - 4095;
v3 = v32;
}
else
{
if( v18 < v14 )
v23 = (unsigned int)(v14 - v18);
else
v23 = 0i64;
if( v18 + 4096 <= v16 )
{
v24 = 4096 - v23;
}
else
{
v24 = v16 - v18 - v23;
if( (_DWORD)v16 - (_DWORD)v18 == (_DWORD)v23 )
break;
}
LODWORD(v27) = (unsigned int)(v23 + v18 - v14) >> 1 << 7;
v21 = MiCopyToCfgBitMap((INT64)v3, v31, v23, 0i64, v18 + (unsigned int)v23, v8, v27, v33, v24);
if( v21 < 0 )
goto LABEL_11;
}
v5 = v30;
}
v18 += 4096i64;
}
v21 = 0;
LABEL_11:
if( (_InterlockedExchangeAdd64(v11, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v8 + 40));
KeAbPostRelease((PVOID)(v8 + 40));
return(unsigned int)v21;
}Referenced by:
MiMarkProcessCfgBits