39static WORD wDaysArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
68 CurrentEntry = CurrentEntry->
Flink;
73 TRACE(
"No valid job!\n");
140 ZeroMemory(&StartupInfo,
sizeof(StartupInfo));
141 StartupInfo.
cb =
sizeof(StartupInfo);
161 &ProcessInformation);
173 CurrentEntry = CurrentEntry->
Flink;
186 ULONG ulSeed, ulValue;
195 swprintf(szNameBuffer,
L"%08lx", ulValue);
205 wcscpy(pszJobName, szNameBuffer);
222 TRACE(
"SaveJob()\n");
225 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
250 Schedule.
JobTime = pJob->JobTime;
253 Schedule.
Flags = pJob->Flags;
268 (
PBYTE)pJob->Command,
277 if (hJobsKey !=
NULL)
291 TRACE(
"DeleteJob()\n");
294 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
311 if (hJobsKey !=
NULL)
328 TRACE(
"LoadJobs()\n");
331 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
342 for (dwIndex = 0; dwIndex < 1000; dwIndex++)
359 TRACE(
"KeyName: %S\n", szNameBuffer);
407 pJob->
JobTime = Schedule.JobTime;
410 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;
478 TRACE(
"CalculateNextStartTime(%p)\n", pJob);
479 TRACE(
"JobTime: %lu\n", pJob->JobTime);
480 TRACE(
"DaysOfWeek: 0x%x\n", pJob->DaysOfWeek);
481 TRACE(
"DaysOfMonth: 0x%x\n", pJob->DaysOfMonth);
488 bDaysOffsetValid =
FALSE;
490 if ((pJob->DaysOfWeek == 0) && (pJob->DaysOfMonth == 0))
492 if (CurrentTimeMs >= pJob->JobTime)
494 TRACE(
"Tomorrow!\n");
498 bDaysOffsetValid =
TRUE;
502 if (pJob->DaysOfWeek != 0)
504 TRACE(
"DaysOfWeek!\n");
505 for (
i = 0;
i < 7;
i++)
507 if (pJob->DaysOfWeek & (1 <<
i))
510 wJobDayOfWeek = (
i + 1) % 7;
511 TRACE(
"wJobDayOfWeek: %hu\n", wJobDayOfWeek);
512 TRACE(
"CurrentSystemTime.wDayOfWeek: %hu\n", CurrentSystemTime.
wDayOfWeek);
515 if ((CurrentSystemTime.
wDayOfWeek > wJobDayOfWeek ) ||
516 ((CurrentSystemTime.
wDayOfWeek == wJobDayOfWeek) && (CurrentTimeMs >= pJob->JobTime)))
518 wTempOffset = 7 - CurrentSystemTime.
wDayOfWeek + wJobDayOfWeek;
519 TRACE(
"wTempOffset: %hu\n", wTempOffset);
523 wTempOffset = wJobDayOfWeek - CurrentSystemTime.
wDayOfWeek;
524 TRACE(
"wTempOffset: %hu\n", wTempOffset);
528 if (bDaysOffsetValid ==
FALSE)
530 wDaysOffset = wTempOffset;
531 bDaysOffsetValid =
TRUE;
535 if (wTempOffset < wDaysOffset)
536 wDaysOffset = wTempOffset;
542 if (pJob->DaysOfMonth != 0)
544 FIXME(
"Support DaysOfMonth!\n");
545 for (
i = 0;
i < 31;
i++)
547 if (pJob->DaysOfMonth & (1 <<
i))
550 wJobDayOfMonth =
i + 1;
551 FIXME(
"wJobDayOfMonth: %hu\n", wJobDayOfMonth);
552 FIXME(
"CurrentSystemTime.wDay: %hu\n", CurrentSystemTime.
wDay);
554 if ((CurrentSystemTime.
wDay > wJobDayOfMonth) ||
555 ((CurrentSystemTime.
wDay == wJobDayOfMonth) && (CurrentTimeMs >= pJob->JobTime)))
558 CurrentSystemTime.
wDay + wJobDayOfMonth;
559 FIXME(
"wTempOffset: %hu\n", wTempOffset);
563 wTempOffset = wJobDayOfMonth - CurrentSystemTime.
wDay;
564 FIXME(
"wTempOffset: %hu\n", wTempOffset);
568 if (bDaysOffsetValid ==
FALSE)
570 wDaysOffset = wTempOffset;
571 bDaysOffsetValid =
TRUE;
575 if (wTempOffset < wDaysOffset)
576 wDaysOffset = wTempOffset;
583 TRACE(
"wDaysOffset: %hu\n", wDaysOffset);
589 StartSystemTime.
wHour = (
WORD)(pJob->JobTime / 3600000);
590 StartSystemTime.
wMinute = (
WORD)((pJob->JobTime % 3600000) / 60000);
596 if (bDaysOffsetValid && wDaysOffset != 0)
601 pJob->StartTime.dwLowDateTime = LocalStartTime.
u.LowPart;
602 pJob->StartTime.dwHighDateTime = LocalStartTime.
u.HighPart;
620 CurrentEntry = CurrentEntry->
Flink;
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
LONG DeleteJob(_In_ PJOB pJob)
struct _SCHEDULE SCHEDULE
static VOID GetJobName(HKEY hJobsKey, PWSTR pszJobName)
VOID GetNextJobTimeout(HANDLE hTimer)
RTL_RESOURCE StartListLock
LONG SaveJob(_In_ PJOB pJob)
BOOL bValidNextJobStartTime
VOID CalculateNextStartTime(_In_ PJOB pJob)
static WORD wDaysArray[13]
static WORD DaysOfMonth(WORD wMonth, WORD wYear)
VOID RunCurrentJobs(VOID)
FILETIME NextJobStartTime
struct _SCHEDULE PSCHEDULE
VOID InsertJobIntoStartList(_In_ PLIST_ENTRY StartListHead, _In_ PJOB pJob)
NTSYSAPI ULONG NTAPI RtlRandomEx(PULONG Seed)
VOID DumpStartList(_In_ PLIST_ENTRY StartListHead)
#define RegCloseKey(hKey)
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)
#define HeapFree(x, y, z)
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)
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
BOOL WINAPI LocalFileTimeToFileTime(IN CONST FILETIME *lpLocalFileTime, OUT LPFILETIME lpFileTime)
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define JOB_NONINTERACTIVE
#define JOB_RUN_PERIODICALLY
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)
NTSYSAPI VOID NTAPI RtlReleaseResource(_In_ PRTL_RESOURCE Resource)
#define REG_OPTION_NON_VOLATILE
WCHAR Name[JOB_NAME_LENGTH]
struct _LIST_ENTRY * Flink
struct _ULARGE_INTEGER::@4286 u
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)
#define CONTAINING_RECORD(address, type, field)
#define STARTF_INHERITDESKTOP
_In_ WDFTIMER _In_ LONGLONG DueTime
DWORD WINAPI GetLastError(void)
#define STARTF_USESHOWWINDOW
#define CREATE_NEW_CONSOLE
#define HKEY_LOCAL_MACHINE