VirtualBox

Changeset 47232 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Jul 18, 2013 12:00:49 PM (12 years ago)
Author:
vboxsync
Message:

Windows Guest Additions: Support for querying user idle times.

Location:
trunk/src/VBox/Additions/WINNT
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Installer/InstallHelper/VBoxGuestInstallHelper.cpp

    r47212 r47232  
    124124        StringCchPrintf(szErr, sizeof(szErr), "0");
    125125    pushstring(szErr);
     126}
     127
     128/**
     129 * Connects to VBoxTray IPC under the behalf of the user running
     130 * in the current thread context.
     131 *
     132 * @return  IPRT status code.
     133 * @param   phSession               Where to store the IPC session.
     134 */
     135static int vboxConnectToVBoxTray(RTLOCALIPCSESSION hSession)
     136{
     137    int rc = VINF_SUCCESS;
     138
     139    RTUTF16 wszUserName[255];
     140    DWORD cchUserName = sizeof(wszUserName) / sizeof(RTUTF16);
     141    BOOL fRc = GetUserNameW(wszUserName, &cchUserName);
     142    if (!fRc)
     143        rc = RTErrConvertFromWin32(GetLastError());
     144
     145    if (RT_SUCCESS(rc))
     146    {
     147        char *pszUserName;
     148        rc = RTUtf16ToUtf8(wszUserName, &pszUserName);
     149        if (RT_SUCCESS(rc))
     150        {
     151            char szPipeName[255];
     152            if (RTStrPrintf(szPipeName, sizeof(szPipeName), "%s%s",
     153                            VBOXTRAY_IPC_PIPE_PREFIX, pszUserName))
     154            {
     155                rc = RTLocalIpcSessionConnect(&hSession, szPipeName, 0 /* Flags */);
     156            }
     157            else
     158                rc = VERR_NO_MEMORY;
     159
     160            RTStrFree(pszUserName);
     161        }
     162    }
     163
     164    return rc;
    126165}
    127166
     
    437476            {
    438477                RTLOCALIPCSESSION hSession;
    439                 int rc = RTLocalIpcSessionConnect(&hSession, VBOXTRAY_IPC_PIPENAME, 0 /* Flags */);
     478                int rc = vboxConnectToVBoxTray(hSession);
    440479                if (RT_SUCCESS(rc))
    441480                {
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxIPC.cpp

    r47211 r47232  
    110110    int rc = VINF_SUCCESS;
    111111
     112    /* Note: This only works up to 49.7 days (= 2^32, 32-bit counter)
     113       since Windows was started. */
    112114    LASTINPUTINFO lastInput;
    113115    lastInput.cbSize = sizeof(LASTINPUTINFO);
     
    116118    {
    117119        VBOXTRAYIPCRES_USERLASTINPUT ipcRes;
    118         ipcRes.uTickCount = lastInput.dwTime; /** @sa GetTickCount(). */
     120        ipcRes.uLastInputMs = GetTickCount() - lastInput.dwTime;
    119121        rc = RTLocalIpcSessionWrite(hSession, &ipcRes, sizeof(ipcRes));
    120122    }
     
    143145    *pfStartThread = false;
    144146
    145     gCtx.pEnv = pEnv;
    146     gCtx.hServer = NIL_RTLOCALIPCSERVER;
    147 
    148147    int rc = RTCritSectInit(&gCtx.CritSect);
    149148    if (RT_SUCCESS(rc))
    150149    {
    151         rc = RTLocalIpcServerCreate(&gCtx.hServer, VBOXTRAY_IPC_PIPENAME,
    152                                     RTLOCALIPC_FLAGS_MULTI_SESSION);
    153         if (RT_FAILURE(rc))
    154         {
    155             LogRelFunc(("Creating local IPC server failed with rc=%Rrc\n", rc));
    156             return rc;
    157         }
    158 
    159         RTListInit(&gCtx.SessionList);
    160 
    161         *pfStartThread = true;
    162     }
    163 
     150        RTUTF16 wszUserName[255];
     151        DWORD cchUserName = sizeof(wszUserName) / sizeof(RTUTF16);
     152        BOOL fRc = GetUserNameW(wszUserName, &cchUserName);
     153        if (!fRc)
     154            rc = RTErrConvertFromWin32(GetLastError());
     155
     156        if (RT_SUCCESS(rc))
     157        {
     158            char *pszUserName;
     159            rc = RTUtf16ToUtf8(wszUserName, &pszUserName);
     160            if (RT_SUCCESS(rc))
     161            {
     162                char szPipeName[255];
     163                if (RTStrPrintf(szPipeName, sizeof(szPipeName), "%s%s",
     164                                VBOXTRAY_IPC_PIPE_PREFIX, pszUserName))
     165                {
     166                    rc = RTLocalIpcServerCreate(&gCtx.hServer, szPipeName,
     167                                                RTLOCALIPC_FLAGS_MULTI_SESSION);
     168                    if (RT_SUCCESS(rc))
     169                    {
     170                        RTStrFree(pszUserName);
     171
     172                        gCtx.pEnv = pEnv;
     173                        RTListInit(&gCtx.SessionList);
     174
     175                        *ppInstance = &gCtx;
     176                        *pfStartThread = true;
     177
     178                        LogRelFunc(("Local IPC server now running at \"%s\"\n",
     179                                    szPipeName));
     180                        return VINF_SUCCESS;
     181                    }
     182
     183                }
     184                else
     185                    rc = VERR_NO_MEMORY;
     186
     187                RTStrFree(pszUserName);
     188            }
     189        }
     190
     191        RTCritSectDelete(&gCtx.CritSect);
     192    }
     193
     194    LogRelFunc(("Creating local IPC server failed with rc=%Rrc\n", rc));
    164195    return rc;
    165196}
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxTrayMsg.h

    r47213 r47232  
    1919#define ___VBOXTRAY_MSG_H
    2020
    21 #define VBOXTRAY_IPC_PIPENAME           "VBoxTrayIPCSvc"
     21#define VBOXTRAY_IPC_PIPE_PREFIX      "VBoxTrayIPC-"
    2222
    2323enum VBOXTRAYIPCMSGTYPE
     
    2929    /** Retrieves the current user's last input
    3030     *  time. This will be the user VBoxTray is running
    31      *  under. */
     31     *  under. No actual message for this command
     32     *  required. */
    3233    VBOXTRAYIPCMSGTYPE_USERLASTINPUT  = 120
    3334};
     
    3637typedef struct VBOXTRAYIPCHEADER
    3738{
     39    /** @todo Add magic? */
    3840    /** Header version, must be 0 by now. */
    3941    uint32_t uHdrVersion;
     
    8486typedef struct VBOXTRAYIPCRES_USERLASTINPUT
    8587{
    86     uint32_t uTickCount;
     88    /** Last occurred user input event (in ms). */
     89    uint32_t uLastInputMs;
    8790} VBOXTRAYIPCRES_USERLASTINPUT, *PVBOXTRAYIPCRES_USERLASTINPUT;
    8891
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette