MiCheckAndUpdateIoAttribution
VOID __fastcall MiCheckAndUpdateIoAttribution(INT64 a1){
_ETHREAD *CurrentThread;
__int64 v2;
__int64 v3;
unsigned __int64 v4;
PVOID v5;
KIRQL v6;
__int64 v7;
unsigned __int64 v8;
unsigned __int64 v9;
__int64 v10;
PVOID OpaqueContext;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v2 = *(_QWORD *)(a1 + 16);
OpaqueContext = 0i64;
if( qword_140C4DC80 && (v2 & 0x10) == 0 )
v2 &= ~qword_140C4DC80;
v3 = *(_QWORD *)(v2 >> 16);
if( (*(_DWORD *)(v3 + 56) & 0x20) == 0 && IoReferenceIoAttributionFromThread(CurrentThread, &OpaqueContext) >= 0 )
{
v4 = (unsigned __int64)OpaqueContext;
if( OpaqueContext == (PVOID)(8i64 * *(_QWORD *)(v3 + 120)) )
{
v5 = OpaqueContext;
}
else
{
v6 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v3 + 72));
v7 = *(_QWORD *)(v3 + 120);
v8 = v6;
v9 = v7 & 0xE000000000000000ui64;
v10 = 8 * v7;
*(_QWORD *)(v3 + 120) = (v4 >> 3) | v9;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v8);
if( !v10 )
return;
v5 = (PVOID)v10;
}
IoDiskIoAttributionDereference(v5);
}
}Referenced by:
MiCompleteProtoPteFault
MiValidFault