PspJobDelete

VOID __stdcall PspJobDelete(PVOID Object){
  _ETHREAD *CurrentThread; 
  UINT64 v3; 
  void *v4; 
  __int64 v5; 
  PVOID *v6; 
  PVOID *v7; 
  _WNF_STATE_NAME_LIFETIME v8; 
  _WNF_DATA_SCOPE v9; 
  UINT8 v10; 
  void *v11; 
  _WNF_STATE_NAME *v12; 
  _QWORD *v13; 
  _QWORD *v14; 
  UINT64 *v15; 
  UINT64 v16; 
  INT64 v17; 
  void *v18; 
  INT64 v19; 
  _ETHREAD *v20; 
  unsigned int v21; 
  _HANDLE_TABLE_ENTRY *v22; 
  void *v23; 
  _QWORD *v24; 
  void *v25; 
  __int64 v26; 
  void *v27; 
  _WNF_TYPE_ID *v28; 
  INT64 v29; 
  UINT64 v30; 
  _EJOB *RootJob; 
  UINT64 v32; 
  __int128 v33; 
  __int64 v34; 
  INT64 v35[4]; 
  __int64 v36; 
  UINT64 a1[2]; 
  __int128 v38; 
  __int64 v39; 
  v36 = 0i64;
  v34 = 0i64;
  memset(v35, 0, sizeof(v35));
  v39 = 0i64;
  v33 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *(_OWORD *)a1 = 0i64;
  RootJob = 0i64;
  v38 = 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);
    v26 = *((_QWORD *)Object + 164);
    if( v26 )
    {
      memset(&v35[1], 0, 24);
      v36 = 4i64;
      v35[0] = *(_QWORD *)(v26 + 56);
      PspNetRateControlDispatch((INT64)v35);
      PspRemoveRateControl(Object);
    }
    PspUnlockJobConditionally((_EJOB *)Object, &RootJob);
    PspUnlockJob((__int64)RootJob, (__int64)CurrentThread);
  }
  PspJobIoRateControlDisable((_EJOB *)Object, v3);
  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((__int64)RootJob, (__int64)CurrentThread);
  }
  LODWORD(v32) = *((_DWORD *)Object + 120);
  if( (unsigned int)v32 <= 0xFFFFFFFD )
  {
    *(_QWORD *)&v33 = Object;
    DWORD2(v33) = 2;
    v34 = 0i64;
    PspLockJobExclusive((__int64)Object, (__int64)CurrentThread);
    PsInvokeWin32Callout(6i64, &v33, 1i64, &v32);
    PspUnlockJob((__int64)Object, (__int64)CurrentThread);
  }
  v4 = (void *)*((_QWORD *)Object + 57);
  *((_DWORD *)Object + 64) = 0;
  if( v4 )
  {
    ObfDereferenceObjectWithTag(v4, 0x624A7350ui64);
    *((_QWORD *)Object + 57) = 0i64;
  }
  v5 = *((_QWORD *)Object + 54);
  if( v5 )
  {
    SeReleaseSubjectContext((_SECURITY_SUBJECT_CONTEXT *)(v5 + 8));
    ExFreePoolWithTag(*((PVOID *)Object + 54), 0x614A7350u);
    PsReturnSharedPoolQuota(*((PVOID *)Object + 55), 0x28ui64, 0i64);
  }
  PspLockJobListExclusive((__int64)CurrentThread);
  v6 = (PVOID *)*((_QWORD *)Object + 3);
  if( v6[1] != (char *)Object + 24 )
    goto LABEL_40;
  v7 = (PVOID *)*((_QWORD *)Object + 4);
  if( *v7 != (char *)Object + 24 )
    goto LABEL_40;
  *v7 = v6;
  v6[1] = v7;
  PspUnlockJobListExclusive((__int64)CurrentThread);
  v11 = (void *)*((_QWORD *)Object + 123);
  if( v11 )
  {
    ExFreePoolWithTag(v11, 0x624A7350u);
    v27 = (void *)*((_QWORD *)Object + 124);
    *((_QWORD *)Object + 123) = 0i64;
    PsReturnSharedPoolQuota(v27, 0x88ui64, 0i64);
  }
  v12 = (_WNF_STATE_NAME *)*((_QWORD *)Object + 125);
  if( v12 )
    IoFreeMiniCompletionPacket(v12, v8, v9, v10, v28, v30, RootJob);
  if( (*((_DWORD *)Object + 330) & 0x800) != 0 )
    ZwDeleteWnfStateName((WNF_STATE_NAME *)Object + 110);
  PspGetJobLockHierarchyForDeletion((__int64)Object, (__int64)a1);
  PspLockJobsAndProcessExclusive(a1, 0i64, (INT64)CurrentThread);
  v13 = (char *)Object + 1040;
  v14 = (_QWORD *)*((_QWORD *)Object + 130);
  if( v14 != (_QWORD *)((char *)Object + 1040) )
  {
    if( (_QWORD *)v14[1] == v13 )
    {
      v24 = (_QWORD *)*((_QWORD *)Object + 131);
      if( (_QWORD *)*v24 == v13 )
      {
        *v24 = v14;
        v14[1] = v24;
        *((_QWORD *)Object + 131) = (char *)Object + 1040;
        *v13 = v13;
        ObDereferenceObjectDeferDelete(*((PVOID *)Object + 134));
        *((_QWORD *)Object + 134) = 0i64;
        goto LABEL_19;
      }
    }
LABEL_40:
    __fastfail(3u);
  }
LABEL_19:
  PspUnlockJobsAndProcessExclusive((INT64 *)a1, 0i64, (INT64)CurrentThread);
  ExDeleteResourceLite((INT64)Object + 56, v15, v16, v17, v28);
  if( *((_QWORD *)Object + 138) )
  {
    v25 = (void *)*((_QWORD *)Object + 139);
    if( v25 )
    {
      ExFreePoolWithTag(v25, 0x624A7350u);
      *((_QWORD *)Object + 139) = 0i64;
    }
  }
  if( (*((_DWORD *)Object + 330) & 0x40000000) != 0 )
    PspDeleteSilo((PEJOB)Object);
  v20 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v20 + 242);
  v21 = *((_DWORD *)Object + 309);
  if( v21 )
  {
    v22 = ExMapHandleToPointer(PspUniqueJobIdTable, (VOID *)v21, v18, v19, v29, v30, RootJob);
    ExDestroyHandle(PspUniqueJobIdTable, (VOID *)*((unsigned int *)Object + 309), v22);
  }
  KeLeaveCriticalRegion();
  v23 = (void *)*((_QWORD *)Object + 195);
  if( v23 )
    ObfDereferenceObjectWithTag(v23, 0x624A7350ui64);
}

Referenced by:

No references.