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