ExpSetTimer
NTSTATUS __stdcall ExpSetTimer(
VOID *TimerHandle,
INT8 PreviousMode,
_LARGE_INTEGER *DueTime,
VOID *TimerApcRoutine,
VOID *a5,
UINT64 a6,
INT64 a7,
VOID *TimerContext,
_DIAGNOSTIC_CONTEXT *WakeReason,
INT64 WakeImportant,
UINT64 Period,
UINT64 TolerableDelay,
UINT8 *PreviousState){
NTSTATUS result;
_OBJECT_TYPE *v17;
UINT64 v18;
UINT64 v19;
UINT64 P2;
P2 = 0i64;
result = ObReferenceObjectByHandle(TimerHandle, 2ui64, 0i64, PreviousMode, (VOID **)&P2, 0i64);
if( result >= 0 )
{
v17 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ *(unsigned __int8 *)(P2 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)(P2 - 48) >> 8)];
if( v17 == ExpIRTimerObjectType )
{
if( TimerApcRoutine || a5 || a6 || (_DWORD)WakeReason || WakeImportant )
{
ObfDereferenceObjectWithTag((VOID *)P2, 0x746C6644ui64);
return -1073741811;
}
else
{
return ExpSetTimerObject2((PVOID)P2);
}
}
else if( v17 == ExTimerObjectType )
{
LODWORD(v19) = (_DWORD)WakeReason;
LODWORD(v18) = (_DWORD)TimerContext;
return ExpSetTimerObject(
P2,
PreviousMode,
(INT64 *)DueTime,
(INT32 *)TimerApcRoutine,
(INT64)a5,
a6,
a7,
v18,
v19,
(_BYTE *)WakeImportant);
}
else
{
ObfDereferenceObjectWithTag((VOID *)P2, 0x746C6644ui64);
return -1073741788;
}
}
return result;
}Referenced by:
NtSetTimer