ReactOS 0.4.16-dev-197-g92996da
job.c File Reference
#include "precomp.h"
Include dependency graph for job.c:

Go to the source code of this file.

Classes

struct  _SCHEDULE
 

Typedefs

typedef struct _SCHEDULE SCHEDULE
 
typedef struct _SCHEDULE PSCHEDULE
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (schedsvc)
 
VOID GetNextJobTimeout (HANDLE hTimer)
 
VOID RunCurrentJobs (VOID)
 
static VOID GetJobName (HKEY hJobsKey, PWSTR pszJobName)
 
LONG SaveJob (_In_ PJOB pJob)
 
LONG DeleteJob (_In_ PJOB pJob)
 
LONG LoadJobs (VOID)
 
static WORD DaysOfMonth (WORD wMonth, WORD wYear)
 
VOID CalculateNextStartTime (_In_ PJOB pJob)
 

Variables

DWORD dwNextJobId = 0
 
DWORD dwJobCount = 0
 
LIST_ENTRY JobListHead
 
RTL_RESOURCE JobListLock
 
LIST_ENTRY StartListHead
 
RTL_RESOURCE StartListLock
 
FILETIME NextJobStartTime
 
BOOL bValidNextJobStartTime = FALSE
 
static WORD wDaysArray [13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
 

Typedef Documentation

◆ PSCHEDULE

◆ SCHEDULE

Function Documentation

◆ CalculateNextStartTime()

VOID CalculateNextStartTime ( _In_ PJOB  pJob)

Definition at line 467 of file job.c.

469{
470 SYSTEMTIME CurrentSystemTime, StartSystemTime;
471 FILETIME StartFileTime;
472 WORD wDaysOffset, wTempOffset, i, wJobDayOfWeek, wJobDayOfMonth;
473 DWORD_PTR CurrentTimeMs;
474 BOOL bDaysOffsetValid;
475 ULARGE_INTEGER LocalStartTime;
476
477 TRACE("CalculateNextStartTime(%p)\n", pJob);
478 TRACE("JobTime: %lu\n", pJob->JobTime);
479 TRACE("DaysOfWeek: 0x%x\n", pJob->DaysOfWeek);
480 TRACE("DaysOfMonth: 0x%x\n", pJob->DaysOfMonth);
481
482 GetLocalTime(&CurrentSystemTime);
483
484 CurrentTimeMs = (DWORD_PTR)CurrentSystemTime.wHour * 3600000 +
485 (DWORD_PTR)CurrentSystemTime.wMinute * 60000;
486
487 bDaysOffsetValid = FALSE;
488 wDaysOffset = 0;
489 if ((pJob->DaysOfWeek == 0) && (pJob->DaysOfMonth == 0))
490 {
491 if (CurrentTimeMs >= pJob->JobTime)
492 {
493 TRACE("Tomorrow!\n");
494 wDaysOffset = 1;
495 }
496
497 bDaysOffsetValid = TRUE;
498 }
499 else
500 {
501 if (pJob->DaysOfWeek != 0)
502 {
503 TRACE("DaysOfWeek!\n");
504 for (i = 0; i < 7; i++)
505 {
506 if (pJob->DaysOfWeek & (1 << i))
507 {
508 /* Adjust the range */
509 wJobDayOfWeek = (i + 1) % 7;
510 TRACE("wJobDayOfWeek: %hu\n", wJobDayOfWeek);
511 TRACE("CurrentSystemTime.wDayOfWeek: %hu\n", CurrentSystemTime.wDayOfWeek);
512
513 /* Calculate the days offset */
514 if ((CurrentSystemTime.wDayOfWeek > wJobDayOfWeek ) ||
515 ((CurrentSystemTime.wDayOfWeek == wJobDayOfWeek) && (CurrentTimeMs >= pJob->JobTime)))
516 {
517 wTempOffset = 7 - CurrentSystemTime.wDayOfWeek + wJobDayOfWeek;
518 TRACE("wTempOffset: %hu\n", wTempOffset);
519 }
520 else
521 {
522 wTempOffset = wJobDayOfWeek - CurrentSystemTime.wDayOfWeek;
523 TRACE("wTempOffset: %hu\n", wTempOffset);
524 }
525
526 /* Use the smallest offset */
527 if (bDaysOffsetValid == FALSE)
528 {
529 wDaysOffset = wTempOffset;
530 bDaysOffsetValid = TRUE;
531 }
532 else
533 {
534 if (wTempOffset < wDaysOffset)
535 wDaysOffset = wTempOffset;
536 }
537 }
538 }
539 }
540
541 if (pJob->DaysOfMonth != 0)
542 {
543 FIXME("Support DaysOfMonth!\n");
544 for (i = 0; i < 31; i++)
545 {
546 if (pJob->DaysOfMonth & (1 << i))
547 {
548 /* Adjust the range */
549 wJobDayOfMonth = i + 1;
550 FIXME("wJobDayOfMonth: %hu\n", wJobDayOfMonth);
551 FIXME("CurrentSystemTime.wDay: %hu\n", CurrentSystemTime.wDay);
552
553 if ((CurrentSystemTime.wDay > wJobDayOfMonth) ||
554 ((CurrentSystemTime.wDay == wJobDayOfMonth) && (CurrentTimeMs >= pJob->JobTime)))
555 {
556 wTempOffset = DaysOfMonth(CurrentSystemTime.wMonth, CurrentSystemTime.wYear) -
557 CurrentSystemTime.wDay + wJobDayOfMonth;
558 FIXME("wTempOffset: %hu\n", wTempOffset);
559 }
560 else
561 {
562 wTempOffset = wJobDayOfMonth - CurrentSystemTime.wDay;
563 FIXME("wTempOffset: %hu\n", wTempOffset);
564 }
565
566 /* Use the smallest offset */
567 if (bDaysOffsetValid == FALSE)
568 {
569 wDaysOffset = wTempOffset;
570 bDaysOffsetValid = TRUE;
571 }
572 else
573 {
574 if (wTempOffset < wDaysOffset)
575 wDaysOffset = wTempOffset;
576 }
577 }
578 }
579 }
580 }
581
582 TRACE("wDaysOffset: %hu\n", wDaysOffset);
583
584 CopyMemory(&StartSystemTime, &CurrentSystemTime, sizeof(SYSTEMTIME));
585
586 StartSystemTime.wMilliseconds = 0;
587 StartSystemTime.wSecond = 0;
588 StartSystemTime.wHour = (WORD)(pJob->JobTime / 3600000);
589 StartSystemTime.wMinute = (WORD)((pJob->JobTime % 3600000) / 60000);
590
591 SystemTimeToFileTime(&StartSystemTime, &StartFileTime);
592
593 LocalStartTime.u.LowPart = StartFileTime.dwLowDateTime;
594 LocalStartTime.u.HighPart = StartFileTime.dwHighDateTime;
595 if (bDaysOffsetValid && wDaysOffset != 0)
596 {
597 LocalStartTime.QuadPart += ((ULONGLONG)wDaysOffset * 24 * 60 * 60 * 10000);
598 }
599
600 pJob->StartTime.dwLowDateTime = LocalStartTime.u.LowPart;
601 pJob->StartTime.dwHighDateTime = LocalStartTime.u.HighPart;
602}
static WORD DaysOfMonth(WORD wMonth, WORD wYear)
Definition: job.c:455
#define FIXME(fmt,...)
Definition: precomp.h:53
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
Definition: time.c:158
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:286
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwHighDateTime
Definition: mapidefs.h:66
DWORD dwLowDateTime
Definition: mapidefs.h:65
WORD wYear
Definition: winbase.h:929
WORD wMilliseconds
Definition: winbase.h:936
WORD wMonth
Definition: winbase.h:930
WORD wHour
Definition: winbase.h:933
WORD wSecond
Definition: winbase.h:935
WORD wMinute
Definition: winbase.h:934
WORD wDay
Definition: winbase.h:932
WORD wDayOfWeek
Definition: winbase.h:931
struct _ULARGE_INTEGER::@4136 u
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
#define DWORD_PTR
Definition: treelist.c:76
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint64_t ULONGLONG
Definition: typedefs.h:67
#define CopyMemory
Definition: winbase.h:1734

Referenced by LoadJobs(), and NetrJobAdd().

◆ DaysOfMonth()

static WORD DaysOfMonth ( WORD  wMonth,
WORD  wYear 
)
static

Definition at line 455 of file job.c.

458{
459 if (wMonth == 2 && wYear % 4 == 0 && wYear % 400 != 0)
460 return 29;
461
462 return wDaysArray[wMonth];
463}
static WORD wDaysArray[13]
Definition: job.c:38

Referenced by CalculateNextStartTime(), and PrintAllJobs().

◆ DeleteJob()

LONG DeleteJob ( _In_ PJOB  pJob)

Definition at line 284 of file job.c.

286{
287 HKEY hJobsKey = NULL;
288 LONG lError;
289
290 TRACE("DeleteJob()\n");
291
293 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
294 0,
295 NULL,
297 KEY_WRITE,
298 NULL,
299 &hJobsKey,
300 NULL);
301 if (lError != ERROR_SUCCESS)
302 goto done;
303
304 lError = RegDeleteKey(hJobsKey,
305 pJob->Name);
306 if (lError != ERROR_SUCCESS)
307 goto done;
308
309done:
310 if (hJobsKey != NULL)
311 RegCloseKey(hJobsKey);
312
313 return lError;
314}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_WRITE
Definition: nt_native.h:1031
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define RegDeleteKey
Definition: winreg.h:502

