IopRecordIoAttribution

NTSTATUS __stdcall IopRecordIoAttribution(
        _IOP_DISK_IO_ATTRIBUTION_CONTEXT *DiskIoAttributionContext,
        _IO_ATTRIBUTION_INFORMATION *AttributionInformation){
  char v2; 
  NTSTATUS v3; 
  __int32 bf_0; 
  char v6; 
  int v8; 
  _IOP_DISK_IO_ATTRIBUTION_CONTEXT *v9; 
  unsigned __int64 CurrentTime; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 ServiceStartTime; 
  unsigned __int64 v15; 
  __int64 v16; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v3 = 0;
  bf_0 = AttributionInformation->Flags._bf_0;
  v6 = v2;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v8 = 0;
  if( (unsigned __int8)bf_0 == 3 )
  {
    v9 = DiskIoAttributionContext + 20;
    goto LABEL_4;
  }
  if( (unsigned __int8)bf_0 == 4 )
  {
    v9 = DiskIoAttributionContext + 30;
LABEL_4:
    CurrentTime = AttributionInformation->CurrentTime;
    v11 = 0i64;
    v12 = 0i64;
    if( (v6 & 2) == 0 )
    {
      KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)DiskIoAttributionContext + 5, &LockHandle);
      bf_0 = AttributionInformation->Flags._bf_0;
      v11 = 0i64;
      v8 = 1;
    }
    if( (bf_0 & 0x100) != 0 )
    {
      v16 = *((_QWORD *)DiskIoAttributionContext + 9);
      if( !v16 || CurrentTime < *((_QWORD *)DiskIoAttributionContext + 8) )
        *((_QWORD *)DiskIoAttributionContext + 8) = CurrentTime;
      *((_QWORD *)DiskIoAttributionContext + 9) = v16 + 1;
      ++*(_QWORD *)v9;
    }
    else
    {
      if( (v6 & 1) == 0 )
      {
        --*((_QWORD *)DiskIoAttributionContext + 9);
        --*(_QWORD *)v9;
        bf_0 = AttributionInformation->Flags._bf_0;
      }
      if( (bf_0 & 0x200) == 0 )
      {
        v13 = *((_QWORD *)DiskIoAttributionContext + 6);
        ServiceStartTime = AttributionInformation->ServiceStartTime;
        if( v13 <= ServiceStartTime )
          v13 = AttributionInformation->ServiceStartTime;
        if( CurrentTime >= v13 )
        {
          *((_QWORD *)DiskIoAttributionContext + 6) = CurrentTime;
          ServiceStartTime = AttributionInformation->ServiceStartTime;
          v11 = CurrentTime - v13;
        }
        CurrentTime = ServiceStartTime;
      }
      v15 = *((_QWORD *)DiskIoAttributionContext + 7);
      if( v15 <= *((_QWORD *)DiskIoAttributionContext + 8) )
        v15 = *((_QWORD *)DiskIoAttributionContext + 8);
      if( CurrentTime >= v15 )
      {
        *((_QWORD *)DiskIoAttributionContext + 7) = CurrentTime;
        v12 = CurrentTime - v15;
      }
      *((_QWORD *)v9 + 1) += v12;
      if( (AttributionInformation->Flags._bf_0 & 0x200) == 0 )
      {
        *((_QWORD *)v9 + 2) += v11;
        *((_QWORD *)v9 + 3) += AttributionInformation->Length;
        *((_QWORD *)v9 + 4) += (IopDiskIoAttributionBaseIoSize + AttributionInformation->Length - 1)
                             / IopDiskIoAttributionBaseIoSize;
      }
    }
    if( v8 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
    }
    return v3;
  }
  if( (v6 & 1) == 0 )
    return -1073741637;
  v9 = DiskIoAttributionContext + 20;
  if( *((_QWORD *)DiskIoAttributionContext + 10) )
    goto LABEL_4;
  v9 = DiskIoAttributionContext + 30;
  if( *((_QWORD *)DiskIoAttributionContext + 15) )
    goto LABEL_4;
  return v3;
}

Referenced by:

IoDiskIoAttributionQuery
IoRecordIoAttribution