MiDeletePartialVad
NTSTATUS __stdcall MiDeletePartialVad(
PVOID Vad,
VOID *StartingAddress,
VOID *EndingAddress,
_MI_VAD_DELETE_INFO VadSplitType){
_MMVAD *v6;
int v7;
_EX_PUSH_LOCK *Process;
int v9;
UINT64 v10;
int v11;
int v12;
_MMPTE *PteBase;
_MMPTE *v14;
_MMPTE *v15;
int v16;
_MMPTE *v17;
unsigned __int64 v18;
__int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
__int64 v22;
_MMSUPPORT_SHARED *v23;
unsigned __int64 v24;
unsigned __int64 v25;
UINT8 v26;
_MMVAD *v27;
_MMVAD *ExtraCreateInfo;
_MMSUPPORT_SHARED *v29;
PVOID v30;
UINT64 v31;
_ETHREAD *v32;
unsigned int SessionId;
unsigned __int8 v34;
int v35;
__int64 v36;
bool v37;
__int64 v38;
_KLOCK_ENTRY *v39;
unsigned __int8 v40;
__int64 v41;
UINT64 v42;
_SUBSECTION *v43;
unsigned __int64 i;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v47;
__int64 v48;
unsigned __int64 v49;
unsigned __int64 v50;
_MMVAD_SHORT *p_Core;
unsigned __int64 k;
_MMVAD *j;
__int64 v54;
_MMVAD *Pool;
int PlaceholderStorage;
__int64 v57;
unsigned int v58;
char v59;
UINT64 v60;
_RTL_BALANCED_NODE *v61;
unsigned int v62;
_MMWSL_INSTANCE *bf_0;
unsigned __int64 v64;
__int64 v65;
_MMSUPPORT_SHARED *v66;
UINT8 v67;
unsigned __int64 v68;
__int64 v69;
unsigned __int64 v70;
unsigned __int64 v71;
_MMPTE *v72;
_MMPTE *v73;
_MMPTE *v74;
__int64 v75;
_MMSUPPORT_SHARED *v76;
UINT8 v77;
unsigned __int64 v78;
unsigned __int64 v79;
unsigned __int64 v80;
unsigned __int64 v81;
_SUBSECTION *Subsection;
unsigned __int64 v83;
unsigned __int64 v84;
_MI_PARTITION *v85;
struct _KPRCB *CurrentPrcb;
__int64 CachedResidentAvailable;
signed __int32 v88;
_RTL_BALANCED_NODE *v89;
UINT64 v90;
_BOOL8 v91;
unsigned __int64 v92;
__int64 v93;
_MMVAD *NextVad;
_MMVAD *NextVada;
_MMVAD *Vada;
bool v97;
__int64 v98;
_SUBSECTION *FirstSubsection;
_SUBSECTION *v100;
_MMSUPPORT_INSTANCE *Vm;
_EX_PUSH_LOCK *CurrentProcess;
UINT64 DeleteFlags;
int v104;
char a3[12];
_RTL_BALANCED_NODE *ControlArea;
unsigned __int64 v107;
_ETHREAD *CurrentThread;
UINT8 v109[16];
__int128 v110;
__int128 v111;
UINT8 WsIrql;
_MMVAD_SHORT *v116;
*(_OWORD *)v109 = 0i64;
FirstSubsection = 0i64;
v110 = 0i64;
v6 = 0i64;
v100 = 0i64;
v7 = 0;
v111 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v107 = (unsigned __int64)((_BYTE *)EndingAddress - (_BYTE *)StartingAddress + 1) >> 12;
v97 = 0;
Process = (_EX_PUSH_LOCK *)CurrentThread->Tcb.ApcState.Process;
ControlArea = 0i64;
DeleteFlags = 0i64;
CurrentProcess = Process;
Vm = (_MMSUPPORT_INSTANCE *)&Process[208];
v9 = *((_DWORD *)Vad + 12);
if( (v9 & 0x100000) != 0 )
{
v10 = 64i64;
v98 = 64i64;
v11 = 8;
if( (v9 & 0x70) != 64 )
v11 = 0;
LODWORD(DeleteFlags) = v11;
}
else
{
v10 = 136i64;
v98 = 136i64;
v54 = **((_QWORD **)Vad + 9);
ControlArea = (_RTL_BALANCED_NODE *)v54;
if( *(_QWORD *)(v54 + 64) )
{
if( *((__int64 *)Vad + 15) < 0 )
return -1073741791;
v97 = (*(_DWORD *)(v54 + 56) & 0x420) == 0;
}
}
v12 = 2147483645;
if( VadSplitType != VadDeleteMiddle )
goto LABEL_6;
Pool = (_MMVAD *)MiAllocatePool(64i64, v10, 0x46646156ui64);
v6 = Pool;
if( !Pool )
return -1073741670;
memmove(Pool, Vad, v10);
v6->Core.ReferenceCount = 0;
v6->Core.VadNode.ParentValue = -2i64;
v6->Core.EventList = 0i64;
v57 = *((unsigned int *)Vad + 13);
LODWORD(v57) = v57 & 0x7FFFFFFF;
v58 = v6->Core.u1.LongFlags1 & 0x80000000;
if( (v57 | ((unsigned __int64)*((unsigned __int8 *)Vad + 34) << 31)) == 0x7FFFFFFFDi64 )
{
v59 = 15;
v58 |= 0x7FFFFFFDu;
}
else
{
v59 = 0;
}
v6->Core.u1.LongFlags1 = v58;
v6->Core.CommitChargeHigh = v59;
v6->Core.PushLock._bf_0 = 0i64;
v60 = (((unsigned __int64)EndingAddress + 1) >> 12)
- (*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32));
if( (v6->Core.u.LongFlags & 0x70) == 64 && !MiCreateRotateView(&v6->Core) )
{
PlaceholderStorage = -1073741670;
LABEL_105:
MiFreeRotateView(&v6->Core);
MiFreePlaceholderStorage((INT64)v6);
ExFreePoolWithTag(v6, 0);
return PlaceholderStorage;
}
if( MiLocateLockedVadEvent((__int64)Vad, 128) )
{
PlaceholderStorage = MiCreatePlaceholderStorage(&v6->Core);
if( PlaceholderStorage < 0 )
goto LABEL_105;
}
MiLockNestedVad(&v6->Core);
MiAdvanceVadView(v6, v60);
MiUnlockNestedVad(&v6->Core);
Process = CurrentProcess;
if( v10 != 64 )
{
v61 = ControlArea;
v62 = v6->u2.LongFlags2 & 0xFDFFFFFF;
v6->u4.SequentialVa = 0i64;
v6->u2.LongFlags2 = v62;
PlaceholderStorage = MiInsertSharedCommitNode(v61, (_EPROCESS *)CurrentProcess, 0i64);
if( PlaceholderStorage < 0 )
goto LABEL_105;
v7 = 1;
}
PlaceholderStorage = MiInsertVadCharges(&v6->Core, (ULONG_PTR)CurrentProcess);
if( PlaceholderStorage < 0 )
{
if( v7 )
MiRemoveSharedCommitNode((_CONTROL_AREA *)ControlArea, (_EPROCESS *)CurrentProcess, 0i64);
goto LABEL_105;
}
bf_0 = (_MMWSL_INSTANCE *)CurrentProcess[210]._bf_0;
if( v10 == 64 )
{
if( MiVadPageSizes[(v6->Core.u.LongFlags >> 18) & 3] == 16 )
++*(_QWORD *)&bf_0[10].LastAccessClearingRemainder;
}
else
{
if( v6->FileObject )
{
ObfReferenceObjectWithTag(v6->FileObject, 0x746C6644ui64);
}
else if( MiVadPageSizes[(v6->Core.u.LongFlags >> 18) & 3] == 16 )
{
++bf_0[10].LockedEntries;
}
MiUpControlAreaRefs(&v6->Core);
}
LABEL_6:
PteBase = MmGetPteBase();
v14 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)StartingAddress >> 9) & 0x7FFFFFFFF8i64));
v15 = PteBase;
v16 = *((_DWORD *)Vad + 12);
v17 = (_MMPTE *)((char *)v15 + (((unsigned __int64)EndingAddress >> 9) & 0x7FFFFFFFF8i64));
v18 = 0i64;
if( (v16 & 0x70) == 16 || (v16 & 0x70) == 64 )
{
LODWORD(v64) = MiResidentPagesForSpan(
(VOID *)((*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32)) << 12),
(VOID *)(((*((unsigned int *)Vad + 7) | ((unsigned __int64)*((unsigned __int8 *)Vad + 33) << 32)) << 12) | 0xFFF));
v18 = v64;
}
--CurrentThread->Tcb.SpecialApcDisable;
*(_QWORD *)&a3[4] = Process + 154;
ExAcquirePushLockExclusiveEx(Process + 154, 0i64);
v19 = *((unsigned int *)Vad + 13);
LODWORD(v19) = v19 & 0x7FFFFFFF;
v20 = ((unsigned __int64)*((unsigned __int8 *)Vad + 34) << 31) | v19;
if( v20 != 0x7FFFFFFFDi64 && v20 )
{
if( v98 == 64 )
{
SharedVm = MiGetSharedVm(Vm);
v47 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
WsIrql = v47;
LODWORD(NextVad) = 4;
LODWORD(v48) = MiComputePageCommitment(
StartingAddress,
EndingAddress,
(_MMVAD_SHORT *)Vad,
v47,
(UINT64 *)NextVad);
v22 = v48;
}
else
{
LODWORD(v65) = MiCountSharedPages((_MMVAD *)Vad, v14, v17);
v22 = v17 - v14 - v65 + 1;
v66 = MiGetSharedVm(Vm);
v67 = ExAcquireSpinLockExclusive((INT64 *)&v66->WorkingSetLock);
v66->GoodCitizenWaiting = 0;
WsIrql = v67;
}
}
else
{
v21 = 0i64;
if( v20 != 0x7FFFFFFFDi64 )
v21 = v20;
v22 = 0i64;
v20 = v21;
v23 = MiGetSharedVm(Vm);
WsIrql = ExAcquireSpinLockExclusive((INT64 *)&v23->WorkingSetLock);
v23->GoodCitizenWaiting = 0;
}
if( VadSplitType == VadDeleteFront )
{
if( v98 != 64 && v97 )
MiGetProtoPteAddress();
v24 = v20 - v22;
if( (((unsigned __int64)*((unsigned __int8 *)Vad + 34) << 31) | *((_DWORD *)Vad + 13) & 0x7FFFFFFF) == 0x7FFFFFFFDi64 )
{
LOBYTE(v25) = 15;
}
else
{
v25 = v24 >> 31;
v12 = v24 & 0x7FFFFFFF;
}
*((_DWORD *)Vad + 13) = *((_DWORD *)Vad + 13) & 0x80000000 | v12;
*((_BYTE *)Vad + 34) = v25;
MiAdvanceVadView(
(_MMVAD *)Vad,
(((unsigned __int64)EndingAddress + 1) >> 12)
- (*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32)));
if( v98 != 64 && v97 )
MiGetProtoPteAddress();
v26 = WsIrql;
v27 = (_MMVAD *)Vad;
ExtraCreateInfo = 0i64;
}
else
{
v49 = v20 - v22;
if( VadSplitType == VadDeleteBack )
{
if( (((unsigned __int64)*((unsigned __int8 *)Vad + 34) << 31) | *((_DWORD *)Vad + 13) & 0x7FFFFFFF) == 0x7FFFFFFFDi64 )
{
LOBYTE(v50) = 15;
}
else
{
v50 = v49 >> 31;
v12 = v49 & 0x7FFFFFFF;
}
*((_DWORD *)Vad + 13) = v12 | *((_DWORD *)Vad + 13) & 0x80000000;
*((_BYTE *)Vad + 34) = v50;
if( v98 != 64 && v97 )
{
MiGetProtoPteAddress();
v100 = (_SUBSECTION *)MEMORY[0x10];
}
*((_DWORD *)Vad + 7) = ((unsigned __int64)StartingAddress - 1) >> 12;
*((_BYTE *)Vad + 33) = ((unsigned __int64)StartingAddress - 1) >> 44;
if( v98 != 64 && v97 )
{
MiGetProtoPteAddress();
FirstSubsection = (_SUBSECTION *)MEMORY[0x10];
MiAdvanceVadView((_MMVAD *)Vad, 0i64);
}
v26 = WsIrql;
v27 = 0i64;
}
else
{
if( v98 != 64 && v97 )
{
MiGetProtoPteAddress();
v100 = (_SUBSECTION *)MEMORY[0x10];
}
v68 = (unsigned __int64)StartingAddress - 1;
*((_DWORD *)Vad + 7) = ((unsigned __int64)StartingAddress - 1) >> 12;
*((_BYTE *)Vad + 33) = ((unsigned __int64)StartingAddress - 1) >> 44;
if( v98 != 64 && v97 )
{
MiGetProtoPteAddress();
FirstSubsection = (_SUBSECTION *)MEMORY[0x10];
MiAdvanceVadView((_MMVAD *)Vad, 0i64);
}
v107 += (v6->Core.EndingVpn | ((unsigned __int64)v6->Core.EndingVpnHigh << 32))
- (v6->Core.StartingVpn | ((unsigned __int64)v6->Core.StartingVpnHigh << 32))
+ 1;
MiInsertVad(v6, (_EPROCESS *)CurrentProcess);
v69 = *((unsigned int *)Vad + 13);
LODWORD(v69) = v69 & 0x7FFFFFFF;
if( (((unsigned __int64)*((unsigned __int8 *)Vad + 34) << 31) | v69) == 0x7FFFFFFFDi64 )
{
v26 = WsIrql;
v70 = 0x7FFFFFFFDi64;
}
else if( v98 == 64 )
{
v26 = WsIrql;
LODWORD(NextVad) = 4;
LODWORD(v71) = MiComputePageCommitment(
(VOID *)((*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32)) << 12),
(VOID *)v68,
(_MMVAD_SHORT *)Vad,
WsIrql,
(UINT64 *)NextVad);
v70 = v71;
}
else
{
MiUnlockWorkingSetExclusive(Vm, WsIrql);
v72 = MmGetPteBase();
v73 = &v72[(*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32)) & 0xFFFFFFFFFi64];
v74 = (_MMPTE *)((char *)v72 + ((v68 >> 9) & 0x7FFFFFFFF8i64));
LODWORD(v75) = MiCountSharedPages((_MMVAD *)Vad, v73, v74);
v70 = v74 - v73 - v75 + 1;
v76 = MiGetSharedVm(Vm);
v77 = ExAcquireSpinLockExclusive((INT64 *)&v76->WorkingSetLock);
v76->GoodCitizenWaiting = 0;
v26 = v77;
WsIrql = v77;
}
LODWORD(v78) = v70 & 0x7FFFFFFF;
v79 = v70 & 0x7FFFFFFF | *((_DWORD *)Vad + 13) & 0x80000000;
v80 = v70 >> 31;
*((_DWORD *)Vad + 13) = v79;
LODWORD(v79) = v79 & 0x7FFFFFFF;
*((_BYTE *)Vad + 34) = v70 >> 31;
if( (((unsigned __int64)(unsigned __int8)(v70 >> 31) << 31) | v79) != 0x7FFFFFFFDi64 )
{
v81 = v49 - v70;
v80 = v81 >> 31;
v78 = v81 & 0xFFFFFFFF7FFFFFFFui64;
}
v27 = v6;
v6->Core.u1.LongFlags1 = v6->Core.u1.LongFlags1 & 0x80000000 | v78;
v6->Core.CommitChargeHigh = v80;
}
ExtraCreateInfo = (_MMVAD *)Vad;
}
MiUnlockWorkingSetExclusive(Vm, v26);
MiDeleteVirtualAddresses(
StartingAddress,
EndingAddress,
(unsigned int)DeleteFlags,
(UINT8)v109,
(_MI_DELETE_VA_INFO *)NextVad);
v29 = MiGetSharedVm(Vm);
ExAcquireSpinLockExclusive((INT64 *)&v29->WorkingSetLock);
v29->GoodCitizenWaiting = 0;
if( FirstSubsection )
MiDrainSystemAccessLog(Vm);
MiCaptureDeleteHierarchy(
StartingAddress,
EndingAddress,
WsIrql,
(_MI_DELETED_PAGE_TABLE_LEVEL_BITS *)&DeleteFlags + 1);
MiUnlockWorkingSetExclusive(Vm, WsIrql);
if( !ExtraCreateInfo )
{
ExtraCreateInfo = *(_MMVAD **)Vad;
v30 = Vad;
if( *(_QWORD *)Vad )
{
for( ; ExtraCreateInfo->Core.ExtraCreateInfo; ExtraCreateInfo = (_MMVAD *)ExtraCreateInfo->Core.ExtraCreateInfo )
;
}
else
{
for( i = *((_QWORD *)Vad + 2); ; i = ExtraCreateInfo->Core.VadNode.ParentValue )
{
ExtraCreateInfo = (_MMVAD *)(i & 0xFFFFFFFFFFFFFFFCui64);
if( !ExtraCreateInfo || ExtraCreateInfo->Core.ExtraCreateInfo == v30 )
break;
v30 = ExtraCreateInfo;
}
}
}
if( !v27 )
{
v27 = (_MMVAD *)*((_QWORD *)Vad + 1);
p_Core = (_MMVAD_SHORT *)Vad;
if( v27 )
{
for( j = (_MMVAD *)v27->Core.NextVad; j; j = (_MMVAD *)j->Core.NextVad )
v27 = j;
}
else
{
for( k = *((_QWORD *)Vad + 2); ; k = v27->Core.VadNode.ParentValue )
{
v27 = (_MMVAD *)(k & 0xFFFFFFFFFFFFFFFCui64);
if( !v27 || v27->Core.NextVad == p_Core )
break;
p_Core = &v27->Core;
}
}
}
if( !v116 )
MiClearVadBits(StartingAddress, EndingAddress, ExtraCreateInfo, v27);
MiReturnPageTablePageCommitment(
StartingAddress,
EndingAddress,
(ULONG_PTR)CurrentProcess,
ExtraCreateInfo,
v27,
(_MMVAD *)Vad,
(_MI_DELETED_PAGE_TABLE_LEVEL_BITS *)&DeleteFlags + 1);
v31 = *(_QWORD *)&a3[4];
if( (_InterlockedExchangeAdd64(*(volatile signed __int64 **)&a3[4], 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v31);
*(_DWORD *)a3 = 0;
v32 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v31) == 1 )
SessionId = MmGetSessionIdEx(v32->Tcb.ApcState.Process);
else
SessionId = -1;
--v32->Tcb.SpecialApcDisable;
v34 = ++v32->Tcb.AbAllocationRegionCount;
v35 = ((char)v32->Tcb.AbEntrySummary | (char)v32->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
v36 = v31 & 0x7FFFFFFFFFFFFFFCi64;
v37 = !_BitScanReverse((unsigned int *)&v38, v35);
v104 = v38;
if( v37 )
{
LABEL_65:
if( (*(&v32->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v32, (PVOID)v31, (PVOID)SessionId, 0i64);
}
else
{
while( 1 )
{
v39 = &v32->Tcb.LockEntries[v38];
v35 &= ~(1 << v38);
if( (v39->AcquiredByte & 1) != 0
&& (v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == v36
&& v39->LockState.SessionId == SessionId )
{
v39->AcquiredByte &= ~1u;
if( v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
v37 = !_BitScanReverse((unsigned int *)&v38, v35);
v104 = v38;
if( v37 )
goto LABEL_64;
}
if( !v39 )
{
LABEL_64:
v31 = *(_QWORD *)&a3[4];
goto LABEL_65;
}
v39->CrossThreadReleasableAndBusyByte |= 2u;
if( v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v39);
*(_DWORD *)a3 = v39->BoostBitmap.AllFields & 0x1FFFF;
v39->BoostBitmap.AllFields &= 0xFFFE0000;
v39->ThreadLocalFlags &= ~1u;
v39->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v40 = 1 << (v39 - v32->Tcb.LockEntries);
if( v34 == 1 )
v32->Tcb.AbEntrySummary |= v40;
else
_InterlockedOr8((volatile signed __int8 *)&v32->Tcb.AbOrphanedEntrySummary, v40);
}
--v32->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v32->Tcb, *(VOID **)&a3[4], (UINT64 *)a3);
v37 = v32->Tcb.SpecialApcDisable++ == -1;
if( v37 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v32->Tcb.ApcState.ApcListHead[0].Flink != &v32->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( v116 )
{
MiReInsertPlaceholderVad((INT64)v116);
MiUnlockNestedVad(v116);
}
if( v6 && (v6->Core.u.LongFlags & 0x100000) == 0 )
{
Subsection = v6->Subsection;
v6->VadsProcess = (_EPROCESS *)((unsigned __int64)CurrentProcess | 1);
MiManageSubsectionView(Subsection, &v6->ViewLinks, 3i64);
}
v41 = v22 - v110;
v42 = v41 - *(_QWORD *)&v109[8];
if( v41 )
MiReturnFullProcessCharges((ULONG_PTR)CurrentProcess, v41);
if( v42 )
MiReturnCommit(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * HIWORD(CurrentProcess[229].Ptr)), v42);
if( v98 != 64 )
PsReturnProcessPagedPoolQuota((ULONG_PTR)CurrentProcess, 8 * v107);
if( v18 )
{
LODWORD(v83) = MiResidentPagesForSpan(
(VOID *)((*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32)) << 12),
(VOID *)(((*((unsigned int *)Vad + 7) | ((unsigned __int64)*((unsigned __int8 *)Vad + 33) << 32)) << 12) | 0xFFF));
if( v83 < v18 )
{
v84 = v18 - v83;
v85 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * HIWORD(CurrentProcess[229].Ptr));
if( v85 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( v84 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v84 >= 0x80000 )
break;
v88 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
v84 + CachedResidentAvailable,
CachedResidentAvailable);
v37 = (_DWORD)CachedResidentAvailable == v88;
LODWORD(CachedResidentAvailable) = v88;
if( v37 )
goto LABEL_56;
}
while( v88 != -1 && v84 + v88 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v84 += (int)CachedResidentAvailable - 192;
}
}
}
if( v84 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&v85->Vp.ResidentAvailablePages, v84);
}
}
LABEL_56:
MiFinishVadDeletion(
Vad,
(_MMVAD *)StartingAddress,
EndingAddress,
(VOID *)(v116 != 0i64),
NextVada,
(_MI_DELETED_PAGE_TABLE_LEVEL_BITS *)Vada);
v43 = FirstSubsection;
if( FirstSubsection && FirstSubsection != v100 )
{
v89 = ControlArea;
v90 = 0i64;
v91 = ControlArea[2].ParentValue != 0;
v92 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea[3]);
do
{
LODWORD(v93) = MiDecrementSubsections(v43, v43, 8ui64);
v43 = v43->NextSubsection;
v90 += v93;
}
while( v43 != v100 );
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&v89[3]);
__writecr8(v92);
if( v90 )
MiReturnCrossPartitionSectionCharges(
*(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (WORD2(v89[2].Right) & 0x3FF)),
v91,
v90);
}
return 0;
}Referenced by:
MiFreeVadRange