◆ GetJobName()

static VOID GetJobName ( HKEY  hJobsKey,
PWSTR  pszJobName 
)
static

Definition at line 179 of file job.c.

182{
183 WCHAR szNameBuffer[JOB_NAME_LENGTH];
184 FILETIME SystemTime;
185 ULONG ulSeed, ulValue;
186 HKEY hKey;
187 LONG lError;
188
189 GetSystemTimeAsFileTime(&SystemTime);
190 ulSeed = SystemTime.dwLowDateTime;
191 for (;;)
192 {
193 ulValue = RtlRandomEx(&ulSeed);
194 swprintf(szNameBuffer, L"%08lx", ulValue);
195
196 hKey = NULL;
197 lError = RegOpenKeyEx(hJobsKey,
198 szNameBuffer,
199 0,
200 KEY_READ,
201 &hKey);
202 if (lError != ERROR_SUCCESS)
203 {
204 wcscpy(pszJobName, szNameBuffer);
205 return;
206 }
207
209 }
210}
#define JOB_NAME_LENGTH
Definition: precomp.h:23
NTSYSAPI ULONG NTAPI RtlRandomEx(PULONG Seed)
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
#define swprintf
Definition: precomp.h:40
FxAutoRegKey hKey
#define KEY_READ
Definition: nt_native.h:1023
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
uint32_t ULONG
Definition: typedefs.h:59
#define RegOpenKeyEx
Definition: winreg.h:520
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by SaveJob().

