This is what I found out...
If anyone is interested.
PROCEDURE GetComputerNameA EXTERNAL "kernel32.dll":
DEFINE OUTPUT PARAMETER lpBuffer AS MEMPTR.
DEFINE INPUT-OUTPUT PARAMETER nSize AS LONG.
DEFINE RETURN PARAMETER intResult AS SHORT.
END PROCEDURE.
PROCEDURE ProcessIdToSessionId EXTERNAL "kernel32.dll":
DEFINE INPUT PARAMETER dwProcessId AS LONG.
DEFINE OUTPUT PARAMETER pSessionId AS MEMPTR.
DEFINE RETURN PARAMETER intResult AS SHORT.
END PROCEDURE.
PROCEDURE GetCurrentProcessId EXTERNAL "kernel32.dll":
DEFINE RETURN PARAMETER intResult AS SHORT.
END PROCEDURE.
PROCEDURE WTSQuerySessionInformationA EXTERNAL "Wtsapi32.dll":
DEFINE INPUT PARAMETER hServer AS LONG.
DEFINE INPUT PARAMETER SessionId AS LONG.
DEFINE INPUT PARAMETER WTSInfoClass AS LONG.
DEFINE OUTPUT PARAMETER ppBuffer AS LONG.
DEFINE OUTPUT PARAMETER pBytesReturned AS LONG.
DEFINE RETURN PARAMETER intResult AS LONG.
END PROCEDURE.
FUNCTION FuncClientName RETURNS CHARACTER
( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
DEFINE VARIABLE lpInfoClass AS INTEGER NO-UNDO.
DEFINE VARIABLE lpName AS MEMPTR NO-UNDO.
DEFINE VARIABLE ws-client-name AS CHARACTER NO-UNDO.
DEFINE VARIABLE BytesReturned AS INTEGER NO-UNDO.
DEFINE VARIABLE intResult AS INTEGER NO-UNDO.
RUN WTSQuerySessionInformation{&A}(INPUT 0, /* {&WTS_CURRNET_SERVER_HANDLE} */
INPUT -1, /* {&WTS_CURRENT_SESSION} */
INPUT 10, /* {&WTS_CLASS_INFO} */
OUTPUT lpInfoClass,
OUTPUT BytesReturned,
OUTPUT intResult).
SET-POINTER-VALUE(lpName) = lpInfoClass.
ASSIGN
ws-client-name = GET-STRING(lpName,1).
SET-SIZE(lpName) = 0.
RETURN (ws-client-name). /* Function return value. */
END FUNCTION.
FUNCTION FuncGetCurrentProcessId RETURNS INTEGER
( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
DEFINE VARIABLE dwProcessId AS INTEGER NO-UNDO.
RUN GetCurrentProcessId(OUTPUT dwProcessID).
RETURN (dwProcessId). /* Function return value. */
END FUNCTION.
FUNCTION FuncProcessIdToSessionId RETURNS INTEGER
( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
DEFINE VARIABLE dwProcessId AS INTEGER NO-UNDO.
DEFINE VARIABLE lpSession AS MEMPTR NO-UNDO.
DEFINE VARIABLE intResult AS INTEGER NO-UNDO.
SET-SIZE(lpSession) = 8.
RUN ProcessIdToSessionId(INPUT FuncGetCurrentProcessID(),
OUTPUT lpSession,
OUTPUT intResult).
IF intResult <> 0 THEN
ASSIGN
dwProcessId = GET-LONG(lpSession,1).
SET-SIZE(lpSession) = 0.
RETURN (dwProcessId). /* Function return value. */
END FUNCTION.
FUNCTION GetComputerName RETURNS CHARACTER
( /* parameter-definitions */ ) :
/*------------------------------------------------------------------------------
Purpose:
Notes:
------------------------------------------------------------------------------*/
&Scoped-define MAX_COMPUTERNAME_LENGTH 16
DEFINE VARIABLE iResult AS INTEGER NO-UNDO.
DEFINE VARIABLE iBufferSize AS INTEGER INITIAL {&MAX_COMPUTERNAME_LENGTH} NO-UNDO.
DEFINE VARIABLE lpToString AS MEMPTR NO-UNDO.
DEFINE VARIABLE cComputerName AS CHARACTER NO-UNDO.
SET-SIZE(lpToString) = {&MAX_COMPUTERNAME_LENGTH}.
RUN GetComputerNameA(OUTPUT lpToString,
INPUT-OUTPUT iBufferSize,
OUTPUT iResult).
IF iResult = 1 THEN
ASSIGN
cComputerName = GET-STRING(lpToString,1).
SET-SIZE(lpToString) = 0.
RETURN (cComputerName).
END FUNCTION.
GetComputerName() - returns the name of the server.
FuncProcessIdToSessionId() - returns the session id, won't be the same number each time you log on.
FuncClientName() - returns the device name whether it's a PC running remote desktop or teminal server or a ThinSTAR/Nutshell 'smart'-terminal
Thanks bendaluz, Simon, Jurjen and Frank Kim @ Microsoft for all your help and suggestions in getting me through this.
Sam