mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[SCHEDSVC]
Add missing file. Sorry! svn path=/trunk/; revision=74290
This commit is contained in:
parent
7d242dfe4c
commit
d1fa8b8908
1 changed files with 347 additions and 0 deletions
347
reactos/base/services/schedsvc/job.c
Normal file
347
reactos/base/services/schedsvc/job.c
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS Services
|
||||||
|
* FILE: base/services/schedsvc/job.c
|
||||||
|
* PURPOSE: Scheduling service
|
||||||
|
* PROGRAMMER: Eric Kohl <eric.kohl@reactos.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(schedsvc);
|
||||||
|
|
||||||
|
|
||||||
|
/* GLOBALS ******************************************************************/
|
||||||
|
|
||||||
|
typedef struct _SCHEDULE
|
||||||
|
{
|
||||||
|
DWORD JobTime;
|
||||||
|
DWORD DaysOfMonth;
|
||||||
|
UCHAR DaysOfWeek;
|
||||||
|
UCHAR Flags;
|
||||||
|
WORD Reserved;
|
||||||
|
} SCHEDULE, PSCHEDULE;
|
||||||
|
|
||||||
|
DWORD dwNextJobId = 0;
|
||||||
|
DWORD dwJobCount = 0;
|
||||||
|
LIST_ENTRY JobListHead;
|
||||||
|
RTL_RESOURCE JobListLock;
|
||||||
|
|
||||||
|
LIST_ENTRY StartListHead;
|
||||||
|
RTL_RESOURCE StartListLock;
|
||||||
|
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
GetJobName(
|
||||||
|
HKEY hJobsKey,
|
||||||
|
PWSTR pszJobName)
|
||||||
|
{
|
||||||
|
WCHAR szNameBuffer[9];
|
||||||
|
FILETIME SystemTime;
|
||||||
|
ULONG ulSeed, ulValue;
|
||||||
|
HKEY hKey;
|
||||||
|
LONG lError;
|
||||||
|
|
||||||
|
GetSystemTimeAsFileTime(&SystemTime);
|
||||||
|
ulSeed = SystemTime.dwLowDateTime;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
ulValue = RtlRandomEx(&ulSeed);
|
||||||
|
swprintf(szNameBuffer, L"%08lx", ulValue);
|
||||||
|
|
||||||
|
hKey = NULL;
|
||||||
|
lError = RegOpenKeyEx(hJobsKey,
|
||||||
|
szNameBuffer,
|
||||||
|
0,
|
||||||
|
KEY_READ,
|
||||||
|
&hKey);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
wcscpy(pszJobName, szNameBuffer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LONG
|
||||||
|
SaveJob(
|
||||||
|
_In_ PJOB pJob)
|
||||||
|
{
|
||||||
|
SCHEDULE Schedule;
|
||||||
|
HKEY hJobsKey = NULL, hJobKey = NULL;
|
||||||
|
LONG lError;
|
||||||
|
|
||||||
|
TRACE("SaveJob()\n");
|
||||||
|
|
||||||
|
lError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
||||||
|
L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_WRITE,
|
||||||
|
NULL,
|
||||||
|
&hJobsKey,
|
||||||
|
NULL);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
GetJobName(hJobsKey, pJob->Name);
|
||||||
|
|
||||||
|
lError = RegCreateKeyExW(hJobsKey,
|
||||||
|
pJob->Name,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_WRITE,
|
||||||
|
NULL,
|
||||||
|
&hJobKey,
|
||||||
|
NULL);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
Schedule.JobTime = pJob->JobTime;
|
||||||
|
Schedule.DaysOfMonth = pJob->DaysOfMonth;
|
||||||
|
Schedule.DaysOfWeek = pJob->DaysOfWeek;
|
||||||
|
Schedule.Flags = pJob->Flags;
|
||||||
|
|
||||||
|
lError = RegSetValueEx(hJobKey,
|
||||||
|
L"Schedule",
|
||||||
|
0,
|
||||||
|
REG_BINARY,
|
||||||
|
(PBYTE)&Schedule,
|
||||||
|
sizeof(Schedule));
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
lError = RegSetValueEx(hJobKey,
|
||||||
|
L"Command",
|
||||||
|
0,
|
||||||
|
REG_SZ,
|
||||||
|
(PBYTE)pJob->Command,
|
||||||
|
(wcslen(pJob->Command) + 1) * sizeof(WCHAR));
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (hJobKey != NULL)
|
||||||
|
RegCloseKey(hJobKey);
|
||||||
|
|
||||||
|
if (hJobsKey != NULL)
|
||||||
|
RegCloseKey(hJobsKey);
|
||||||
|
|
||||||
|
return lError;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LONG
|
||||||
|
DeleteJob(
|
||||||
|
_In_ PJOB pJob)
|
||||||
|
{
|
||||||
|
HKEY hJobsKey = NULL;
|
||||||
|
LONG lError;
|
||||||
|
|
||||||
|
TRACE("DeleteJob()\n");
|
||||||
|
|
||||||
|
lError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
||||||
|
L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_WRITE,
|
||||||
|
NULL,
|
||||||
|
&hJobsKey,
|
||||||
|
NULL);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
lError = RegDeleteKey(hJobsKey,
|
||||||
|
pJob->Name);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (hJobsKey != NULL)
|
||||||
|
RegCloseKey(hJobsKey);
|
||||||
|
|
||||||
|
return lError;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LONG
|
||||||
|
LoadJobs(VOID)
|
||||||
|
{
|
||||||
|
SCHEDULE Schedule;
|
||||||
|
WCHAR szNameBuffer[32];
|
||||||
|
DWORD dwNameLength, dwIndex, dwSize;
|
||||||
|
HKEY hJobsKey = NULL, hJobKey = NULL;
|
||||||
|
PJOB pJob = NULL;
|
||||||
|
LONG lError;
|
||||||
|
|
||||||
|
TRACE("LoadJobs()\n");
|
||||||
|
|
||||||
|
lError = RegCreateKeyExW(HKEY_LOCAL_MACHINE,
|
||||||
|
L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_READ,
|
||||||
|
NULL,
|
||||||
|
&hJobsKey,
|
||||||
|
NULL);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
for (dwIndex = 0; dwIndex < 1000; dwIndex++)
|
||||||
|
{
|
||||||
|
dwNameLength = 32;
|
||||||
|
lError = RegEnumKeyEx(hJobsKey,
|
||||||
|
dwIndex,
|
||||||
|
szNameBuffer,
|
||||||
|
&dwNameLength,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
lError = ERROR_SUCCESS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("KeyName: %S\n", szNameBuffer);
|
||||||
|
|
||||||
|
lError = RegOpenKeyEx(hJobsKey,
|
||||||
|
szNameBuffer,
|
||||||
|
0,
|
||||||
|
KEY_READ,
|
||||||
|
&hJobKey);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
break;
|
||||||
|
|
||||||
|
dwSize = sizeof(SCHEDULE);
|
||||||
|
lError = RegQueryValueEx(hJobKey,
|
||||||
|
L"Schedule",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(PBYTE)&Schedule,
|
||||||
|
&dwSize);
|
||||||
|
if (lError == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
dwSize = 0;
|
||||||
|
RegQueryValueEx(hJobKey,
|
||||||
|
L"Command",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&dwSize);
|
||||||
|
if (dwSize != 0)
|
||||||
|
{
|
||||||
|
/* Allocate a new job object */
|
||||||
|
pJob = HeapAlloc(GetProcessHeap(),
|
||||||
|
HEAP_ZERO_MEMORY,
|
||||||
|
sizeof(JOB) + dwSize - sizeof(WCHAR));
|
||||||
|
if (pJob == NULL)
|
||||||
|
{
|
||||||
|
lError = ERROR_OUTOFMEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lError = RegQueryValueEx(hJobKey,
|
||||||
|
L"Command",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
(PBYTE)pJob->Command,
|
||||||
|
&dwSize);
|
||||||
|
if (lError != ERROR_SUCCESS)
|
||||||
|
break;
|
||||||
|
|
||||||
|
wcscpy(pJob->Name, szNameBuffer);
|
||||||
|
pJob->JobTime = Schedule.JobTime;
|
||||||
|
pJob->DaysOfMonth = Schedule.DaysOfMonth;
|
||||||
|
pJob->DaysOfWeek = Schedule.DaysOfWeek;
|
||||||
|
pJob->Flags = Schedule.Flags;
|
||||||
|
|
||||||
|
/* Acquire the job list lock exclusively */
|
||||||
|
RtlAcquireResourceExclusive(&JobListLock, TRUE);
|
||||||
|
|
||||||
|
/* Assign a new job ID */
|
||||||
|
pJob->JobId = dwNextJobId++;
|
||||||
|
dwJobCount++;
|
||||||
|
|
||||||
|
/* Append the new job to the job list */
|
||||||
|
InsertTailList(&JobListHead, &pJob->JobEntry);
|
||||||
|
|
||||||
|
/* Release the job list lock */
|
||||||
|
RtlReleaseResource(&JobListLock);
|
||||||
|
|
||||||
|
// Calculate start time
|
||||||
|
|
||||||
|
// Insert job into the start list
|
||||||
|
|
||||||
|
// Update the start timer
|
||||||
|
|
||||||
|
pJob = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hJobKey);
|
||||||
|
hJobKey = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (pJob != NULL)
|
||||||
|
HeapFree(GetProcessHeap(), 0, pJob);
|
||||||
|
|
||||||
|
if (hJobKey != NULL)
|
||||||
|
RegCloseKey(hJobKey);
|
||||||
|
|
||||||
|
if (hJobsKey != NULL)
|
||||||
|
RegCloseKey(hJobsKey);
|
||||||
|
|
||||||
|
return lError;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
VOID
|
||||||
|
CalculateNextStartTime(PJOB pJob)
|
||||||
|
{
|
||||||
|
SYSTEMTIME Time;
|
||||||
|
DWORD_PTR JobTime;
|
||||||
|
WORD wDay;
|
||||||
|
BOOL bToday = FALSE;
|
||||||
|
|
||||||
|
GetLocalTime(&Time);
|
||||||
|
|
||||||
|
Now = (DWORD_PTR)Time.wHour * 3600000 +
|
||||||
|
(DWORD_PTR)Time.wMinute * 60000;
|
||||||
|
if (pJob->JobTime > Now)
|
||||||
|
bToday = TRUE;
|
||||||
|
|
||||||
|
if (pJob->DaysOfMonth != 0)
|
||||||
|
{
|
||||||
|
wDay = 0;
|
||||||
|
for (i = Time.wDay - 1; i < 32; i++)
|
||||||
|
{
|
||||||
|
if (pJob->DaysOfMonth && (1 << i))
|
||||||
|
{
|
||||||
|
wDay = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ERR("Next day this month: %hu\n", wDay);
|
||||||
|
}
|
||||||
|
else if (pJob->DaysOfWeek != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in a new issue