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