Zebediah Figura : ntoskrnl.exe: Implement KeSetTimerEx() and waiting on timers.

Alexandre Julliard julliard at winehq.org
Wed Nov 28 14:11:48 CST 2018


Module: wine
Branch: master
Commit: 55778f4d8a08d4cff746752acafff587d2546471
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=55778f4d8a08d4cff746752acafff587d2546471

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Nov 27 19:43:06 2018 -0600

ntoskrnl.exe: Implement KeSetTimerEx() and waiting on timers.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c |  9 ---------
 dlls/ntoskrnl.exe/sync.c     | 31 +++++++++++++++++++++++++++++++
 include/ddk/wdm.h            |  1 +
 3 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index be63740..c7b1f43 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -3825,15 +3825,6 @@ void WINAPI IoInvalidateDeviceRelations( DEVICE_OBJECT *device_object, DEVICE_RE
 }
 
 /***********************************************************************
- *           KeSetTimerEx (NTOSKRNL.EXE.@)
- */
-BOOL WINAPI KeSetTimerEx( KTIMER *timer, LARGE_INTEGER duetime, LONG period, KDPC *dpc )
-{
-    FIXME("stub: %p %s %u %p\n", timer, wine_dbgstr_longlong(duetime.QuadPart), period, dpc);
-    return TRUE;
-}
-
-/***********************************************************************
  *           IoCreateFile (NTOSKRNL.EXE.@)
  */
 NTSTATUS WINAPI IoCreateFile(HANDLE *handle, ACCESS_MASK access, OBJECT_ATTRIBUTES *attr,
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 910572b..06db1de 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -94,6 +94,9 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
                     semaphore->Header.SignalState, semaphore->Limit, NULL );
                 break;
             }
+            case TYPE_MANUAL_TIMER:
+            case TYPE_AUTO_TIMER:
+                break;
             }
         }
 
@@ -111,6 +114,7 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
             switch (objs[i]->Type)
             {
             case TYPE_AUTO_EVENT:
+            case TYPE_AUTO_TIMER:
                 objs[i]->SignalState = FALSE;
                 break;
             case TYPE_MUTEX:
@@ -317,3 +321,30 @@ void WINAPI KeInitializeTimer( KTIMER *timer )
 {
     KeInitializeTimerEx(timer, NotificationTimer);
 }
+
+/***********************************************************************
+ *           KeSetTimerEx (NTOSKRNL.EXE.@)
+ */
+BOOLEAN WINAPI KeSetTimerEx( KTIMER *timer, LARGE_INTEGER duetime, LONG period, KDPC *dpc )
+{
+    BOOL manual = timer->Header.Type == TYPE_MANUAL_TIMER;
+    BOOL ret;
+
+    TRACE("timer %p, duetime %s, period %d, dpc %p.\n",
+        timer, wine_dbgstr_longlong(duetime.QuadPart), period, dpc);
+
+    if (dpc)
+    {
+        FIXME("Unhandled DPC %p.\n", dpc);
+        return FALSE;
+    }
+
+    EnterCriticalSection( &sync_cs );
+    ret = timer->Header.Inserted;
+    timer->Header.Inserted = TRUE;
+    timer->Header.WaitListHead.Blink = CreateWaitableTimerW( NULL, manual, NULL );
+    SetWaitableTimer( timer->Header.WaitListHead.Blink, &duetime, period, NULL, NULL, FALSE );
+    LeaveCriticalSection( &sync_cs );
+
+    return ret;
+}
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 2b773b2..8472b09 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -1435,6 +1435,7 @@ LONG      WINAPI KeResetEvent(PRKEVENT);
 LONG      WINAPI KeSetEvent(PRKEVENT,KPRIORITY,BOOLEAN);
 KPRIORITY WINAPI KeSetPriorityThread(PKTHREAD,KPRIORITY);
 void      WINAPI KeSetSystemAffinityThread(KAFFINITY);
+BOOLEAN   WINAPI KeSetTimerEx(KTIMER*,LARGE_INTEGER,LONG,KDPC*);
 NTSTATUS  WINAPI KeWaitForMultipleObjects(ULONG,void*[],WAIT_TYPE,KWAIT_REASON,KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*,KWAIT_BLOCK*);
 NTSTATUS  WINAPI KeWaitForSingleObject(void*,KWAIT_REASON,KPROCESSOR_MODE,BOOLEAN,LARGE_INTEGER*);
 




More information about the wine-cvs mailing list