35 static WORD wDaysArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
50 TRACE(
"No job in list! Wait until next update.\n");
60 TRACE(
"Start next job (%lu) at %02hu:%02hu %02hu.%02hu.%hu\n",
72 TRACE(
"Next event has already gone by!\n");
79 TRACE(
"Event happens too far in the future!\n");
132 ERR(
"No job in list!\n");
140 ZeroMemory(&StartupInfo,
sizeof(StartupInfo));
141 StartupInfo.
cb =
sizeof(StartupInfo);
161 &ProcessInformation);
184 ULONG ulSeed, ulValue;
193 swprintf(szNameBuffer,
L"%08lx", ulValue);
203 wcscpy(pszJobName, szNameBuffer);
220 TRACE(
"SaveJob()\n");
223 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
248 Schedule.
JobTime = pJob->JobTime;
251 Schedule.
Flags = pJob->Flags;
266 (
PBYTE)pJob->Command,
275 if (hJobsKey !=
NULL)
289 TRACE(
"DeleteJob()\n");
292 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
309 if (hJobsKey !=
NULL)
326 TRACE(
"LoadJobs()\n");
329 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
340 for (dwIndex = 0; dwIndex < 1000; dwIndex++)
357 TRACE(
"KeyName: %S\n", szNameBuffer);
405 pJob->
JobTime = Schedule.JobTime;
408 pJob->
Flags = Schedule.Flags;
447 if (hJobsKey !=
NULL)
460 if (wMonth == 2 && wYear % 4 == 0 && wYear % 400 != 0)
471 SYSTEMTIME CurrentSystemTime, StartSystemTime;
473 WORD wDaysOffset, wTempOffset,
i, wJobDayOfWeek, wJobDayOfMonth;
475 BOOL bDaysOffsetValid;
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);
487 bDaysOffsetValid =
FALSE;
489 if ((pJob->DaysOfWeek == 0) && (pJob->DaysOfMonth == 0))
491 if (CurrentTimeMs >= pJob->JobTime)
493 TRACE(
"Tomorrow!\n");
497 bDaysOffsetValid =
TRUE;
501 if (pJob->DaysOfWeek != 0)
503 TRACE(
"DaysOfWeek!\n");
504 for (
i = 0;
i < 7;
i++)
506 if (pJob->DaysOfWeek & (1 <<
i))
509 wJobDayOfWeek = (
i + 1) % 7;
510 TRACE(
"wJobDayOfWeek: %hu\n", wJobDayOfWeek);
511 TRACE(
"CurrentSystemTime.wDayOfWeek: %hu\n", CurrentSystemTime.
wDayOfWeek);
514 if ((CurrentSystemTime.
wDayOfWeek > wJobDayOfWeek ) ||
515 ((CurrentSystemTime.
wDayOfWeek == wJobDayOfWeek) && (CurrentTimeMs >= pJob->JobTime)))
517 wTempOffset = 7 - CurrentSystemTime.
wDayOfWeek + wJobDayOfWeek;
518 TRACE(
"wTempOffset: %hu\n", wTempOffset);
522 wTempOffset = wJobDayOfWeek - CurrentSystemTime.
wDayOfWeek;
523 TRACE(
"wTempOffset: %hu\n", wTempOffset);
527 if (bDaysOffsetValid ==
FALSE)
529 wDaysOffset = wTempOffset;
530 bDaysOffsetValid =
TRUE;
534 if (wTempOffset < wDaysOffset)
535 wDaysOffset = wTempOffset;
541 if (pJob->DaysOfMonth != 0)
543 FIXME(
"Support DaysOfMonth!\n");
544 for (
i = 0;
i < 31;
i++)
546 if (pJob->DaysOfMonth & (1 <<
i))
549 wJobDayOfMonth =
i + 1;
550 FIXME(
"wJobDayOfMonth: %hu\n", wJobDayOfMonth);
551 FIXME(
"CurrentSystemTime.wDay: %hu\n", CurrentSystemTime.
wDay);
553 if ((CurrentSystemTime.
wDay > wJobDayOfMonth) ||
554 ((CurrentSystemTime.
wDay == wJobDayOfMonth) && (CurrentTimeMs >= pJob->JobTime)))
557 CurrentSystemTime.
wDay + wJobDayOfMonth;
558 FIXME(
"wTempOffset: %hu\n", wTempOffset);
562 wTempOffset = wJobDayOfMonth - CurrentSystemTime.
wDay;
563 FIXME(
"wTempOffset: %hu\n", wTempOffset);
567 if (bDaysOffsetValid ==
FALSE)
569 wDaysOffset = wTempOffset;
570 bDaysOffsetValid =
TRUE;
574 if (wTempOffset < wDaysOffset)
575 wDaysOffset = wTempOffset;
582 TRACE(
"wDaysOffset: %hu\n", wDaysOffset);
588 StartSystemTime.
wHour = (
WORD)(pJob->JobTime / 3600000);
589 StartSystemTime.
wMinute = (
WORD)((pJob->JobTime % 3600000) / 60000);
595 if (bDaysOffsetValid && wDaysOffset != 0)
597 pJob->StartTime.QuadPart += ((
ULONGLONG)wDaysOffset * 24 * 60 * 60 * 10000);
632 PreviousEntry = CurrentEntry->
Blink;
633 pJob->StartEntry.Blink = PreviousEntry;
634 pJob->StartEntry.
Flink = CurrentEntry;
635 PreviousEntry->
Flink = &pJob->StartEntry;
636 CurrentEntry->
Blink = &pJob->StartEntry;
648 CurrentEntry = CurrentEntry->
Flink;
667 CurrentEntry = CurrentEntry->
Flink;
static WORD wDaysArray[13]
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
VOID InsertJobIntoStartList(_In_ PLIST_ENTRY StartListHead, _In_ PJOB pJob)
struct _LIST_ENTRY * Blink
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
static VOID GetJobName(HKEY hJobsKey, PWSTR pszJobName)
DWORD WINAPI GetLastError(VOID)
WCHAR Name[JOB_NAME_LENGTH]
struct _SCHEDULE PSCHEDULE
#define InsertTailList(ListHead, Entry)
NTSYSAPI VOID NTAPI RtlReleaseResource(_In_ PRTL_RESOURCE Resource)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
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)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
LONG WINAPI RegCloseKey(HKEY hKey)
#define STARTF_INHERITDESKTOP
LONG SaveJob(_In_ PJOB pJob)
DWORD GetNextJobTimeout(VOID)
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
#define STARTF_USESHOWWINDOW
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
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)
#define REG_OPTION_NON_VOLATILE
struct _LIST_ENTRY * Flink
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
#define CREATE_NEW_CONSOLE
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define JOB_NONINTERACTIVE
WINE_DEFAULT_DEBUG_CHANNEL(schedsvc)
struct _SCHEDULE SCHEDULE
static VOID ReScheduleJob(PJOB pJob)
RTL_RESOURCE StartListLock
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
NTSYSAPI ULONG NTAPI RtlRandomEx(PULONG Seed)
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
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
LONG DeleteJob(_In_ PJOB pJob)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
struct _ULARGE_INTEGER::@3918 u
#define JOB_RUN_PERIODICALLY
VOID DumpStartList(_In_ PLIST_ENTRY StartListHead)
static WORD DaysOfMonth(WORD wMonth, WORD wYear)
VOID CalculateNextStartTime(_In_ PJOB pJob)
#define HeapFree(x, y, z)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
#define HKEY_LOCAL_MACHINE
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)