NtQueryTimer
NTSTATUS __stdcall NtQueryTimer(
VOID *TimerHandle,
_TIMER_INFORMATION_CLASS TimerInformationClass,
VOID *TimerInformation,
UINT64 TimerInformationLength,
UINT64 *ReturnLength){
char PreviousMode;
__int64 v9;
__int64 v10;
UINT64 *v11;
int v12;
int v13;
__int64 v14;
UINT64 v15;
PVOID Object;
if( TimerInformationClass )
return -1073741821;
if( (_DWORD)TimerInformationLength != 16 )
return -1073741820;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
if( ((unsigned __int8)TimerInformation & 3) != 0 )
ExRaiseDatatypeMisalignment();
v9 = 0x7FFFFFFF0000i64;
v10 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)TimerInformation < 0x7FFFFFFF0000i64 )
v10 = (__int64)TimerInformation;
*(_BYTE *)v10 = *(_BYTE *)v10;
*(_BYTE *)(v10 + 15) = *(_BYTE *)(v10 + 15);
v11 = ReturnLength;
if( ReturnLength )
{
if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
v9 = (__int64)ReturnLength;
*(_DWORD *)v9 = *(_DWORD *)v9;
}
}
else
{
v11 = ReturnLength;
}
Object = 0i64;
v12 = ObReferenceObjectByHandle(TimerHandle, 1ui64, ExTimerObjectType, PreviousMode, &Object, 0i64);
if( v12 >= 0 )
{
v13 = *((_DWORD *)Object + 1);
v14 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
v15 = KeQueryTimerDueTime((_KTIMER *)Object) - v14;
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
if( PreviousMode )
{
*((_BYTE *)TimerInformation + 8) = v13;
*(_QWORD *)TimerInformation = v15;
if( v11 )
*(_DWORD *)v11 = 16;
}
else
{
*((_BYTE *)TimerInformation + 8) = v13;
*(_QWORD *)TimerInformation = v15;
if( v11 )
*(_DWORD *)v11 = 16;
}
}
return v12;
}Referenced by:
No references.