◆ GetNextJobTimeout()

VOID GetNextJobTimeout ( HANDLE  hTimer)

Definition at line 44 of file job.c.

45{
46 PLIST_ENTRY CurrentEntry;
48 PJOB CurrentJob;
49
51 CurrentEntry = JobListHead.Flink;
52 while (CurrentEntry != &JobListHead)
53 {
54 CurrentJob = CONTAINING_RECORD(CurrentEntry, JOB, JobEntry);
55
57 {
58 CopyMemory(&NextJobStartTime, &CurrentJob->StartTime, sizeof(FILETIME));
60 }
61 else
62 {
63 if (CompareFileTime(&NextJobStartTime, &CurrentJob->StartTime) > 0)
64 CopyMemory(&NextJobStartTime, &CurrentJob->StartTime, sizeof(FILETIME));
65 }
66
67 CurrentEntry = CurrentEntry->Flink;
68 }
69
71 {
72 TRACE("No valid job!\n");
73 return;
74 }
75
77
78 SetWaitableTimer(hTimer,
80 0,
81 NULL,
82 NULL,
83 TRUE);
84}
LIST_ENTRY JobListHead
Definition: job.c:29
BOOL bValidNextJobStartTime
Definition: job.c:35
FILETIME NextJobStartTime
Definition: job.c:34
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
BOOL WINAPI LocalFileTimeToFileTime(IN CONST FILETIME *lpLocalFileTime, OUT LPFILETIME lpFileTime)
Definition: time.c:253
Definition: precomp.h:32
FILETIME StartTime
Definition: precomp.h:35
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
BOOL WINAPI SetWaitableTimer(IN HANDLE hTimer, IN const LARGE_INTEGER *pDueTime, IN LONG lPeriod, IN PTIMERAPCROUTINE pfnCompletionRoutine OPTIONAL, IN OPTIONAL LPVOID lpArgToCompletionRoutine, IN BOOL fResume)
Definition: synch.c:382
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190

