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