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