IopRecordIoAttribution

INT64 __fastcall IopRecordIoAttribution(UINT64 *a1, INT64 a2, CHAR a3){
  unsigned int v3; 
  int v5; 
  int v8; 
  UINT64 *v9; 
  UINT64 v10; 
  UINT64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  UINT64 v14; 
  UINT64 v15; 
  UINT64 v16; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  v3 = 0;
  v5 = *(_DWORD *)(a2 + 4);
  memset(&LockHandle, 0, sizeof(LockHandle));
  v8 = 0;
  if( (unsigned __int8)v5 == 3 )
  {
    v9 = a1 + 10;
    goto LABEL_4;
  }
  if( (unsigned __int8)v5 == 4 )
  {
    v9 = a1 + 15;
LABEL_4:
    v10 = *(_QWORD *)(a2 + 24);
    v11 = 0i64;
    v12 = 0i64;
    if( (a3 & 2) == 0 )
    {
      KeAcquireInStackQueuedSpinLock(a1 + 5, &LockHandle);
      v5 = *(_DWORD *)(a2 + 4);
      v11 = 0i64;
      v8 = 1;
    }
    if( (v5 & 0x100) != 0 )
    {
      v16 = a1[9];
      if( !v16 || v10 < a1[8] )
        a1[8] = v10;
      a1[9] = v16 + 1;
      ++*v9;
    }
    else
    {
      if( (a3 & 1) == 0 )
      {
        --a1[9];
        --*v9;
        v5 = *(_DWORD *)(a2 + 4);
      }
      if( (v5 & 0x200) == 0 )
      {
        v13 = a1[6];
        v14 = *(_QWORD *)(a2 + 16);
        if( v13 <= v14 )
          v13 = *(_QWORD *)(a2 + 16);
        if( v10 >= v13 )
        {
          a1[6] = v10;
          v14 = *(_QWORD *)(a2 + 16);
          v11 = v10 - v13;
        }
        v10 = v14;
      }
      v15 = a1[7];
      if( v15 <= a1[8] )
        v15 = a1[8];
      if( v10 >= v15 )
      {
        a1[7] = v10;
        v12 = v10 - v15;
      }
      v9[1] += v12;
      if( (*(_DWORD *)(a2 + 4) & 0x200) == 0 )
      {
        v9[2] += v11;
        v9[3] += *(unsigned int *)(a2 + 8);
        v9[4] += (IopDiskIoAttributionBaseIoSize + *(_DWORD *)(a2 + 8) - 1)
               / (unsigned int)IopDiskIoAttributionBaseIoSize;
      }
    }
    if( v8 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
    }
    return v3;
  }
  if( (a3 & 1) == 0 )
    return(unsigned int)-1073741637;
  v9 = a1 + 10;
  if( a1[10] )
    goto LABEL_4;
  v9 = a1 + 15;
  if( a1[15] )
    goto LABEL_4;
  return v3;
}

Referenced by:

IoDiskIoAttributionQuery
IoRecordIoAttribution