PspJobDelete

VOID __stdcall PspJobDelete(VOID *Object){
  _ETHREAD *CurrentThread; 
  VOID *v3; 
  __int64 v4; 
  VOID **v5; 
  VOID **v6; 
  void *v7; 
  _IO_MINI_COMPLETION_PACKET_USER *v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  VOID *v11; 
  INT64 v12; 
  _ETHREAD *v13; 
  unsigned int v14; 
  _HANDLE_TABLE_ENTRY *v15; 
  VOID *v16; 
  _QWORD *v17; 
  void *v18; 
  _SYSTEM_NET_RATE_CONTROL_CONTEXT_HEADER *v19; 
  VOID *v20; 
  const VOID *v21; 
  INT64 v22; 
  _EJOB *RootJob; 
  UINT64 SessionId; 
  __int128 Parameters; 
  __int64 v26; 
  _SYSTEM_NET_RATE_CONTROL_CONTEXT_HEADER Header[4]; 
  __int64 v28; 
  _PSP_JOB_LOCK_HIERARCHY JobHierarchy[4]; 
  __int128 v30; 
  __int64 v31; 

  v28 = 0i64;
  v26 = 0i64;
  memset(Header, 0, sizeof(Header));
  v31 = 0i64;
  Parameters = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *(_OWORD *)JobHierarchy = 0i64;
  RootJob = 0i64;
  v30 = 0i64;
  PspEmptyPropertySet((_PS_PROPERTY_SET *)((char *)Object + 1280));
  PspJobDeleteStorageArrays((INT64)Object);
  if( *((_QWORD *)Object + 126) || *((_QWORD *)Object + 164) )
  {
    PspLockRootJobExclusive((_EJOB *)Object, CurrentThread, &RootJob);
    PspLockJobConditionally((_EJOB *)Object, &RootJob);
    if( *((_QWORD *)Object + 126) )
      PspRemoveCpuRateControl((_EJOB *)Object);
    v19 = (_SYSTEM_NET_RATE_CONTROL_CONTEXT_HEADER *)*((_QWORD *)Object + 164);
    if( v19 )
    {
      memset(&Header[1], 0, 24);
      v28 = 4i64;
      Header[0] = v19[7];
      PspNetRateControlDispatch(Header);
      PspRemoveRateControl((_EJOB *)Object);
    }
    PspUnlockJobConditionally((_EJOB *)Object, &RootJob);
    PspUnlockJob(RootJob, CurrentThread);
  }
  PspJobIoRateControlDisable((_EJOB *)Object);
  if( *((_QWORD *)Object + 169) )
  {
    PspLockRootJobExclusive((_EJOB *)Object, CurrentThread, &RootJob);
    PspLockJobConditionally((_EJOB *)Object, &RootJob);
    if( *((_QWORD *)Object + 169) )
      PspRemoveIoAttribution((_EJOB *)Object);
    PspUnlockJobConditionally((_EJOB *)Object, &RootJob);
    PspUnlockJob(RootJob, CurrentThread);
  }
  LODWORD(SessionId) = *((_DWORD *)Object + 120);
  if( (unsigned int)SessionId <= 0xFFFFFFFD )
  {
    *(_QWORD *)&Parameters = Object;
    DWORD2(Parameters) = 2;
    v26 = 0i64;
    PspLockJobExclusive((_EJOB *)Object, CurrentThread);
    PsInvokeWin32Callout(Win32JobCallout, &Parameters, PsWin32SessionAttachSingle, &SessionId);
    PspUnlockJob((_EJOB *)Object, CurrentThread);
  }
  v3 = (VOID *)*((_QWORD *)Object + 57);
  *((_DWORD *)Object + 64) = 0;
  if( v3 )
  {
    ObfDereferenceObjectWithTag(v3, 0x624A7350ui64);
    *((_QWORD *)Object + 57) = 0i64;
  }
  v4 = *((_QWORD *)Object + 54);
  if( v4 )
  {
    SeReleaseSubjectContext((PSECURITY_SUBJECT_CONTEXT)(v4 + 8));
    ExFreePoolWithTag(*((PVOID *)Object + 54), 0x614A7350u);
    PsReturnSharedPoolQuota(*((VOID **)Object + 55), 0x28u, 0);
  }
  PspLockJobListExclusive(CurrentThread);
  v5 = (VOID **)*((_QWORD *)Object + 3);
  if( v5[1] != (char *)Object + 24 )
    goto LABEL_40;
  v6 = (VOID **)*((_QWORD *)Object + 4);
  if( *v6 != (char *)Object + 24 )
    goto LABEL_40;
  *v6 = v5;
  v5[1] = v6;
  PspUnlockJobListExclusive(CurrentThread);
  v7 = (void *)*((_QWORD *)Object + 123);
  if( v7 )
  {
    ExFreePoolWithTag(v7, 0x624A7350u);
    v20 = (VOID *)*((_QWORD *)Object + 124);
    *((_QWORD *)Object + 123) = 0i64;
    PsReturnSharedPoolQuota(v20, 0x88u, 0);
  }
  v8 = (_IO_MINI_COMPLETION_PACKET_USER *)*((_QWORD *)Object + 125);
  if( v8 )
    IoFreeMiniCompletionPacket(v8);
  if( (*((_DWORD *)Object + 330) & 0x800) != 0 )
    ZwDeleteWnfStateName((_WNF_STATE_NAME *)Object + 110);
  PspGetJobLockHierarchyForDeletion((_EJOB *)Object, JobHierarchy);
  PspLockJobsAndProcessExclusive(JobHierarchy, 0i64, CurrentThread);
  v9 = (char *)Object + 1040;
  v10 = (_QWORD *)*((_QWORD *)Object + 130);
  if( v10 != (_QWORD *)((char *)Object + 1040) )
  {
    if( (_QWORD *)v10[1] == v9 )
    {
      v17 = (_QWORD *)*((_QWORD *)Object + 131);
      if( (_QWORD *)*v17 == v9 )
      {
        *v17 = v10;
        v10[1] = v17;
        *((_QWORD *)Object + 131) = (char *)Object + 1040;
        *v9 = v9;
        ObDereferenceObjectDeferDelete(*((_QWORD *)Object + 134));
        *((_QWORD *)Object + 134) = 0i64;
        goto LABEL_19;
      }
    }
LABEL_40:
    __fastfail(3u);
  }
LABEL_19:
  PspUnlockJobsAndProcessExclusive(JobHierarchy, 0i64, CurrentThread);
  ExDeleteResourceLite((UINT64)Object + 56);
  if( *((_QWORD *)Object + 138) )
  {
    v18 = (void *)*((_QWORD *)Object + 139);
    if( v18 )
    {
      ExFreePoolWithTag(v18, 0x624A7350u);
      *((_QWORD *)Object + 139) = 0i64;
    }
  }
  if( (*((_DWORD *)Object + 330) & 0x40000000) != 0 )
    PspDeleteSilo((_EJOB *)Object);
  v13 = (_ETHREAD *)KeGetCurrentThread();
  --v13->Tcb.KernelApcDisable;
  v14 = *((_DWORD *)Object + 309);
  if( v14 )
  {
    v15 = ExMapHandleToPointer(PspUniqueJobIdTable, (VOID *)v14, v11, v12, v21, v22, RootJob);
    ExDestroyHandle(PspUniqueJobIdTable, (VOID *)*((unsigned int *)Object + 309), v15);
  }
  KeLeaveCriticalRegion();
  v16 = (VOID *)*((_QWORD *)Object + 195);
  if( v16 )
    ObfDereferenceObjectWithTag(v16, 0x624A7350ui64);
}

Referenced by:

No references.