IoSetDiskIoAttributionFromThread

NTSTATUS __stdcall IoSetDiskIoAttributionFromThread(_IRP *Irp, _ETHREAD *Thread){
  void *WorkOnBehalfThread; 
  int v4; 
  _EPROCESS *Process; 
  _EPROCESS *v7; 
  UINT64 v8; 
  NTSTATUS v9; 
  int v11; 
  unsigned __int8 v12; 
  _QWORD *DiskIoAttribution; 
  unsigned __int64 v14; 
  int v15; 
  unsigned __int8 v16; 
  unsigned __int64 v17; 

  WorkOnBehalfThread = Thread->WorkOnBehalfThread;
  v4 = 0;
  if( !WorkOnBehalfThread )
    goto LABEL_27;
  if( Thread != (_ETHREAD *)KeGetCurrentThread() )
  {
    v16 = ExAcquireSpinLockShared(&PspThreadWorkOnBehalfLock);
    WorkOnBehalfThread = Thread->WorkOnBehalfThread;
    v17 = v16;
    if( WorkOnBehalfThread )
    {
      ObfReferenceObjectWithTag(Thread->WorkOnBehalfThread, 0x746C6644ui64);
      v4 = 1;
    }
    ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&PspThreadWorkOnBehalfLock);
    __writecr8(v17);
  }
  if( WorkOnBehalfThread )
  {
    v7 = (_EPROCESS *)*((_QWORD *)WorkOnBehalfThread + 68);
  }
  else
  {
LABEL_27:
    if( Thread == (_ETHREAD *)KeGetCurrentThread() )
    {
      Process = Thread->Tcb.ApcState.Process;
      if( Process != Thread->Tcb.Process )
      {
        IopSetDiskIoAttributionFromProcess(Irp, Process);
        if( v11 >= 0 )
        {
LABEL_15:
          v9 = 0;
          goto LABEL_8;
        }
      }
    }
    v7 = Thread->Tcb.Process;
  }
  v8 = 0i64;
  if( v7->DiskIoAttribution )
  {
    v12 = ExAcquireSpinLockShared((INT64 *)&stru_140C452E0 + 139);
    DiskIoAttribution = v7->DiskIoAttribution;
    v14 = v12;
    if( DiskIoAttribution )
      v8 = DiskIoAttribution[3];
    ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&stru_140C452E0 + 278);
    __writecr8(v14);
    if( DiskIoAttribution )
    {
      IopSetDiskIoAttributionExtension(Irp, v8);
      v9 = v15;
      if( v15 >= 0 )
        v9 = 0;
    }
    else
    {
      v9 = -1073741275;
    }
  }
  else
  {
    v9 = -1073741275;
  }
  if( v9 >= 0 )
    goto LABEL_15;
LABEL_8:
  if( v4 )
    ObDereferenceObjectDeferDelete((UINT64)WorkOnBehalfThread);
  return v9;
}

Referenced by:

IoAsynchronousPageWrite
IoSetIoAttributionIrp
IoSynchronousPageWriteEx
IopBuildAsynchronousFsdRequest
IopSynchronousServiceTail