VirtualBox

Changeset 47232 in vbox for trunk/src/VBox


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

Windows Guest Additions: Support for querying user idle times.

Location:
trunk/src/VBox/Additions
Files:
4 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
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp

    r46593 r47232  
    3131#include <iprt/assert.h>
    3232#include <iprt/ldr.h>
     33#include <iprt/localipc.h>
    3334#include <iprt/mem.h>
    3435#include <iprt/thread.h>
     
    4041#include "VBoxServiceInternal.h"
    4142#include "VBoxServiceUtils.h"
     43#include "../../WINNT/VBoxTray/VBoxTrayMsg.h" /* For IPC. */
    4244
    4345static uint32_t s_uGuestPropClientID = 0;
     
    9092int  VBoxServiceVMInfoWinProcessesEnumerate(PVBOXSERVICEVMINFOPROC *ppProc, DWORD *pdwCount);
    9193void VBoxServiceVMInfoWinProcessesFree(DWORD cProcs, PVBOXSERVICEVMINFOPROC paProcs);
     94int vboxServiceVMInfoWinWriteLastInput(char *pszUser);
    9295
    9396typedef BOOL WINAPI FNQUERYFULLPROCESSIMAGENAME(HANDLE,  DWORD, LPTSTR, PDWORD);
     
    805808
    806809
     810static int vboxServiceVMInfoWinWriteLastInput(char *pszUser)
     811{
     812    AssertPtrReturn(pszUser, VERR_INVALID_POINTER);
     813
     814    int rc = VINF_SUCCESS;
     815
     816    char szPipeName[255];
     817    if (RTStrPrintf(szPipeName, sizeof(szPipeName), "%s%s",
     818                    VBOXTRAY_IPC_PIPE_PREFIX, pszUser))
     819    {
     820        RTLOCALIPCSESSION hSession;
     821        rc = RTLocalIpcSessionConnect(&hSession, szPipeName, 0 /* Flags */);
     822        if (RT_SUCCESS(rc))
     823        {
     824            VBOXTRAYIPCHEADER ipcHdr = { 0 /* Header version */,
     825                                         VBOXTRAYIPCMSGTYPE_USERLASTINPUT, 0 /* No msg */ };
     826
     827            rc = RTLocalIpcSessionWrite(hSession, &ipcHdr, sizeof(ipcHdr));
     828
     829            VBOXTRAYIPCRES_USERLASTINPUT ipcRes;
     830            if (RT_SUCCESS(rc))
     831                rc = RTLocalIpcSessionRead(hSession, &ipcRes, sizeof(ipcRes),
     832                                           NULL /* Exact read */);
     833            if (RT_SUCCESS(rc))
     834            {
     835                if (ipcRes.uLastInputMs)
     836                    VBoxServiceVerbose(4, "User \"%s\" is idle for %RU32ms\n",
     837                                       pszUser, ipcRes.uLastInputMs);
     838            }
     839#ifdef DEBUG
     840            VBoxServiceVerbose(4, "Querying last input for user \"%s\" ended with rc=%Rrc\n",
     841                               pszUser, rc);
     842#endif
     843            int rc2 = RTLocalIpcSessionClose(hSession);
     844            if (RT_SUCCESS(rc))
     845                rc = rc2;
     846        }
     847        else
     848        {
     849            switch (rc)
     850            {
     851                case VERR_FILE_NOT_FOUND:
     852                    /* No VBoxTray (or too old version which does not support IPC) running
     853                       for the given user. Not much we can do then. */
     854                    VBoxServiceVerbose(4, "User \"%s\" not logged in, no last input available\n",
     855                                       pszUser);
     856                    break;
     857
     858                default:
     859                    VBoxServiceVerbose(4, "Error querying last input for user \"%s\", rc=%Rrc\n",
     860                                       pszUser, rc);
     861                    break;
     862            }
     863
     864            rc = VINF_SUCCESS;
     865        }
     866    }
     867
     868    return rc;
     869}
     870
     871
    807872/**
    808873 * Retrieves the currently logged in users and stores their names along with the
     
    9951060                    *pcUsersInList += 1;
    9961061
    997                     char *pszTemp;
    998                     int rc2 = RTUtf16ToUtf8(pUserInfo[i].wszUser, &pszTemp);
     1062                    char *pszUser;
     1063                    int rc2 = RTUtf16ToUtf8(pUserInfo[i].wszUser, &pszUser);
    9991064                    if (RT_SUCCESS(rc2))
    10001065                    {
    1001                         rc = RTStrAAppend(ppszUserList, pszTemp);
    1002                         RTMemFree(pszTemp);
     1066                        rc = RTStrAAppend(ppszUserList, pszUser);
     1067                        if (RT_SUCCESS(rc))
     1068                            rc = vboxServiceVMInfoWinWriteLastInput(pszUser);
     1069                        RTMemFree(pszUser);
    10031070                    }
    10041071                    else
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