NtSetTimer
NTSTATUS __stdcall NtSetTimer(
_HANDLE TimerHandle,
PLARGE_INTEGER DueTime,
PTIMER_APC_ROUTINE TimerApcRoutine,
PVOID TimerContext,
BOOL WakeTimer,
_LONG Period,
PBOOLEAN PreviousState){
_LARGE_INTEGER *v9;
char v10;
char PreviousMode;
__int64 v12;
BOOL v13;
_DIAGNOSTIC_CONTEXT *v14;
NTSTATUS v15;
NTSTATUS v16;
NTSTATUS result;
INT64 a7;
VOID *TimerContexta;
_DIAGNOSTIC_CONTEXT *WakeReason;
INT64 v21;
LONGLONG v22;
UINT64 a6[2];
VOID *TimerHandlea;
TimerHandlea = *(VOID **)&TimerHandle;
v9 = DueTime;
v22 = 0i64;
LOBYTE(v21) = 0;
a6[0] = 0i64;
v10 = 0;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
v12 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)DueTime < 0x7FFFFFFF0000i64 )
v12 = (__int64)DueTime;
v22 = *(_QWORD *)v12;
v9 = (_LARGE_INTEGER *)&v22;
a6[1] = (UINT64)&v22;
v13 = WakeTimer;
}
else
{
v13 = WakeTimer;
if( WakeTimer && PoPowerDownActionInProgress )
v10 = 1;
}
if( Period < 0 )
return -1073741580;
if( !v13
|| v10
|| (result = PoCaptureReasonContext(0i64, PreviousMode, 0i64, 1u, (UINT8 *)&v21, (_DIAGNOSTIC_CONTEXT **)a6),
result >= 0) )
{
LODWORD(WakeReason) = 0;
LODWORD(TimerContexta) = Period;
LOBYTE(a7) = v21;
v14 = (_DIAGNOSTIC_CONTEXT *)a6[0];
v15 = ExpSetTimer(
TimerHandlea,
PreviousMode,
v9,
TimerApcRoutine,
TimerContext,
a6[0],
a7,
TimerContexta,
WakeReason,
(INT64)PreviousState,
v21,
v22,
(UINT8 *)a6[0]);
v16 = v15;
if( (v15 < 0 || v15 == 1073741861) && v14 )
PoDestroyReasonContext(v14);
if( v16 >= 0 )
{
if( v10 )
return 1073741861;
}
return v16;
}
return result;
}Referenced by:
No references.