NtCreateTimer2
NTSTATUS __stdcall NtCreateTimer2(
VOID **TimerHandle,
VOID *Reserved1,
VOID *Reserved2,
UINT64 Attributes,
UINT64 DesiredAccess){
unsigned int v5;
UINT64 v7;
UINT64 v8;
_DWORD *v9;
char v10;
__int64 v11;
int inserted;
_QWORD *v13;
NTSTATUS result;
VOID *v15;
INT64 v16;
UINT64 ObjectBodySize;
PVOID *Handle;
UINT64 v19;
INT8 PreviousMode[4];
PVOID Object;
PVOID v22;
v5 = Attributes;
v22 = 0i64;
Object = 0i64;
if( !ExpExTimerAttributesAreValid((unsigned int)Attributes) )
return -1073741582;
if( v8 )
return -1073741583;
if( v9 && (v5 & 2) == 0 )
return -1073741584;
*(_DWORD *)PreviousMode = 0;
v10 = KeGetCurrentThread()->PreviousMode;
if( v10 )
{
v11 = 0x7FFFFFFF0000i64;
v7 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)TimerHandle < 0x7FFFFFFF0000i64 )
v7 = (UINT64)TimerHandle;
*(_QWORD *)v7 = *(_QWORD *)v7;
if( v9 )
{
if( (unsigned __int64)v9 < 0x7FFFFFFF0000i64 )
v11 = (__int64)v9;
*(_DWORD *)PreviousMode = *(_DWORD *)v11;
}
}
else if( v9 )
{
*(_DWORD *)PreviousMode = *v9;
}
if( (v5 & 2) == 0 || (result = ExpCheckIRTimerAccess(PreviousMode[0]), result >= 0) )
{
LODWORD(v19) = 0;
LODWORD(Handle) = 0;
LODWORD(ObjectBodySize) = 168;
LOBYTE(v8) = v10;
LOBYTE(v7) = v10;
inserted = ObCreateObjectEx(
v7,
ExpIRTimerObjectType,
0i64,
v8,
v15,
ObjectBodySize,
(UINT64)Handle,
v19,
&Object,
0i64);
if( inserted >= 0 )
{
v13 = Object;
if( (v5 & 2) != 0 )
{
LODWORD(v16) = v5;
KeInitializeIRTimer((INT64)Object, 0i64, 0i64, (UINT8 *)PreviousMode, v16);
}
else
{
KeInitializeTimer2((INT64)Object, 0i64, 0i64, v5);
}
v13[17] = 0i64;
*((_DWORD *)v13 + 40) = v5;
LODWORD(v16) = 0;
inserted = ObInsertObjectEx(v13, 0i64, (unsigned int)DesiredAccess, 0i64, v16, 0i64, &v22);
*(_DWORD *)PreviousMode = inserted;
if( inserted >= 0 )
*TimerHandle = v22;
}
return inserted;
}
return result;
}Referenced by:
NtCreateIRTimer