Referenced by SchedServiceMain().

◆ LoadJobs()

LONG LoadJobs ( VOID  )

Definition at line 318 of file job.c.

319{
320 SCHEDULE Schedule;
321 WCHAR szNameBuffer[JOB_NAME_LENGTH];
322 DWORD dwNameLength, dwIndex, dwSize;
323 HKEY hJobsKey = NULL, hJobKey = NULL;
324 PJOB pJob = NULL;
325 LONG lError;
326
327 TRACE("LoadJobs()\n");
328
330 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
331 0,
332 NULL,
334 KEY_READ,
335 NULL,
336 &hJobsKey,
337 NULL);
338 if (lError != ERROR_SUCCESS)
339 goto done;
340
341 for (dwIndex = 0; dwIndex < 1000; dwIndex++)
342 {
343 dwNameLength = JOB_NAME_LENGTH;
344 lError = RegEnumKeyEx(hJobsKey,
345 dwIndex,
346 szNameBuffer,
347 &dwNameLength,
348 NULL,
349 NULL,
350 NULL,
351 NULL);
352 if (lError != ERROR_SUCCESS)
353 {
354 lError = ERROR_SUCCESS;
355 break;
356 }
357
358 TRACE("KeyName: %S\n", szNameBuffer);
359
360 lError = RegOpenKeyEx(hJobsKey,
361 szNameBuffer,
362 0,
363 KEY_READ,
364 &hJobKey);
365 if (lError != ERROR_SUCCESS)
366 break;
367
368 dwSize = sizeof(SCHEDULE);
369 lError = RegQueryValueEx(hJobKey,
370 L"Schedule",
371 NULL,
372 NULL,
373 (PBYTE)&Schedule,
374 &dwSize);
375 if (lError == ERROR_SUCCESS)
376 {
377 dwSize = 0;
378 RegQueryValueEx(hJobKey,
379 L"Command",
380 NULL,
381 NULL,
382 NULL,
383 &dwSize);
384 if (dwSize != 0)
385 {
386 /* Allocate a new job object */
387 pJob = HeapAlloc(GetProcessHeap(),
389 sizeof(JOB) + dwSize - sizeof(WCHAR));
390 if (pJob == NULL)
391 {
392 lError = ERROR_OUTOFMEMORY;
393 break;
394 }
395
396 lError = RegQueryValueEx(hJobKey,
397 L"Command",
398 NULL,
399 NULL,
400 (PBYTE)pJob->Command,
401 &dwSize);
402 if (lError != ERROR_SUCCESS)
403 break;
404
405 wcscpy(pJob->Name, szNameBuffer);
406 pJob->JobTime = Schedule.JobTime;
407 pJob->DaysOfMonth = Schedule.DaysOfMonth;
408 pJob->DaysOfWeek = Schedule.DaysOfWeek;
409 pJob->Flags = Schedule.Flags;
410
411 /* Acquire the job list lock exclusively */
413
414 /* Assign a new job ID */
415 pJob->JobId = dwNextJobId++;
416 dwJobCount++;
417
418 /* Append the new job to the job list */
420
421 /* Calculate the next start time */
423
424#if 0
426#endif
427
428 /* Release the job list lock */
430
431 pJob = NULL;
432 }
433 }
434
435 RegCloseKey(hJobKey);
436 hJobKey = NULL;
437 }
438
439done:
440 if (pJob != NULL)
441 HeapFree(GetProcessHeap(), 0, pJob);
442
443 if (hJobKey != NULL)
444 RegCloseKey(hJobKey);
445
446 if (hJobsKey != NULL)
447 RegCloseKey(hJobsKey);
448
449 return lError;
450}
struct _SCHEDULE SCHEDULE
RTL_RESOURCE JobListLock
Definition: job.c:30
DWORD dwJobCount
Definition: job.c:28
LIST_ENTRY StartListHead
Definition: job.c:32
VOID CalculateNextStartTime(_In_ PJOB pJob)
Definition: job.c:467
DWORD dwNextJobId
Definition: job.c:27
VOID DumpStartList(_In_ PLIST_ENTRY StartListHead)
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define InsertTailList(ListHead, Entry)
unsigned long DWORD
Definition: ntddk_ex.h:95
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)
NTSYSAPI VOID NTAPI RtlReleaseResource(_In_ PRTL_RESOURCE Resource)
BYTE * PBYTE
Definition: pedump.c:66
UCHAR DaysOfWeek
Definition: precomp.h:41
UCHAR Flags
Definition: precomp.h:42
LIST_ENTRY JobEntry
Definition: precomp.h:33
WCHAR Name[JOB_NAME_LENGTH]
Definition: precomp.h:36
WCHAR Command[1]
Definition: precomp.h:43
DWORD_PTR JobTime
Definition: precomp.h:39
DWORD DaysOfMonth
Definition: precomp.h:40
DWORD JobId
Definition: precomp.h:38
Definition: job.c:19
UCHAR Flags
Definition: job.c:23
DWORD JobTime
Definition: job.c:20
DWORD DaysOfMonth
Definition: job.c:21
UCHAR DaysOfWeek
Definition: job.c:22
#define RegQueryValueEx
Definition: winreg.h:524
#define RegEnumKeyEx
Definition: winreg.h:510

