VirtualBox

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

Windows Guest Additions: Support for querying user idle times.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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