PspSetJobIoRateControl

NTSTATUS __stdcall PspSetJobIoRateControl(VOID *Job, _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *ControlInfo){
  _ETHREAD *CurrentThread; 
  int v3; 
  __int64 v4; 
  _EX_PUSH_LOCK *v7; 
  unsigned int v8; 
  int v9; 
  char v10; 
  int v11; 
  const _EVENT_DESCRIPTOR *v12; 
  bool v13; 
  VOID *v15; 
  const wchar_t *v16; 
  UINT8 OldEntryDeactivated; 
  char NewEntryActivated[7]; 
  _EJOB *RootJob; 
  VOID *OpaqueRateControl; 
  int v21; 
  int v22; 
  VOID *v23; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  VOID **v25; 
  __int64 v26; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v27; 
  __int64 v28; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v29; 
  __int64 v30; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v31; 
  __int64 v32; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v33; 
  __int64 v34; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v35; 
  __int64 v36; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v37; 
  __int64 v38; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v39; 
  __int64 v40; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v41; 
  __int64 v42; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v43; 
  __int64 v44; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v45; 
  __int64 v46; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v47; 
  __int64 v48; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v49; 
  __int64 v50; 
  _JOBOBJECT_IO_RATE_CONTROL_INFORMATION_NATIVE_V2 *v51; 
  __int64 v52; 
  const wchar_t *v53; 
  int v54; 
  int v55; 
  int *v56; 
  __int64 v57; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0;
  v4 = -1i64;
  RootJob = 0i64;
  OpaqueRateControl = 0i64;
  OldEntryDeactivated = 0;
  --CurrentThread->Tcb.KernelApcDisable;
  NewEntryActivated[0] = 0;
  v7 = (_EX_PUSH_LOCK *)((char *)Job + 1512);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Job + 189, 0i64);
  v8 = 1;
  if( (ControlInfo[9] & 1) != 0 )
  {
    PspLockRootJobExclusive((_EJOB *)Job, CurrentThread, &RootJob);
    PspLockJobConditionally((_EJOB *)Job, &RootJob);
    v3 = PspSetJobIoAttribution((_EJOB *)Job, 1u, 0, 1ui64);
    if( v3 < 0 )
    {
LABEL_12:
      PspUnlockJobConditionally((_EJOB *)Job, &RootJob);
      PspUnlockJob(RootJob, CurrentThread);
      goto LABEL_13;
    }
    PspUnlockJobConditionally((_EJOB *)Job, &RootJob);
    PspUnlockJob(RootJob, CurrentThread);
    v3 = 0;
    if( *((_QWORD *)ControlInfo + 3) )
    {
      v3 = PspSetJobIoRateControlForVolume(
             (_EJOB *)Job,
             ControlInfo,
             &OldEntryDeactivated,
             (UINT8 *)NewEntryActivated,
             &OpaqueRateControl);
      if( v3 < 0 )
        goto LABEL_11;
    }
    else
    {
      if( !PspIoRateControlInfoIsAnySet(ControlInfo) )
      {
        if( !*((_QWORD *)Job + 180) )
          goto LABEL_10;
        OpaqueRateControl = (VOID *)*((_QWORD *)Job + 180);
        PspIoRateEntryDeactivate((_PS_IO_CONTROL_ENTRY *)Job + 25);
LABEL_20:
        v8 = 2;
LABEL_8:
        if( NewEntryActivated[0] )
          --v8;
        goto LABEL_10;
      }
      PspIoRateEntryActivate((_PS_IO_CONTROL_ENTRY *)Job + 25, (_EJOB *)Job);
      v3 = v9;
      if( v9 < 0 )
      {
LABEL_11:
        PspLockRootJobExclusive((_EJOB *)Job, CurrentThread, &RootJob);
        PspLockJobConditionally((_EJOB *)Job, &RootJob);
        PspSetJobIoAttribution((_EJOB *)Job, 0, 0, v8);
        goto LABEL_12;
      }
      OpaqueRateControl = (VOID *)*((_QWORD *)Job + 180);
      NewEntryActivated[0] = 1;
    }
    v3 = 0;
    if( !OldEntryDeactivated )
      goto LABEL_8;
    goto LABEL_20;
  }
  v15 = OpaqueRateControl;
  if( *((_QWORD *)Job + 180) )
    v15 = (VOID *)*((_QWORD *)Job + 180);
  OpaqueRateControl = v15;
  v8 = PspJobIoRateControlDisable((_EJOB *)Job);
LABEL_10:
  if( v8 )
    goto LABEL_11;
LABEL_13:
  v10 = _InterlockedExchangeAdd64(&v7->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
  if( (v10 & 2) != 0 && (v10 & 4) == 0 )
    ExfTryToWakePushLock(v7);
  KeAbPostRelease(v7);
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  v23 = OpaqueRateControl;
  v11 = *((_DWORD *)Job + 309);
  v12 = (const _EVENT_DESCRIPTOR *)PsIoRateControlStart;
  v21 = v11;
  v13 = (ControlInfo[9] & 1) == 0;
  v22 = v3;
  if( v13 )
    v12 = &PsIoRateControlStop;
  if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 245), v12) )
  {
    v16 = L"Global";
    if( *((_QWORD *)ControlInfo + 3) )
      v16 = (const wchar_t *)*((_QWORD *)ControlInfo + 3);
    do
      ++v4;
    while( v16[v4] );
    v53 = v16;
    UserData.Ptr = (unsigned __int64)&v21;
    v54 = 2 * v4 + 2;
    v25 = &v23;
    v55 = 0;
    v29 = ControlInfo + 2;
    *(_QWORD *)&UserData.Size = 4i64;
    v31 = ControlInfo + 18;
    v33 = ControlInfo + 4;
    v35 = ControlInfo + 14;
    v37 = ControlInfo + 20;
    v39 = ControlInfo + 12;
    v41 = ControlInfo + 16;
    v43 = ControlInfo + 22;
    v45 = ControlInfo + 24;
    v47 = ControlInfo + 26;
    v49 = ControlInfo + 28;
    v56 = &v22;
    v26 = 8i64;
    v27 = ControlInfo;
    v28 = 8i64;
    v30 = 8i64;
    v32 = 8i64;
    v34 = 8i64;
    v36 = 8i64;
    v38 = 8i64;
    v40 = 8i64;
    v42 = 8i64;
    v44 = 8i64;
    v46 = 8i64;
    v48 = 8i64;
    v50 = 8i64;
    v51 = ControlInfo + 9;
    v52 = 4i64;
    v57 = 4i64;
    EtwWrite(*(&ExBootDevicesRemovedEvent + 245), v12, 0, 0x11u, &UserData);
  }
  return v3;
}

Referenced by:

NtSetInformationJobObject