Referenced by ServiceInit().

◆ RunCurrentJobs()

VOID RunCurrentJobs ( VOID  )

Definition at line 122 of file job.c.

123{
124 PROCESS_INFORMATION ProcessInformation;
125 STARTUPINFOW StartupInfo;
126 PLIST_ENTRY CurrentEntry;
127 PJOB CurrentJob;
128 BOOL bRet;
129
130 CurrentEntry = JobListHead.Flink;
131 while (CurrentEntry != &JobListHead)
132 {
133 CurrentJob = CONTAINING_RECORD(CurrentEntry, JOB, JobEntry);
134
135 if (CompareFileTime(&NextJobStartTime, &CurrentJob->StartTime) == 0)
136 {
137 TRACE("Run job %ld: %S\n", CurrentJob->JobId, CurrentJob->Command);
138
139 ZeroMemory(&StartupInfo, sizeof(StartupInfo));
140 StartupInfo.cb = sizeof(StartupInfo);
141 StartupInfo.lpTitle = CurrentJob->Command;
142 StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
143 StartupInfo.wShowWindow = SW_SHOWDEFAULT;
144
145 if ((CurrentJob->Flags & JOB_NONINTERACTIVE) == 0)
146 {
147 StartupInfo.dwFlags |= STARTF_INHERITDESKTOP;
148 StartupInfo.lpDesktop = L"WinSta0\\Default";
149 }
150
151 bRet = CreateProcessW(NULL,
152 CurrentJob->Command,
153 NULL,
154 NULL,
155 FALSE,
157 NULL,
158 NULL,
159 &StartupInfo,
160 &ProcessInformation);
161 if (bRet == FALSE)
162 {
163 ERR("CreateProcessW() failed (Error %lu)\n", GetLastError());
164 }
165 else
166 {
167 CloseHandle(ProcessInformation.hThread);
168 CloseHandle(ProcessInformation.hProcess);
169 }
170 }
171
172 CurrentEntry = CurrentEntry->Flink;
173 }
174}
#define ERR(fmt,...)
Definition: precomp.h:57
#define CloseHandle
Definition: compat.h:739
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4598
#define JOB_NONINTERACTIVE
Definition: atsvc.idl:38
LPWSTR lpDesktop
Definition: winbase.h:878
DWORD cb
Definition: winbase.h:876
DWORD dwFlags
Definition: winbase.h:887
LPWSTR lpTitle
Definition: winbase.h:879
WORD wShowWindow
Definition: winbase.h:888
#define STARTF_INHERITDESKTOP
Definition: undocuser.h:164
#define ZeroMemory
Definition: winbase.h:1736
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define STARTF_USESHOWWINDOW
Definition: winbase.h:516
#define CREATE_NEW_CONSOLE
Definition: winbase.h:182
#define SW_SHOWDEFAULT
Definition: winuser.h:783

