From 2eb6f886708f83dea275d0ba14305a51de443f40 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Tue, 17 Apr 2018 15:12:03 +0800 Subject: [PATCH] schedsvc: Add a thread for monitoring version 1 task files. Signed-off-by: Dmitry Timoshkov Signed-off-by: Alexandre Julliard --- 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 8713bdb88a0..3de025335c8 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 0df762245a1..627c6ef56c1 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,