From a1b2032688ac47e84e538c0c67734e9fcffb7724 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 9 Apr 2017 08:47:10 +0000 Subject: [PATCH] [SCHEDSVC] Implement storing and loading of jobs in the registry. svn path=/trunk/; revision=74288 --- reactos/base/services/schedsvc/CMakeLists.txt | 1 + reactos/base/services/schedsvc/precomp.h | 48 ++++++++++++++++++ reactos/base/services/schedsvc/rpcserver.c | 49 ++++++++++--------- reactos/base/services/schedsvc/schedsvc.c | 16 +++++- 4 files changed, 89 insertions(+), 25 deletions(-) diff --git a/reactos/base/services/schedsvc/CMakeLists.txt b/reactos/base/services/schedsvc/CMakeLists.txt index d9200b29776..aef862da15e 100644 --- a/reactos/base/services/schedsvc/CMakeLists.txt +++ b/reactos/base/services/schedsvc/CMakeLists.txt @@ -4,6 +4,7 @@ add_rpc_files(server ${REACTOS_SOURCE_DIR}/sdk/include/reactos/idl/atsvc.idl) spec2def(schedsvc.dll schedsvc.spec ADD_IMPORTLIB) add_library(schedsvc SHARED + job.c rpcserver.c schedsvc.c schedsvc.rc diff --git a/reactos/base/services/schedsvc/precomp.h b/reactos/base/services/schedsvc/precomp.h index 9f12c8c947a..d068608cc8f 100644 --- a/reactos/base/services/schedsvc/precomp.h +++ b/reactos/base/services/schedsvc/precomp.h @@ -5,6 +5,7 @@ #define _INC_WINDOWS #define COM_NO_WINDOWS_H #include +#include #include #include #include @@ -16,9 +17,56 @@ #include +NTSYSAPI +ULONG +NTAPI +RtlRandomEx( + PULONG Seed); + +typedef struct _JOB +{ + LIST_ENTRY JobEntry; + + LIST_ENTRY StartEntry; + LARGE_INTEGER StartTime; + WCHAR Name[9]; + + DWORD JobId; + DWORD_PTR JobTime; + DWORD DaysOfMonth; + UCHAR DaysOfWeek; + UCHAR Flags; + WCHAR Command[1]; +} JOB, *PJOB; + +#define DWORD_MAX 0xffffffffUL + +extern DWORD dwNextJobId; +extern DWORD dwJobCount; + extern LIST_ENTRY JobListHead; extern RTL_RESOURCE JobListLock; +extern LIST_ENTRY StartListHead; +extern RTL_RESOURCE StartListLock; + + +/* job.c */ + +LONG +SaveJob( + PJOB pJob); + +LONG +DeleteJob( + PJOB pJob); + +LONG +LoadJobs(VOID); + + +/* rpcserver.c */ + DWORD WINAPI RpcThreadRoutine( diff --git a/reactos/base/services/schedsvc/rpcserver.c b/reactos/base/services/schedsvc/rpcserver.c index f35180201cd..8fc5cc821dc 100644 --- a/reactos/base/services/schedsvc/rpcserver.c +++ b/reactos/base/services/schedsvc/rpcserver.c @@ -32,25 +32,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(schedsvc); -#define DWORD_MAX 0xffffffffUL - -typedef struct _JOB -{ - LIST_ENTRY Entry; - DWORD JobId; - - DWORD_PTR JobTime; - DWORD DaysOfMonth; - UCHAR DaysOfWeek; - UCHAR Flags; - WCHAR Command[1]; -} JOB, *PJOB; - -DWORD dwNextJobId = 0; -DWORD dwJobCount = 0; -LIST_ENTRY JobListHead; -RTL_RESOURCE JobListLock; - /* FUNCTIONS *****************************************************************/ @@ -132,11 +113,20 @@ NetrJobAdd( dwJobCount++; /* Append the new job to the job list */ - InsertTailList(&JobListHead, &pJob->Entry); + InsertTailList(&JobListHead, &pJob->JobEntry); /* Release the job list lock */ RtlReleaseResource(&JobListLock); + /* Save the job in the registry */ + SaveJob(pJob); + + // Calculate start time + + // Insert job into start list + + // Update start timer + /* Return the new job ID */ *pJobId = pJob->JobId; @@ -158,16 +148,27 @@ NetrJobDel( TRACE("NetrJobDel(%S %lu %lu)\n", ServerName, MinJobId, MaxJobId); + /* Check the job IDs */ + if (MinJobId > MaxJobId) + return ERROR_INVALID_PARAMETER; + /* Acquire the job list lock exclusively */ RtlAcquireResourceExclusive(&JobListLock, TRUE); JobEntry = JobListHead.Flink; while (JobEntry != &JobListHead) { - CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry); + CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry); if ((CurrentJob->JobId >= MinJobId) && (CurrentJob->JobId <= MaxJobId)) { + // Remove job from start list + + // Update start timer + + /* Remove the job from the registry */ + DeleteJob(CurrentJob); + NextEntry = JobEntry->Flink; if (RemoveEntryList(JobEntry)) { @@ -234,7 +235,7 @@ NetrJobEnum( JobEntry = JobListHead.Flink; while (JobEntry != &JobListHead) { - CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry); + CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry); if (dwIndex >= dwStartIndex) { @@ -275,7 +276,7 @@ NetrJobEnum( JobEntry = JobListHead.Flink; while (JobEntry != &JobListHead) { - CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry); + CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry); if (dwIndex >= dwStartIndex) { @@ -342,7 +343,7 @@ NetrJobGetInfo( JobEntry = JobListHead.Flink; while (JobEntry != &JobListHead) { - CurrentJob = CONTAINING_RECORD(JobEntry, JOB, Entry); + CurrentJob = CONTAINING_RECORD(JobEntry, JOB, JobEntry); /* Do we have the right job? */ if (CurrentJob->JobId == JobId) diff --git a/reactos/base/services/schedsvc/schedsvc.c b/reactos/base/services/schedsvc/schedsvc.c index fa64969c6e1..824a1cd908c 100644 --- a/reactos/base/services/schedsvc/schedsvc.c +++ b/reactos/base/services/schedsvc/schedsvc.c @@ -21,7 +21,7 @@ * PROJECT: ReactOS Services * FILE: base/services/schedsvc/schedsvc.c * PURPOSE: Scheduling service - * PROGRAMMER: Eric Kohl + * PROGRAMMER: Eric Kohl */ /* INCLUDES *****************************************************************/ @@ -99,6 +99,7 @@ ServiceControlHandler(DWORD dwControl, case SERVICE_CONTROL_SHUTDOWN: TRACE(" SERVICE_CONTROL_SHUTDOWN received\n"); UpdateServiceStatus(SERVICE_STOP_PENDING); + RpcMgmtStopServerListening(NULL); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; @@ -114,6 +115,7 @@ DWORD ServiceInit(VOID) { HANDLE hThread; + DWORD dwError; /* Initialize the job list */ InitializeListHead(&JobListHead); @@ -121,6 +123,18 @@ ServiceInit(VOID) /* Initialize the job list lock */ RtlInitializeResource(&JobListLock); + /* Initialize the start list */ + InitializeListHead(&StartListHead); + + /* Initialize the start list lock */ + RtlInitializeResource(&StartListLock); + + /* Load stored jobs from the registry */ + dwError = LoadJobs(); + if (dwError != ERROR_SUCCESS) + return dwError; + + /* Start the RPC thread */ hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RpcThreadRoutine, -- 2.17.1