KeQueryUnbiasedInterruptTimePrecise
UINT64 __stdcall KeQueryUnbiasedInterruptTimePrecise(UINT64 *QpcTimeStamp){
__int64 v2;
unsigned __int64 TimeUpdateLock;
unsigned __int64 BaselineInterruptTimeQpc;
__int64 v5;
LARGE_INTEGER PerformanceCounter;
__int64 v7;
volatile unsigned __int64 InterruptTimeBias;
do
{
v2 = 0i64;
InterruptTimeBias = KUSER_SHARED_DATA.InterruptTimeBias;
while( 1 )
{
TimeUpdateLock = KUSER_SHARED_DATA.TimeUpdateLock;
if( (KUSER_SHARED_DATA.TimeUpdateLock & 1) == 0 )
{
BaselineInterruptTimeQpc = KUSER_SHARED_DATA.BaselineInterruptTimeQpc;
v5 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
PerformanceCounter = KeQueryPerformanceCounter(0i64);
if( KUSER_SHARED_DATA.TimeUpdateLock == TimeUpdateLock )
break;
}
_mm_pause();
}
*QpcTimeStamp = PerformanceCounter.QuadPart;
if( PerformanceCounter.QuadPart > BaselineInterruptTimeQpc )
{
v7 = PerformanceCounter.QuadPart - BaselineInterruptTimeQpc - 1;
if( KUSER_SHARED_DATA.QpcInterruptTimeIncrementShift )
v7 <<= KUSER_SHARED_DATA.QpcInterruptTimeIncrementShift;
v2 = ((unsigned __int64)v7 * (unsigned __int128)KUSER_SHARED_DATA.QpcInterruptTimeIncrement) >> 64;
}
}
while( InterruptTimeBias != KUSER_SHARED_DATA.InterruptTimeBias );
return v2 + v5 - InterruptTimeBias;
}Referenced by:
IoDiskIoAttributionQuery