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