MiMarkSharedImageCfgBits
VOID __fastcall MiMarkSharedImageCfgBits(_MI_CFG_BITMAP_INFO *BitMapInfo, INT64 ListType, _MMVAD *Vad){
_MI_CFG_BITMAP_INFO *v3;
_LARGE_INTEGER **Subsection;
_EPROCESS *Process;
__int64 v6;
__int64 v7;
_MMVAD *v8;
unsigned __int64 v9;
unsigned __int64 v10;
volatile signed __int64 *p_bf_0;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
INT64 v16;
INT64 v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 v20;
int v21;
VOID *v22;
unsigned __int64 v23;
unsigned int v24;
UINT64 NewProtect;
_MI_CFG_COPY_TO_BITMAP_ITERATOR *CopyIterator;
UINT64 *CapturedOldProtect;
UINT64 AnyPageLocked;
_EPROCESS *v29;
_MMVAD *DestinationVad;
_MI_CFG_BITMAP_INFO *v31;
_MI_CFG_COPY_TO_BITMAP_OPTION CopyOption[4];
int v33;
AnyPageLocked = 0i64;
v3 = BitMapInfo;
v31 = BitMapInfo;
Subsection = (_LARGE_INTEGER **)Vad->Subsection;
Process = KeGetCurrentThread()->ApcState.Process;
v29 = Process;
LODWORD(v6) = MiGetControlAreaLoadConfig(*Subsection);
v8 = (_MMVAD *)*((_QWORD *)v3 + 2);
v9 = (unsigned __int64)*(unsigned __int8 *)(v7 + 33) << 32;
v10 = (unsigned __int64)*(unsigned __int8 *)(v7 + 32) << 32;
DestinationVad = *(_MMVAD **)(v6 + 16);
p_bf_0 = &v8->Core.PushLock._bf_0;
v12 = (*(unsigned int *)(v7 + 24) | v10) << 12;
v13 = 2 * (((((*(unsigned int *)(v7 + 28) | v9) + 1) << 12) - v12) >> 4);
v14 = *(_QWORD *)v3 + ((2 * (v12 >> 4)) >> 3);
v15 = v13 >> 3;
ExAcquirePushLockExclusiveEx(&v8->Core.PushLock, 0i64);
if( !MiVadDeleted(&v8->Core) )
{
v18 = v15 + v14;
v33 = 0;
v19 = (v15 + v14 - 1) | 0xFFF;
v20 = v14 & 0xFFFFFFFFFFFFF000ui64;
*(_OWORD *)CopyOption = 0i64;
while( 1 )
{
if( v20 > v19 )
{
LABEL_10:
if( (_InterlockedExchangeAdd64(p_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&v8->Core.PushLock);
KeAbPostRelease(&v8->Core.PushLock);
return;
}
MiIsCfgBitMapPageShared((VOID *)v20, v8, v16, v17, NewProtect);
if( v21 == 2 )
break;
if( v21 != 1 )
{
if( v21 == 3 )
{
v22 = (VOID *)v19;
if( (v20 | 0x1FFFFF) <= v19 )
v22 = (VOID *)(v20 | 0x1FFFFF);
LABEL_6:
LODWORD(CopyIterator) = 0;
LODWORD(NewProtect) = 2;
if( MiSetProtectionOnSection(
(ULONG_PTR)Process,
v8,
(VOID *)v20,
v22,
NewProtect,
(UINT64)CopyIterator,
(UINT64 *)((char *)&AnyPageLocked + 4),
&AnyPageLocked) < 0 )
goto LABEL_10;
v20 = (unsigned __int64)v22 - 4095;
v3 = v31;
}
else
{
if( v20 < v14 )
v23 = (unsigned int)(v14 - v20);
else
v23 = 0i64;
if( v20 + 4096 <= v18 )
{
v24 = 4096 - v23;
}
else
{
v24 = v18 - v20 - v23;
if( (_DWORD)v18 - (_DWORD)v20 == (_DWORD)v23 )
goto LABEL_10;
}
LODWORD(CapturedOldProtect) = (unsigned int)(v23 + v20 - v14) >> 1 << 7;
if( MiCopyToCfgBitMap(
v3,
DestinationVad,
(VOID *)v23,
MiRvaListDefault,
v20 + (unsigned int)v23,
(_MI_CFG_COPY_TO_BITMAP_ITERATOR *)v8,
(UINT64)CapturedOldProtect,
(_MI_CFG_COPY_TO_BITMAP_OPTION)CopyOption,
v24) < 0 )
goto LABEL_10;
}
LODWORD(Process) = (_DWORD)v29;
}
v20 += 4096i64;
}
v22 = (VOID *)(v20 | 0xFFF);
goto LABEL_6;
}
if( (_InterlockedExchangeAdd64(p_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&v8->Core.PushLock);
KeAbPostRelease(&v8->Core.PushLock);
}Referenced by:
MiMarkProcessCfgBits