StEtaIoStart

INT64 __fastcall StEtaIoStart(LARGE_INTEGER *a1, UINT64 a2, INT64 a3, UINT64 a4){
  unsigned int v4; 
  __int64 v5; 
  UINT64 v6; 
  LARGE_INTEGER v8; 
  unsigned __int32 v9; 
  signed __int32 HighPart; 
  int v11; 
  signed __int32 v12; 
  bool v13; 
  unsigned __int16 v14; 
  unsigned __int16 v15; 
  v4 = 0;
  v5 = (int)a3;
  v6 = a4;
  v8 = a1[(int)a3 + 2];
  if( (a4 & 1) != 0 )
  {
    v6 = a4 & 0xFFFFFFFFFFFFFFFEui64;
    while( *(_DWORD *)v8.QuadPart < (unsigned int)a2 )
      v8.QuadPart += 32i64;
  }
  else
  {
    while( *(_DWORD *)v8.QuadPart < (unsigned int)a2 )
      v8.QuadPart += 32i64;
    *(_WORD *)(v8.QuadPart + 4) = 0;
  }
  v9 = *(_DWORD *)(v8.QuadPart + 8);
  HighPart = a1[1].HighPart;
  v11 = _InterlockedIncrement((volatile signed __int32 *)&a1[1]);
  if( v11 == 1 )
  {
    *a1 = KeQueryPerformanceCounter(0i64);
    v12 = _InterlockedCompareExchange(&a1[1].HighPart, v9, HighPart);
    if( HighPart != v12 )
    {
      v13 = v12 <= HighPart;
      do
      {
        if( !v13 )
          v9 += v12 - HighPart;
        HighPart = v12;
        v12 = _InterlockedCompareExchange(&a1[1].HighPart, v9, v12);
        v13 = v12 <= HighPart;
      }
      while( v12 != HighPart );
      return v4;
    }
  }
  else
  {
    _InterlockedExchangeAdd(&a1[1].HighPart, v9);
    if( v11 > 1 )
      return v4;
  }
  v14 = *(_WORD *)(v8.QuadPart + 6) + 1;
  *(_WORD *)(v8.QuadPart + 6) = v14;
  if( v14 < *((_WORD *)&a1[4].LowPart + 2 * v5)
    || (v15 = *((_WORD *)&a1[4].u.LowPart + 2 * v5 + 1)) != 0 && (v15 & v14) == 0 )
  {
    *(LARGE_INTEGER *)(v8.QuadPart + 16) = KeQueryPerformanceCounter(0i64);
    v4 = 1;
    *(_QWORD *)(v8.QuadPart + 24) = v6;
  }
  return v4;
}

Referenced by:

ST_STORE::StDeviceIoIssue
ST_STORE::StStagingRegionIssueIo