PspFreezeJobTree
NTSTATUS __stdcall PspFreezeJobTree(_EJOB *Job, _JOBOBJECT_FREEZE_INFORMATION *FreezeInformation){
int v4;
INT64 v5;
unsigned int Flags;
__int128 v8;
__int128 v9;
__int128 v10;
int v11;
int v12;
_EJOB *v13;
INT64 v14;
_JOBOBJECT_WAKE_FILTER WakeFilter;
INT64 JobPostCallback;
VOID *v17;
_JOBOBJECT_FREEZE_INFORMATION FreezeInformationa;
_BYTE WakeInfo[64];
v17 = 0i64;
WakeFilter = 0i64;
FreezeInformationa = 0i64;
memset(WakeInfo, 0i64, sizeof(WakeInfo));
JobPostCallback = (INT64)FreezeInformation;
v4 = 0;
LODWORD(v14) = 0;
ExAcquireResourceExclusiveLite((UINT64)Job + 56, 1, v5);
Flags = FreezeInformation->Flags;
if( (FreezeInformation->Flags & 1) != 0 )
{
v11 = *((_DWORD *)Job + 330) & 0x200;
if( FreezeInformation->Freeze )
{
if( v11 )
goto LABEL_35;
}
else if( !v11 )
{
goto LABEL_35;
}
}
if( (Flags & 4) != 0 )
{
v12 = *((_DWORD *)Job + 330) & 0x80000;
if( FreezeInformation->Swap )
{
if( !v12 )
goto LABEL_3;
}
else if( v12 )
{
goto LABEL_3;
}
LABEL_35:
LODWORD(v14) = -1073741811;
ExReleaseResourceLite((PERESOURCE)((char *)Job + 56));
return v14;
}
LABEL_3:
if( (Flags & 2) != 0 )
{
if( (*((_DWORD *)Job + 330) & 0x800) != 0 )
{
PspComputeReportWakeFilter(Job, &WakeFilter, &FreezeInformation->WakeFilter, 1u);
if( WakeFilter )
{
v8 = *((_OWORD *)Job + 56);
*(_OWORD *)WakeInfo = *((_OWORD *)Job + 55);
v9 = *((_OWORD *)Job + 57);
*(_OWORD *)&WakeInfo[16] = v8;
v10 = *((_OWORD *)Job + 58);
*(_OWORD *)&WakeInfo[32] = v9;
*(_OWORD *)&WakeInfo[48] = v10;
}
}
*((_QWORD *)Job + 119) = FreezeInformation->WakeFilter;
Flags = FreezeInformation->Flags;
}
if( (Flags & 1) != 0 )
{
if( FreezeInformation->Freeze )
_interlockedbittestandset((volatile signed __int32 *)Job + 330, 9u);
else
_interlockedbittestandreset((volatile signed __int32 *)Job + 330, 9u);
Flags = FreezeInformation->Flags;
v4 = 5;
}
if( (Flags & 4) != 0 )
{
if( FreezeInformation->Swap )
_interlockedbittestandset((volatile signed __int32 *)Job + 330, 0x13u);
else
_interlockedbittestandreset((volatile signed __int32 *)Job + 330, 0x13u);
v4 = 5;
}
if( v4 )
{
LODWORD(v13) = v4;
PspEnumJobsAndProcessesInJobHierarchy(
Job,
(INT64 *)PspSetJobFreezeCountCallback,
0i64,
PspSetProcessFreezeStateCallback,
&JobPostCallback,
v13,
(VOID *)v14,
*(INT64 **)&WakeFilter,
(_EPROCESS *)JobPostCallback,
v17,
*(VOID **)&FreezeInformationa.Flags,
*(_QWORD *)&FreezeInformationa.WakeFilter);
}
ExReleaseResourceLite((PERESOURCE)((char *)Job + 56));
if( v4 )
{
LODWORD(v13) = 0;
PspEnumJobsAndProcessesInJobHierarchy(
Job,
0i64,
(_EJOB *)PspExecuteJobFreezeThawCallback,
0i64,
&v14,
v13,
(VOID *)v14,
*(INT64 **)&WakeFilter,
(_EPROCESS *)JobPostCallback,
v17,
*(VOID **)&FreezeInformationa.Flags,
*(_QWORD *)&FreezeInformationa.WakeFilter);
if( (int)v14 < 0 )
{
FreezeInformation->Flags &= ~4u;
FreezeInformationa.Flags = 4;
FreezeInformationa.Swap = 0;
PspFreezeJobTree(Job, &FreezeInformationa);
LODWORD(v14) = 262;
}
}
PspDispatchWakeNotification(Job, &WakeFilter, (_JOBOBJECT_WAKE_INFORMATION *)WakeInfo);
return v14;
}Referenced by:
NtSetInformationJobObject
PspFreezeJobTree