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