/* * TIME.C - Various time subroutines needed by NetWare Login Script * * Copyright (c) 1995 Microsoft Corporation */ #include "common.h" // Needed to convert netware net date to DOS date #define _70_to_80_bias 0x012CEA600L #define SECS_IN_DAY (60L*60L*24L) #define SEC2S_IN_DAY (30L*60L*24L) #define FOURYEARS (3*365+366) WORD MonTotal[] = { 0, // dummy entry for month 0 0, // days before Jan 1 31, // days before Feb 1 31+28, // days before Mar 1 31+28+31, // days before Apr 1 31+28+31+30, // days before May 1 31+28+31+30+31, // days before Jun 1 31+28+31+30+31+30, // days before Jul 1 31+28+31+30+31+30+31, // days before Aug 1 31+28+31+30+31+30+31+31, // days before Sep 1 31+28+31+30+31+30+31+31+30, // days before Oct 1 31+28+31+30+31+30+31+31+30+31, // days before Nov 1 31+28+31+30+31+30+31+31+30+31+30, // days before Dec 1 31+28+31+30+31+30+31+31+30+31+30+31 // days before end of year }; #define YR_MASK 0xFE00 #define LEAPYR_MASK 0x0600 #define YR_BITS 7 #define MON_MASK 0x01E0 #define MON_BITS 4 #define DAY_MASK 0x001F #define DAY_BITS 5 #define HOUR_MASK 0xF800 #define HOUR_BITS 5 #define MIN_MASK 0x07E0 #define MIN_BITS 6 #define SEC2_MASK 0x001F #define SEC2_BITS 5 static void NetToDosDate( DWORD time, WORD * dosdate, WORD * dostime ) { DWORD secs, days; WORD r; time = (time - _70_to_80_bias) / 2; // # of 2 second periods since 1980 secs = time % SEC2S_IN_DAY; // 2 second period into day days = time / SEC2S_IN_DAY; // days since Jan 1 1980 r = (WORD) ( secs % 30 ); // # of 2 second steps secs /= 30; r |= (secs % 60) << SEC2_BITS; // # of minutes r |= (secs / 60) << (SEC2_BITS+MIN_BITS); // # of hours *dostime = r; r = (WORD) ( days / FOURYEARS );// (r) = four year period past 1980 days %= FOURYEARS; // (days) = days into four year period r *= 4; // (r) = years since 1980 (within 3) if (days == 31+28) { //* Special case for FEB 29th r = (r<<(MON_BITS+DAY_BITS)) + (2< 31+28) --days; // compensate for leap year while (days >= 365) { ++r; days -= 365; } for (secs = 1; days >= MonTotal[secs+1] ; ++secs) ; days -= MonTotal[secs]; r <<= MON_BITS; r += (WORD)secs; r <<= DAY_BITS; r += (WORD)days+1; } *dosdate = r; } void nwShowLastLoginTime(VOID) { LONG lTime = 0L; SYSTEMTIME st; FILETIME ft; TIME_ZONE_INFORMATION tz; WCHAR szTimeBuf[TIMEDATE_SIZE]; WCHAR szDateBuf[TIMEDATE_SIZE]; int ret; WORD dostime, dosdate; DWORD tzStat; if ( ret = NDSGetUserProperty ("Last Login Time", (PBYTE)&lTime, 4, NULL, NULL) ) { #ifdef DEBUG OutputDebugString("NWLSPROC: error getting LOGIN TIME\n\r"); #endif return; } // From NetWare we get seconds from 1970, need to go through // several conversions to get system time for NLS // First deduct bias from UTC time to correct for local time tzStat = GetTimeZoneInformation(&tz); if ( tzStat != (DWORD)-1 ) { if (tzStat == TIME_ZONE_ID_STANDARD) tz.Bias += tz.StandardBias; else if (tzStat == TIME_ZONE_ID_DAYLIGHT) tz.Bias += tz.DaylightBias; lTime -= tz.Bias*60; } #ifdef DEBUG else { OutputDebugString("NWLSPROC: GetTimeZoneInformation failed\n\r"); } #endif // DEBUG NetToDosDate( lTime, &dosdate, &dostime ); DosDateTimeToFileTime ( dosdate, dostime, &ft ); FileTimeToSystemTime ( &ft, &st ); #ifdef notdef // I don't understand this comment, this code doesn't seem to be // needed for NT. - terry // // This code will work on NT, but not on Win95. // Convert the resulting system (UTC) time to local time if ( GetTimeZoneInformation(&tz) != (DWORD)-1 ) { SYSTEMTIME utcTime = st; SystemTimeToTzSpecificLocalTime ( &tz, &utcTime, &st ); } #ifdef DEBUG else { OutputDebugString("NWLSPROC: GetTimeZoneInformation failed\n\r"); } #endif // DEBUG #endif wcscpy(szTimeBuf, L""); ret = GetTimeFormat ( GetSystemDefaultLCID(), TIME_FORCE24HOURFORMAT|TIME_NOTIMEMARKER, &st, NULL, szTimeBuf, TIMEDATE_SIZE ); #ifdef DEBUG if ( !ret ) { char buf[80]; wsprintf(buf,"NWLSPROC: GetTimeFormatA failure: %d sec:%ld\n\r", GetLastError(), lTime ); OutputDebugString(buf); } #endif ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, szDateBuf, TIMEDATE_SIZE ); #ifdef DEBUG if ( !ret ) { char buf[80]; wsprintf(buf,"NWLSPROC: GetDateFormatA failure: %d sec:%ld\n\r", GetLastError(), lTime ); OutputDebugString(buf); } #endif DisplayMessage( IDR_LASTLOGIN, szDateBuf, szTimeBuf ); }