200 lines
4.9 KiB
C
200 lines
4.9 KiB
C
/*++
|
||
|
||
Copyright (c) 1991-1993 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
tod.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the server end of the NetRemoteTOD API.
|
||
|
||
|
||
Author:
|
||
|
||
Rajen Shah (rajens) 02-Apr-1991
|
||
|
||
[Environment:]
|
||
|
||
User Mode - Mixed NT and Win32
|
||
|
||
Revision History:
|
||
|
||
02-Apr-1991 RajenS
|
||
Created
|
||
02-Mar-1992 JohnRo
|
||
Disable DbgPrints for normal APIs (caused loss of elapsed time!)
|
||
08-Apr-1992 ChuckL
|
||
Moved into server service
|
||
10-Jun-1993 JohnRo
|
||
RAID 13081: NetRemoteTOD should return timezone info.
|
||
16-Jun-1993 JohnRo
|
||
RAID 13080: Fix GP fault if MIDL_user_allocate returns NULL ptr or
|
||
caller passes us NULL ptr.
|
||
|
||
--*/
|
||
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
|
||
#include <windows.h>
|
||
#include <lmcons.h>
|
||
#include <netlibnt.h>
|
||
#include <lmremutl.h>
|
||
#include <rpcutil.h>
|
||
#include <ssdebug.h> // SS_PRINT() macro.
|
||
#include <timelib.h>
|
||
|
||
#define TOD_DEFAULT_INTERVAL 310 // 310-milisecond interval
|
||
|
||
|
||
NTSTATUS
|
||
timesvc_RemoteTimeOfDay(
|
||
OUT LPTIME_OF_DAY_INFO *lpTimeOfDayInfo
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine calls the Win32 and NT base timer APIs to get the
|
||
relevant time/date information. It also calls the Rtl routine to
|
||
convert the time elapsed since 1-1-1970.
|
||
|
||
The routine allocates a buffer to contain the time of day information
|
||
and returns a pointer to that buffer to the caller.
|
||
|
||
Arguments:
|
||
|
||
lpTimeOfDayInfo - Location of where to place pointer to buffer.
|
||
|
||
Return Value:
|
||
|
||
NTSTATUS - STATUS_SUCCESS or reason for failure.
|
||
|
||
--*/
|
||
|
||
{
|
||
SYSTEMTIME SystemTime;
|
||
LARGE_INTEGER Time;
|
||
DWORD TickCount;
|
||
LPTIME_OF_DAY_INFO lpTimeOfDay;
|
||
LONG LocalTimeZoneOffsetSecs; // offset (+ for West of GMT, etc).
|
||
|
||
if (lpTimeOfDayInfo == NULL) {
|
||
return (STATUS_INVALID_PARAMETER);
|
||
}
|
||
|
||
//
|
||
// Call the appropriate routines to collect the time information
|
||
//
|
||
|
||
GetSystemTime(&SystemTime);
|
||
|
||
//
|
||
// Get number of seconds from UTC. Positive values for west of Greenwich,
|
||
// negative values for east of Greenwich.
|
||
//
|
||
LocalTimeZoneOffsetSecs = NetpLocalTimeZoneOffset();
|
||
|
||
//
|
||
// Allocate a TimeOfDay_INFO structure that is to be returned to the
|
||
// caller and fill it with the relevant data.
|
||
//
|
||
|
||
*lpTimeOfDayInfo = (TIME_OF_DAY_INFO *) MIDL_user_allocate(
|
||
sizeof (struct _TIME_OF_DAY_INFO)
|
||
);
|
||
|
||
if (*lpTimeOfDayInfo == NULL) {
|
||
SS_PRINT((
|
||
"SRVSVC: timesvc_RemoteTimeOfDay"
|
||
"got NULL from MIDL_user_allocate!\n" ));
|
||
return(STATUS_NO_MEMORY);
|
||
}
|
||
|
||
lpTimeOfDay = (LPTIME_OF_DAY_INFO)(*lpTimeOfDayInfo);
|
||
|
||
lpTimeOfDay->tod_hours = SystemTime.wHour;
|
||
lpTimeOfDay->tod_mins = SystemTime.wMinute;
|
||
lpTimeOfDay->tod_secs = SystemTime.wSecond;
|
||
lpTimeOfDay->tod_hunds = SystemTime.wMilliseconds/10;
|
||
lpTimeOfDay->tod_tinterval = TOD_DEFAULT_INTERVAL;
|
||
lpTimeOfDay->tod_day = SystemTime.wDay;
|
||
lpTimeOfDay->tod_month = SystemTime.wMonth;
|
||
lpTimeOfDay->tod_year = SystemTime.wYear;
|
||
lpTimeOfDay->tod_weekday = SystemTime.wDayOfWeek;
|
||
|
||
// tod_timezone is + for west of GMT, - for east of it.
|
||
// tod_timezone is in minutes.
|
||
lpTimeOfDay->tod_timezone = LocalTimeZoneOffsetSecs / 60;
|
||
|
||
// Get the 64-bit system time.
|
||
// Convert the system time to the number of miliseconds
|
||
// since 1-1-1970.
|
||
//
|
||
|
||
NtQuerySystemTime(&Time);
|
||
RtlTimeToSecondsSince1970(&Time,
|
||
&(lpTimeOfDay->tod_elapsedt)
|
||
);
|
||
|
||
// Get the free running counter value
|
||
//
|
||
TickCount = GetTickCount();
|
||
lpTimeOfDay->tod_msecs = TickCount;
|
||
|
||
return(STATUS_SUCCESS);
|
||
|
||
} // timesvc_RemoteTimeOfDay
|
||
|
||
|
||
NET_API_STATUS
|
||
NetrRemoteTOD (
|
||
IN LPSTR ServerName,
|
||
OUT LPTIME_OF_DAY_INFO *lpTimeOfDayInfo
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This is the RPC server entry point for the NetRemoteTOD API.
|
||
|
||
Arguments:
|
||
|
||
ServerName - Name of server on which this API is to be executed.
|
||
It should match this server's name - no checking is
|
||
done since it is assumed that RPC did the right thing.
|
||
|
||
lpTimeOfDayInfo - On return takes a pointer to a TIME_OF_DAY_INFO
|
||
structure - the memory is allocated here.
|
||
|
||
|
||
Return Value:
|
||
|
||
Returns a NET_API_STATUS code.
|
||
Also returns a pointer to the TIME_OF_DAY_INFO data buffer that was
|
||
allocated, if there is no error.
|
||
|
||
|
||
--*/
|
||
{
|
||
NTSTATUS status;
|
||
|
||
//
|
||
// Call the worker routine to collect all the time/date information
|
||
//
|
||
status = timesvc_RemoteTimeOfDay(lpTimeOfDayInfo);
|
||
|
||
//
|
||
// Translate the NTSTATUS to a NET_API_STATUS error, and return it.
|
||
//
|
||
|
||
return(NetpNtStatusToApiStatus(status));
|
||
|
||
UNREFERENCED_PARAMETER( ServerName );
|
||
}
|