IoDiskIoAttributionAllocate

VOID *__stdcall IoDiskIoAttributionAllocate(VOID *OwnerHandle, VOID *ParentIoAttributionContext){
  VOID *result; 
  _EX_RUNDOWN_REF *v5; 
  signed __int64 v6; 

  result = ExAllocatePoolWithTag(0x200ui64, 0xB8ui64, 1095003977i64);
  v5 = (_EX_RUNDOWN_REF *)result;
  if( result )
  {
    memset(result, 0i64, 0xB8u);
    v5[2].Count = -1i64;
    v5[4].Count = 1i64;
    do
    {
      v6 = _InterlockedExchangeAdd64((_QWORD *)&stru_140C452E0 + 138, 1ui64);
      v5[3].Count = v6 + 1;
    }
    while( v6 == -1 );
    ExInitializePushLock(&v5[21].Count);
    if( OwnerHandle )
      v5[20].Count = (unsigned __int64)OwnerHandle;
    else
      ExWaitForRundownProtectionRelease(v5 + 21);
    if( ParentIoAttributionContext )
    {
      IoDiskIoAttributionReference(ParentIoAttributionContext);
      v5[22].Count = (unsigned __int64)ParentIoAttributionContext;
    }
    return v5;
  }
  return result;
}

Referenced by:

PspIoRateEntryActivate
PspSetJobIoAttribution