Dmitry Timoshkov : schedsvc: Add a thread for monitoring version 1 task files.

Alexandre Julliard julliard at winehq.org
Tue Apr 17 14:53:58 CDT 2018


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Tue Apr 17 15:12:03 2018 +0800

schedsvc: Add a thread for monitoring version 1 task files.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/schedsvc/svc_main.c | 73 +++++++++++++++++++++++++++++++++++++++++++++---
 loader/wine.inf.in       |  1 +
 2 files changed, 70 insertions(+), 4 deletions(-)

diff --git a/dlls/schedsvc/svc_main.c b/dlls/schedsvc/svc_main.c
index 8713bdb..3de0253 100644
--- a/dlls/schedsvc/svc_main.c
+++ b/dlls/schedsvc/svc_main.c
@@ -36,6 +36,66 @@ static const WCHAR scheduleW[] = {'S','c','h','e','d','u','l','e',0};
 static SERVICE_STATUS_HANDLE schedsvc_handle;
 static HANDLE done_event;
 
+static DWORD WINAPI tasks_monitor_thread(void *arg)
+{
+    static const WCHAR tasksW[] = { '\\','T','a','s','k','s','\\',0 };
+    WCHAR path[MAX_PATH];
+    HANDLE htasks;
+    OVERLAPPED ov;
+
+    TRACE("Starting...\n");
+
+    GetWindowsDirectoryW(path, MAX_PATH);
+    lstrcatW(path, tasksW);
+
+    htasks = CreateFileW(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                         NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
+    if (htasks == INVALID_HANDLE_VALUE) return -1;
+
+    memset(&ov, 0, sizeof(ov));
+    ov.hEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+    for (;;)
+    {
+        struct
+        {
+            FILE_NOTIFY_INFORMATION data;
+            WCHAR name_buffer[MAX_PATH];
+        } info;
+        HANDLE events[2];
+        DWORD ret;
+
+        /* the buffer must be DWORD aligned */
+        C_ASSERT(!(sizeof(info) & 3));
+
+        memset(&info, 0, sizeof(info));
+
+        ret = ReadDirectoryChangesW(htasks, &info, sizeof(info), FALSE,
+                                    FILE_NOTIFY_CHANGE_FILE_NAME, NULL, &ov, NULL);
+        if (!ret) break;
+
+        events[0] = done_event;
+        events[1] = ov.hEvent;
+
+        ret = WaitForMultipleObjects(2, events, FALSE, INFINITE);
+        if (ret == WAIT_OBJECT_0) break;
+
+        switch (info.data.Action)
+        {
+        default:
+            FIXME("%s: action %#x not handled\n", debugstr_w(info.data.FileName), info.data.Action);
+            break;
+        }
+    }
+
+    CloseHandle(ov.hEvent);
+    CloseHandle(htasks);
+
+    TRACE("Finished.\n");
+
+    return 0;
+}
+
 void schedsvc_auto_start(void)
 {
     static DWORD start_type;
@@ -201,6 +261,9 @@ static void RPC_finish(void)
 
 void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
 {
+    HANDLE thread;
+    DWORD tid;
+
     TRACE("starting Task Scheduler Service\n");
 
     schedsvc_handle = RegisterServiceCtrlHandlerW(scheduleW, schedsvc_handler);
@@ -210,14 +273,16 @@ void WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
         return;
     }
 
-    done_event = CreateEventW(NULL, TRUE, FALSE, NULL);
-
     schedsvc_update_status(SERVICE_START_PENDING);
 
-    if (RPC_init() == RPC_S_OK)
+    done_event = CreateEventW(NULL, TRUE, FALSE, NULL);
+    thread = CreateThread(NULL, 0, tasks_monitor_thread, NULL, 0, &tid);
+
+    if (thread && RPC_init() == RPC_S_OK)
     {
         schedsvc_update_status(SERVICE_RUNNING);
-        WaitForSingleObject(done_event, INFINITE);
+        WaitForSingleObject(thread, INFINITE);
+        CloseHandle(thread);
         RPC_finish();
     }
 
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 0df7622..627c6ef 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -2579,6 +2579,7 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G"
 10,help,
 10,inf,
 10,logs,
+10,tasks,
 10,temp,
 11,catroot,
 11,mui,




More information about the wine-cvs mailing list