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.