+static
+BOOL
+MsvpCheckLogonHours(
+ _In_ PSAMPR_LOGON_HOURS LogonHours,
+ _In_ PLARGE_INTEGER LogonTime)
+{
+ LARGE_INTEGER LocalLogonTime;
+ TIME_FIELDS TimeFields;
+ USHORT MinutesPerUnit, Offset;
+
+ TRACE("MsvpCheckLogonHours(%p %p)\n", LogonHours, LogonTime);
+
+ if (LogonHours->UnitsPerWeek == 0 || LogonHours->LogonHours == NULL)
+ return TRUE;
+
+ RtlSystemTimeToLocalTime(LogonTime, &LocalLogonTime);
+ RtlTimeToTimeFields(&LocalLogonTime, &TimeFields);
+
+ TRACE("UnitsPerWeek: %u\n", LogonHours->UnitsPerWeek);
+ MinutesPerUnit = 10080 / LogonHours->UnitsPerWeek;
+
+ Offset = ((TimeFields.Weekday * 24 + TimeFields.Hour) * 60 + TimeFields.Minute) / MinutesPerUnit;
+
+ return (BOOL)(LogonHours->LogonHours[Offset / 8] & (1 << (Offset % 8)));
+}
+
+
+static
+BOOL
+MsvpCheckWorkstations(
+ _In_ PRPC_UNICODE_STRING WorkStations,
+ _In_ PWSTR ComputerName)
+{
+ PWSTR pStart, pEnd;
+ BOOL bFound = FALSE;
+
+ TRACE("MsvpCheckWorkstations(%wZ %S)\n", WorkStations, ComputerName);
+
+ if (WorkStations->Length == 0 || WorkStations->Buffer == NULL)
+ return TRUE;
+
+ pStart = WorkStations->Buffer;
+ for (;;)
+ {
+ pEnd = wcschr(pStart, L',');
+ if (pEnd != NULL)
+ *pEnd = UNICODE_NULL;
+
+ if (_wcsicmp(ComputerName, pStart) == 0)
+ {
+ bFound = TRUE;
+ if (pEnd != NULL)
+ *pEnd = L',';
+ break;
+ }
+
+ if (pEnd == NULL)
+ break;
+
+ *pEnd = L',';
+ pStart = pEnd + 1;
+ }
+
+ return bFound;
+}
+
+