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.