PspSetJobIoRateControl
__int64 __fastcall PspSetJobIoRateControl(unsigned __int64 a1, __int64 a2){
_ETHREAD *CurrentThread;
int v3;
__int64 v4;
volatile signed __int64 *v7;
UINT64 v8;
unsigned int v9;
char v10;
EVENT_DESCRIPTOR *v11;
int v12;
EVENT_DESCRIPTOR *v13;
bool v14;
__int64 v16;
const WCHAR *v17;
BYTE v18;
char v19[7];
_EJOB *RootJob;
__int64 v21;
int v22;
int v23;
__int64 v24;
EVENT_DATA_DESCRIPTOR UserData;
__int64 *v26;
__int64 v27;
__int64 v28;
__int64 v29;
__int64 v30;
__int64 v31;
__int64 v32;
__int64 v33;
__int64 v34;
__int64 v35;
__int64 v36;
__int64 v37;
__int64 v38;
__int64 v39;
__int64 v40;
__int64 v41;
__int64 v42;
__int64 v43;
__int64 v44;
__int64 v45;
__int64 v46;
__int64 v47;
__int64 v48;
__int64 v49;
__int64 v50;
__int64 v51;
__int64 v52;
__int64 v53;
const WCHAR *v54;
int v55;
int v56;
int *v57;
__int64 v58;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
v4 = -1i64;
RootJob = 0i64;
v21 = 0i64;
v18 = 0;
--*((_WORD *)CurrentThread + 242);
v19[0] = 0;
v7 = (volatile signed __int64 *)(a1 + 1512);
ExAcquirePushLockExclusiveEx(a1 + 1512, 0i64);
v9 = 1;
if( (*(_DWORD *)(a2 + 36) & 1) != 0 )
{
PspLockRootJobExclusive((_EJOB *)a1, CurrentThread, &RootJob);
PspLockJobConditionally((_EJOB *)a1, &RootJob);
v3 = PspSetJobIoAttribution((_EJOB *)a1, 1u, 0, 1ui64);
if( v3 < 0 )
{
LABEL_12:
PspUnlockJobConditionally((_EJOB *)a1, &RootJob);
PspUnlockJob((__int64)RootJob, (__int64)CurrentThread);
goto LABEL_13;
}
PspUnlockJobConditionally((_EJOB *)a1, &RootJob);
PspUnlockJob((__int64)RootJob, (__int64)CurrentThread);
v3 = 0;
if( *(_QWORD *)(a2 + 24) )
{
v3 = PspSetJobIoRateControlForVolume(a1, (_QWORD *)a2, &v18, v19, (unsigned __int64 *)&v21);
if( v3 < 0 )
goto LABEL_11;
}
else
{
if( !PspIoRateControlInfoIsAnySet((_QWORD *)a2) )
{
if( !*(_QWORD *)(a1 + 1440) )
goto LABEL_10;
v21 = *(_QWORD *)(a1 + 1440);
PspIoRateEntryDeactivate((struct EX_RUNDOWN_REF *)(a1 + 1400));
LABEL_20:
v9 = 2;
LABEL_8:
if( v19[0] )
--v9;
goto LABEL_10;
}
v3 = PspIoRateEntryActivate((struct EX_RUNDOWN_REF *)(a1 + 1400), (VOID **)a1, a2, &v18);
if( v3 < 0 )
{
LABEL_11:
PspLockRootJobExclusive((_EJOB *)a1, CurrentThread, &RootJob);
PspLockJobConditionally((_EJOB *)a1, &RootJob);
PspSetJobIoAttribution((_EJOB *)a1, 0, 0, v9);
goto LABEL_12;
}
v21 = *(_QWORD *)(a1 + 1440);
v19[0] = 1;
}
v3 = 0;
if( !v18 )
goto LABEL_8;
goto LABEL_20;
}
v16 = v21;
if( *(_QWORD *)(a1 + 1440) )
v16 = *(_QWORD *)(a1 + 1440);
v21 = v16;
v9 = PspJobIoRateControlDisable((_EJOB *)a1, v8);
LABEL_10:
if( v9 )
goto LABEL_11;
LABEL_13:
v10 = _InterlockedExchangeAdd64(v7, 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock(v7);
KeAbPostRelease((PVOID)v7);
KeLeaveCriticalRegionThread((__int64)CurrentThread);
v24 = v21;
v12 = *(_DWORD *)(a1 + 1236);
v13 = (EVENT_DESCRIPTOR *)PsIoRateControlStart;
v22 = v12;
v14 = (*(_DWORD *)(a2 + 36) & 1) == 0;
v23 = v3;
if( v14 )
v13 = (EVENT_DESCRIPTOR *)&PsIoRateControlStop;
if( EtwEventEnabled(*(UINT64 *)EtwpPsProvRegHandle, v13, v11) )
{
v17 = L"Global";
if( *(_QWORD *)(a2 + 24) )
v17 = *(const WCHAR **)(a2 + 24);
do
++v4;
while( v17[v4] );
v54 = v17;
UserData.Ptr = (unsigned __int64)&v22;
v55 = 2 * v4 + 2;
v26 = &v24;
v56 = 0;
v30 = a2 + 8;
*(_QWORD *)&UserData.Size = 4i64;
v32 = a2 + 72;
v34 = a2 + 16;
v36 = a2 + 56;
v38 = a2 + 80;
v40 = a2 + 48;
v42 = a2 + 64;
v44 = a2 + 88;
v46 = a2 + 96;
v48 = a2 + 104;
v50 = a2 + 112;
v57 = &v23;
v27 = 8i64;
v28 = a2;
v29 = 8i64;
v31 = 8i64;
v33 = 8i64;
v35 = 8i64;
v37 = 8i64;
v39 = 8i64;
v41 = 8i64;
v43 = 8i64;
v45 = 8i64;
v47 = 8i64;
v49 = 8i64;
v51 = 8i64;
v52 = a2 + 36;
v53 = 4i64;
v58 = 4i64;
EtwWrite(*(UINT64 *)EtwpPsProvRegHandle, v13, 0i64, 0x11ui64, &UserData);
}
return(unsigned int)v3;
}Referenced by:
NtSetInformationJobObject