PspChangeProcessExecutionState
__int64 __fastcall PspChangeProcessExecutionState(ULONG_PTR BugCheckParameter1){
unsigned int v1;
char v2;
unsigned __int32 v4;
struct _DMA_ADAPTER *v5;
int v6;
unsigned int v7;
unsigned __int32 v9;
char v10;
char v11;
unsigned int SessionId;
struct _DMA_ADAPTER *v13;
char v14;
unsigned __int32 v15;
int v16;
bool v17;
signed __int32 v18;
void(__fastcall **ExtensionTable)(ULONG_PTR);
int 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((const void *)(BugCheckParameter1 + 1120));
v4 = *(_DWORD *)(BugCheckParameter1 + 1120);
v5 = 0i64;
while( (v4 & 0x40000000) == 0 )
{
v6 = (v4 >> 28) & 3;
v7 = (v4 >> 22) & 3;
if( v6 == v7 )
break;
v9 = v4;
v4 = _InterlockedCompareExchange((volatile signed __int32 *)(BugCheckParameter1 + 1120), v4 | 0x40000000, v4);
if( v9 == v4 )
{
LABEL_6:
v10 = 0;
v11 = v7 ^ v6;
if( !v2 )
{
KiStackAttachProcess((_KPROCESS *)BugCheckParameter1, 0i64, &ApcState);
SessionId = MmGetSessionIdEx(BugCheckParameter1);
if( SessionId != -1 )
{
LODWORD(v13) = MmGetSessionById(SessionId);
v5 = v13;
if( v13 )
{
if( MmAttachSession(v13, &v22) < 0 )
{
HalPutDmaAdapter(v5);
v5 = 0i64;
}
}
}
v2 = 1;
}
if( (v11 & 2) != 0 )
{
if( (v6 & 2) != 0 )
v10 = 1;
else
MmInSwapWorkingSet((_EPROCESS *)BugCheckParameter1);
}
if( (v11 & 1) != 0 )
{
v14 = 1;
v21 = 1;
if( (v6 & 1) != 0 )
PsFreezeProcess(BugCheckParameter1, 1);
else
PsThawProcess(BugCheckParameter1, 1);
}
else
{
v14 = v21;
}
v7 = v6;
if( v10 )
{
v20 = MmOutSwapWorkingSet((_EPROCESS *)BugCheckParameter1, PspOutSwapSharedPages != 0);
if( v20 < 0 )
{
if( v20 == -1073741671 )
v1 = -1073741671;
v7 = v6 & 0xFFFFFFFD;
}
}
_m_prefetchw((const void *)(BugCheckParameter1 + 1120));
v15 = *(_DWORD *)(BugCheckParameter1 + 1120);
v16 = v6;
do
{
v6 = (v15 >> 28) & 3;
if( v6 != v16 && v6 != v7 )
goto LABEL_6;
v18 = _InterlockedCompareExchange(
(volatile signed __int32 *)(BugCheckParameter1 + 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 **)(ULONG_PTR))ExGetExtensionTable(PspMmcssExtensionHost);
if( ExtensionTable )
{
(*ExtensionTable)(BugCheckParameter1);
ExReleaseExtensionTable(PspMmcssExtensionHost);
}
}
return v1;
}
}
return v1;
}Referenced by:
PsSwapProcessWorkingSet
PspAssignProcessToJob
PspExecuteJobFreezeThawCallback
PspInsertThread
PspRemoveProcessFromJobChain