KiInSwapProcesses
VOID __stdcall KiInSwapProcesses(SINGLE_LIST_ENTRY *SwapEntry){
_LIST_ENTRY *v1;
__int64 v2;
__int64 v3;
SINGLE_LIST_ENTRY *v5;
unsigned __int64 PxeSelfRef;
int Next_high;
UINT8 CurrentIrql;
SINGLE_LIST_ENTRY *v9;
_LIST_ENTRY *Next;
UINT64 v11;
UINT64 v12;
__int64 v13;
void *v14;
char *v15;
unsigned __int64 v16;
unsigned __int64 v17;
CHAR v18;
INT64 v19;
CHAR v20;
_SINGLE_LIST_ENTRY *v21;
UINT64 v22;
INT64 v23;
INT64 v24;
UINT64 v25;
INT64 v26;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 *v28;
INT64 *v29;
_BYTE savedregs[64];
SINGLE_LIST_ENTRY *v31;
UINT8 OldIrql;
UINT64 OutswappedPageResident;
PVOID VirtualAddress;
do
{
v5 = SwapEntry - 45;
PxeSelfRef = (unsigned __int64)MmGetPxeSelfRef();
SwapEntry = SwapEntry->Next;
v31 = SwapEntry;
_InterlockedXor((volatile signed __int32 *)&v5[105], 6u);
OutswappedPageResident = 0i64;
Next_high = HIDWORD(v5[140].Next);
OldIrql = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (Next_high & 0x80u) != 0 )
{
LODWORD(v24) = WORD2(v5[104].Next);
OutswappedPageResident = MiMakeOutswappedPageResident((__int64)v5, (__int64)v1, v2, v3, v24);
v11 = OutswappedPageResident;
v12 = OutswappedPageResident;
MiPteInShadowRange((UINT64)&OutswappedPageResident);
v13 = (v11 >> 12) & 0xFFFFFFFFFi64;
LODWORD(v14) = MiMapPageInHyperSpaceWorker(v13, &OldIrql, 0x80000000ui64);
VirtualAddress = v14;
*((_QWORD *)v14 + ((PxeSelfRef >> 3) & 0x1FF)) = v12;
MiUnmapPageInHyperSpaceWorker(VirtualAddress, OldIrql, 0x80000000ui64);
v15 = (char *)MmGetPfnDb() + 48 * v13;
v16 = (unsigned __int8)MiLockPageInline((INT64)v15);
v17 = v13 | *((_QWORD *)v15 + 5) & 0xFFFFFFF000000000ui64;
*((_QWORD *)v15 + 3) ^= ((*((_QWORD *)v15 + 3) + 1i64) ^ *((_QWORD *)v15 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
*((_QWORD *)v15 + 5) = v17;
MiSetPageTablePfnBuddy((INT64)v15, (INT64)v5, 1i64);
*((_QWORD *)v15 + 1) = MmGetPxeSelfRef();
if( (*v15 & 1) == 0 )
MiMarkPfnTradable((INT64)v15, 1i64);
_InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v16);
v5[225].Next = (_SINGLE_LIST_ENTRY *)1;
v5[226].Next = (_SINGLE_LIST_ENTRY *)1;
LODWORD(v21) = KeMakeKernelDirectoryTableBase(
(UINT64 *)(v13 << 12),
v18,
v19,
v20,
v25,
v26,
(PRIVILEGE_SET **)LockHandle.LockQueue.Next,
(INT64 *)LockHandle.LockQueue.Lock,
LockHandle.OldIrql,
v28,
v29,
savedregs[0]);
v5[5].Next = v21;
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
if( (HIDWORD(v5[140].Next) & 0x800000) != 0 )
{
_InterlockedAnd((volatile signed __int32 *)&v5[140].Next + 1, 0xFF7FFFFF);
MiUpdateSystemPdes((INT64)v5, v22, v23);
}
MiReturnWsToExpansionList((_MMSUPPORT_INSTANCE *)&v5[208], 0i64);
_InterlockedAnd((volatile signed __int32 *)&v5[140].Next + 1, 0xFFFFFF7F);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
SwapEntry = v31;
}
_InterlockedAnd((volatile signed __int32 *)&v5[140].Next + 1, 0xFFFFFFBF);
if( (BYTE3(v5[231].Next) & 0x60) == 64 )
MiReAcquireOutSwappedProcessCommit((_EPROCESS *)v5);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiAcquireKobjectLockSafe(v5);
v9 = v5 + 43;
Next = (_LIST_ENTRY *)v5[43].Next;
if( Next == (_LIST_ENTRY *)&v5[43] )
{
Next = 0i64;
}
else
{
v1 = (_LIST_ENTRY *)v5[44].Next;
if( (SINGLE_LIST_ENTRY *)Next->Blink != v9 || (SINGLE_LIST_ENTRY *)v1->Flink != v9 )
__fastfail(3u);
v1->Flink = Next;
Next->Blink = v1;
v5[44].Next = v5 + 43;
v9->Next = v9;
}
_InterlockedXor((volatile signed __int32 *)&v5[105], 4u);
_InterlockedAnd((volatile signed __int32 *)v5, 0xFFFFFF7F);
if( Next )
KiReadyOutSwappedThreads(Next, CurrentIrql);
else
__writecr8(CurrentIrql);
}
while( SwapEntry );
}Referenced by:
KeSwapProcessOrStack