Referenced by SchedServiceMain().

◆ SaveJob()

LONG SaveJob ( _In_ PJOB  pJob)

Definition at line 214 of file job.c.

216{
217 SCHEDULE Schedule;
218 HKEY hJobsKey = NULL, hJobKey = NULL;
219 LONG lError;
220
221 TRACE("SaveJob()\n");
222
224 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
225 0,
226 NULL,
228 KEY_WRITE,
229 NULL,
230 &hJobsKey,
231 NULL);
232 if (lError != ERROR_SUCCESS)
233 goto done;
234
235 GetJobName(hJobsKey, pJob->Name);
236
237 lError = RegCreateKeyExW(hJobsKey,
238 pJob->Name,
239 0,
240 NULL,
242 KEY_WRITE,
243 NULL,
244 &hJobKey,
245 NULL);
246 if (lError != ERROR_SUCCESS)
247 goto done;
248
249 Schedule.JobTime = pJob->JobTime;
250 Schedule.DaysOfMonth = pJob->DaysOfMonth;
251 Schedule.DaysOfWeek = pJob->DaysOfWeek;
252 Schedule.Flags = pJob->Flags;
253
254 lError = RegSetValueEx(hJobKey,
255 L"Schedule",
256 0,
258 (PBYTE)&Schedule,
259 sizeof(Schedule));
260 if (lError != ERROR_SUCCESS)
261 goto done;
262
263 lError = RegSetValueEx(hJobKey,
264 L"Command",
265 0,
266 REG_SZ,
267 (PBYTE)pJob->Command,
268 (wcslen(pJob->Command) + 1) * sizeof(WCHAR));
269 if (lError != ERROR_SUCCESS)
270 goto done;
271
272done:
273 if (hJobKey != NULL)
274 RegCloseKey(hJobKey);
275
276 if (hJobsKey != NULL)
277 RegCloseKey(hJobsKey);
278
279 return lError;
280}
static VOID GetJobName(HKEY hJobsKey, PWSTR pszJobName)
Definition: job.c:179
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define REG_SZ
Definition: layer.c:22
#define REG_BINARY
Definition: nt_native.h:1496
#define RegSetValueEx
Definition: winreg.h:533

Referenced by NetrJobAdd().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( schedsvc  )

Variable Documentation

◆ bValidNextJobStartTime

BOOL bValidNextJobStartTime = FALSE

Definition at line 35 of file job.c.

Referenced by GetNextJobTimeout().

◆ dwJobCount

DWORD dwJobCount = 0

Definition at line 28 of file job.c.

Referenced by LoadJobs(), NetrJobAdd(), NetrJobDel(), and NetrJobEnum().

◆ dwNextJobId

DWORD dwNextJobId = 0

Definition at line 27 of file job.c.

Referenced by LoadJobs(), and NetrJobAdd().

◆ JobListHead

◆ JobListLock

RTL_RESOURCE JobListLock

◆ NextJobStartTime

FILETIME NextJobStartTime

Definition at line 34 of file job.c.

Referenced by GetNextJobTimeout(), and RunCurrentJobs().

◆ StartListHead

LIST_ENTRY StartListHead

Definition at line 32 of file job.c.

Referenced by LoadJobs(), NetrJobAdd(), NetrJobDel(), and ServiceInit().

◆ StartListLock

RTL_RESOURCE StartListLock

Definition at line 33 of file job.c.

Referenced by ServiceInit().

◆ wDaysArray

WORD wDaysArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
static

Definition at line 38 of file job.c.

Referenced by DaysOfMonth().