38 static WORD wDaysArray[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
67 CurrentEntry = CurrentEntry->
Flink;
72 TRACE(
"No valid job!\n");
139 ZeroMemory(&StartupInfo,
sizeof(StartupInfo));
140 StartupInfo.
cb =
sizeof(StartupInfo);
160 &ProcessInformation);
172 CurrentEntry = CurrentEntry->
Flink;
185 ULONG ulSeed, ulValue;
194 swprintf(szNameBuffer,
L"%08lx", ulValue);
204 wcscpy(pszJobName, szNameBuffer);
221 TRACE(
"SaveJob()\n");
224 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
249 Schedule.
JobTime = pJob->JobTime;
252 Schedule.
Flags = pJob->Flags;
267 (
PBYTE)pJob->Command,
276 if (hJobsKey !=
NULL)
290 TRACE(
"DeleteJob()\n");
293 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
310 if (hJobsKey !=
NULL)
327 TRACE(
"LoadJobs()\n");
330 L"System\\CurrentControlSet\\Services\\Schedule\\Jobs",
341 for (dwIndex = 0; dwIndex < 1000; dwIndex++)
358 TRACE(
"KeyName: %S\n", szNameBuffer);
406 pJob->
JobTime = Schedule.JobTime;
409 pJob->
Flags = Schedule.Flags;
446 if (hJobsKey !=
NULL)
459 if (wMonth == 2 && wYear % 4 == 0 && wYear % 400 != 0)
470 SYSTEMTIME CurrentSystemTime, StartSystemTime;
472 WORD wDaysOffset, wTempOffset,
i, wJobDayOfWeek, wJobDayOfMonth;
474 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)
600 pJob->StartTime.dwLowDateTime = LocalStartTime.
u.LowPart;
601 pJob->StartTime.dwHighDateTime = LocalStartTime.
u.HighPart;
619 CurrentEntry = CurrentEntry->
Flink;
static WORD wDaysArray[13]
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
VOID RunCurrentJobs(VOID)
struct _ULARGE_INTEGER::@3916 u
static VOID GetJobName(HKEY hJobsKey, PWSTR pszJobName)
DWORD WINAPI GetLastError(VOID)
WCHAR Name[JOB_NAME_LENGTH]
struct _SCHEDULE PSCHEDULE
#define InsertTailList(ListHead, Entry)
VOID DumpStartList(_In_ PLIST_ENTRY StartListHead)
NTSYSAPI VOID NTAPI RtlReleaseResource(_In_ PRTL_RESOURCE Resource)
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)
BOOL WINAPI LocalFileTimeToFileTime(IN CONST FILETIME *lpLocalFileTime, OUT LPFILETIME lpFileTime)
#define STARTF_INHERITDESKTOP
LONG SaveJob(_In_ PJOB pJob)
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)
BOOL bValidNextJobStartTime
#define REG_OPTION_NON_VOLATILE
struct _LIST_ENTRY * Flink
#define CREATE_NEW_CONSOLE
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define JOB_NONINTERACTIVE
WINE_DEFAULT_DEBUG_CHANNEL(schedsvc)
struct _SCHEDULE SCHEDULE
RTL_RESOURCE StartListLock
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
VOID GetNextJobTimeout(HANDLE hTimer)
int _cdecl swprintf(const WCHAR *,...)
NTSYSAPI ULONG NTAPI RtlRandomEx(PULONG Seed)
VOID InsertJobIntoStartList(_In_ PLIST_ENTRY StartListHead, _In_ PJOB pJob)
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)
_In_ WDFTIMER _In_ LONGLONG DueTime
#define JOB_RUN_PERIODICALLY
static WORD DaysOfMonth(WORD wMonth, WORD wYear)
VOID CalculateNextStartTime(_In_ PJOB pJob)
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 HeapFree(x, y, z)
#define RegCloseKey(hKey)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
FILETIME NextJobStartTime
#define HKEY_LOCAL_MACHINE
NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive(_In_ PRTL_RESOURCE Resource, _In_ BOOLEAN Wait)