PspChangeProcessExecutionState
NTSTATUS __stdcall PspChangeProcessExecutionState(_EPROCESS *Process){
NTSTATUS v1;
char v2;
unsigned __int32 Flags2;
_ADAPTER_OBJECT *v5;
int v6;
unsigned int v7;
unsigned __int32 v9;
char v10;
char v11;
unsigned int SessionId;
_ADAPTER_OBJECT *SessionById;
char v14;
unsigned __int32 v15;
int v16;
bool v17;
signed __int32 v18;
void(__fastcall **ExtensionTable)(_EPROCESS *);
NTSTATUS v20;
char v21;
_KAPC_STATE v22;
_KAPC_STATE ApcState;
v21 = 0;
v1 = 0;
memset(&ApcState, 0, sizeof(ApcState));
v2 = 0;
memset(&v22, 0, sizeof(v22));
_m_prefetchw(&Process->1120);
Flags2 = Process->Flags2;
v5 = 0i64;
while( (Flags2 & 0x40000000) == 0 )
{
v6 = (Flags2 >> 28) & 3;
v7 = (Flags2 >> 22) & 3;
if( v6 == v7 )
break;
v9 = Flags2;
Flags2 = _InterlockedCompareExchange((volatile signed __int32 *)&Process->1120, Flags2 | 0x40000000, Flags2);
if( v9 == Flags2 )
{
LABEL_6:
v10 = 0;
v11 = v7 ^ v6;
if( !v2 )
{
KiStackAttachProcess(Process, 0i64, &ApcState);
SessionId = MmGetSessionIdEx(Process);
if( SessionId != -1 )
{
SessionById = (_ADAPTER_OBJECT *)MmGetSessionById(SessionId);
v5 = SessionById;
if( SessionById )
{
if( MmAttachSession(SessionById, &v22) < 0 )
{
HalPutDmaAdapter(v5);
v5 = 0i64;
}
}
}
v2 = 1;
}
if( (v11 & 2) != 0 )
{
if( (v6 & 2) != 0 )
v10 = 1;
else
MmInSwapWorkingSet(Process);
}
if( (v11 & 1) != 0 )
{
v14 = 1;
v21 = 1;
if( (v6 & 1) != 0 )
PsFreezeProcess(Process, 1u);
else
PsThawProcess(Process, 1u);
}
else
{
v14 = v21;
}
v7 = v6;
if( v10 )
{
v20 = MmOutSwapWorkingSet(Process, *(&stru_140CF2E80 + 1817) != 0);
if( v20 < 0 )
{
if( v20 == -1073741671 )
v1 = -1073741671;
v7 = v6 & 0xFFFFFFFD;
}
}
_m_prefetchw(&Process->1120);
v15 = Process->Flags2;
v16 = v6;
do
{
v6 = (v15 >> 28) & 3;
if( v6 != v16 && v6 != v7 )
goto LABEL_6;
v18 = _InterlockedCompareExchange(
(volatile signed __int32 *)&Process->1120,
v15 & 0x8F3FFFFF | ((v7 | (v7 << 6)) << 22),
v15);
v17 = v15 == v18;
v15 = v18;
}
while( !v17 );
if( v5 )
{
MmDetachSession(v5, &v22);
HalPutDmaAdapter(v5);
}
KiUnstackDetachProcess(&ApcState, 0i64);
if( v14 )
{
ExtensionTable = (void(__fastcall **)(_EPROCESS *))ExGetExtensionTable((_EX_HOST *)PspMmcssExtensionHost);
if( ExtensionTable )
{
(*ExtensionTable)(Process);
ExReleaseExtensionTable(PspMmcssExtensionHost);
}
}
return v1;
}
}
return v1;
}Referenced by:
PsSwapProcessWorkingSet
PspAssignProcessToJob
PspExecuteJobFreezeThawCallback
PspInsertThread
PspRemoveProcessFromJobChain