>* NetRemoteTOD's first parameter is a pointer to a >* Unicode string that contains the server name. >* >* The second parameter is a pointer to a byte array >* that contains a pointer to a TIME_OF_DAY_INFO structure > >* The '@' in front of the second parameter ('integer @') >* dereferences this pointer to the byte array. Later in the >* program, the program uses RTLMoveMemory() to >* dereference the pointer this byte array contains >DECLARE INTEGER NetRemoteTOD IN netapi32 STRING @, INTEGER @ > >* Note that the source address ('inbuffer') is declared as an integer, >* to be consistent with the second parameter in NetRemoteTOD above. >DECLARE INTEGER RtlMoveMemory IN win32api ; > STRING @outbuffer, ; > INTEGER inbuffer, ; > INTEGER bytes2copy > > >* the TIME_OF_DAY_INFO structure >* contains 11 DWORDs and 1 long, for >* a total of 48 bytes. Therefore, tdbuffout is >* initialized as: >tdbuffout=REPLICATE(CHR(0), 48) >tdbuffin = 0 > >* the server name must be converted to Unicode >* This API function behaves differently depending on >* whether the target is a Win2000 computer or not - >* >* If Win2000, the servername must be preceded by "\\"; >* otherwise, it must not. > >server_name = "your_server_name" >try_server_name = STRCONV(server_name, 5) >rc = NetRemoteTOD(@try_server_name, @tdbuffin) >IF rc = 0 > * copy the contents pointed to by the address in tdbuffin to > * tdbuffout > =RtlMoveMemory(@tdbuffout, tdbuffin, 48) >ELSE > * call failed. Therefore, the target is possibly a Win2000 box; > * Retry the function call, prepending "\\" to the server_name > try_server_name = STRCONV("\\" + server_name, 5) > rc = NetRemoteTOD(@try_server_name, @tdbuffin) > IF rc = 0 > * copy the contents pointed to by the address in tdbuffin to > * tdbuffout > =RtlMoveMemory(@tdbuffout, tdbuffin, 48) > ELSE > ? "NetRemoteTOD() call failed. Return code is: ", rc > RETURN > ENDIF >ENDIF > >* Pick out the appropriate parts of the TIME_OF_DAY_INFORMATION >* buffer. This buffer will contain the UTC (Universal Coordinated >* Time) of the server, and must be adjusted by TOD_TIMEZONE minutes >* for the correct local time. > >* str2long() converts the DWORDS and LONGS from their string >* representation back to numbers. >tod_month = str2long(SUBSTR(tdbuffout, 37, 4)) >tod_day = str2long(SUBSTR(tdbuffout, 33, 4)) >tod_year = str2long(SUBSTR(tdbuffout, 41, 4)) >tod_hours = str2long(SUBSTR(tdbuffout, 9, 4)) >tod_mins = str2long(SUBSTR(tdbuffout, 13, 4)) >tod_secs = str2long(SUBSTR(tdbuffout, 17, 4)) > >* Subtract this bias (times 60, to obtain seconds) >* from the datetime value to obtain the >* server's local time >* >* Alternatively, to convert the server's local time to >* the workstation's local time, use the Win32 API function >* SystemTimeToTzSpecificLocalTime, available under >* Windows NT only. >tod_timezone = str2long(SUBSTR(tdbuffout, 25, 4)) * 60 > >serverdatetime = DATETIME(tod_year, tod_month, tod_day, ; > tod_hours, tod_mins, tod_secs) > >? "UTC time of server is: ", serverdatetime >? "Server's local time is: ", serverdatetime - tod_timezone > >************************************************************* >FUNCTION str2long >************************************************************* >* passed: 4-byte character string (m.longstr) in low-high ASCII format >* returns: long integer value >* example: >* m.longstr = "1111" >* m.longval = str2long(m.longstr) > >PARAMETERS m.longstr > >PRIVATE i, m.retval > >m.retval = 0 >FOR i = 0 TO 24 STEP 8 > m.retval = m.retval + (ASC(m.longstr) * (2^i)) > m.longstr = RIGHT(m.longstr, LEN(m.longstr) - 1) >NEXT >RETURN m.retval >