NtCreateTimer

NTSTATUS __stdcall NtCreateTimer(
        VOID **TimerHandle,
        _ACCESS_MASK DesiredAccess,
        POBJECT_ATTRIBUTES ObjectAttributes,
        _TIMER_TYPE TimerType,
        VOID *a5){
  INT8 v5; 
  VOID **v6; 
  char PreviousMode; 
  int inserted; 
  _QWORD *v9; 
  INT64 v10; 
  _EPROCESS *Process; 
  _EJOB *volatile Job; 
  _ETHREAD *CurrentThread; 
  __int64 v15; 
  VOID *Flags; 
  UINT64 Flagsa; 
  UINT64 ObjectBodySize; 
  UINT64 PagedPoolCharge; 
  UINT64 NonPagedPoolCharge; 
  PVOID DeferredContext; 
  PVOID Handle; 
  __int64 v23; 

  v5 = TimerType;
  v6 = TimerHandle;
  DeferredContext = 0i64;
  Handle = 0i64;
  if( (unsigned int)TimerType > SynchronizationTimer )
    return -1073741582;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    TimerHandle = (VOID **)0x7FFFFFFF0000i64;
    if( (unsigned __int64)v6 < 0x7FFFFFFF0000i64 )
      TimerHandle = v6;
    *TimerHandle = *TimerHandle;
  }
  LODWORD(NonPagedPoolCharge) = 0;
  LODWORD(PagedPoolCharge) = 0;
  LODWORD(ObjectBodySize) = 328;
  LOBYTE(TimerType) = PreviousMode;
  LOBYTE(TimerHandle) = PreviousMode;
  inserted = ObCreateObjectEx(
               (UINT64)TimerHandle,
               ExTimerObjectType,
               ObjectAttributes,
               *(UINT64 *)&TimerType,
               Flags,
               ObjectBodySize,
               PagedPoolCharge,
               NonPagedPoolCharge,
               &DeferredContext,
               0i64);
  if( inserted >= 0 )
  {
    v9 = DeferredContext;
    KeInitializeDpc((PRKDPC)((char *)DeferredContext + 160), (PKDEFERRED_ROUTINE)ExpTimerDpcRoutine, DeferredContext);
    KeInitializeTimerEx((INT64)v9, v5);
    v9[8] = 0i64;
    *((_BYTE *)v9 + 304) = 0;
    v9[32] = 0i64;
    v9[33] = 0i64;
    v23 = (__int64)(v9 + 35);
    v9[35] = 0i64;
    if( PreviousMode )
    {
      Process = KeGetCurrentThread()->ApcState.Process;
      if( (Process->Pcb._bf_0 & 0x10) != 0 )
      {
        Job = Process->Job;
        if( Job )
        {
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          --CurrentThread->Tcb.SpecialApcDisable;
          v15 = (__int64)Job + 56;
          ExAcquireResourceExclusiveLite((UINT64)Job + 56, 1, v10);
        }
        else
        {
          v15 = 56i64;
        }
        v9 = DeferredContext;
        PsInsertVirtualizedTimer(Process, v23);
        if( Job )
        {
          ExReleaseResourceLite((PERESOURCE)v15);
          KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
          v9 = DeferredContext;
        }
      }
      else
      {
        v9 = DeferredContext;
      }
    }
    LODWORD(Flagsa) = 0;
    inserted = ObInsertObjectEx(v9, 0i64, (unsigned int)DesiredAccess, 0i64, Flagsa, 0i64, &Handle);
    if( inserted >= 0 )
      *v6 = Handle;
  }
  return inserted;
}

Referenced by:

No references.