Index: /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp
===================================================================
--- /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp	(revision 53331)
+++ /trunk/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo-win.cpp	(revision 53332)
@@ -98,5 +98,5 @@
 int vboxServiceVMInfoWinWriteLastInput(PVBOXSERVICEVEPROPCACHE pCache, const char *pszUser, const char *pszDomain);
 
-typedef BOOL WINAPI FNQUERYFULLPROCESSIMAGENAME(HANDLE,  DWORD, LPTSTR, PDWORD);
+typedef BOOL WINAPI FNQUERYFULLPROCESSIMAGENAME(HANDLE,  DWORD, LPWSTR, PDWORD);
 typedef FNQUERYFULLPROCESSIMAGENAME *PFNQUERYFULLPROCESSIMAGENAME;
 
@@ -130,14 +130,10 @@
  *
  * @return  IPRT status code.
- * @param   pProc
- * @param   pszBuf
- * @param   cbBuf
  */
-static int VBoxServiceVMInfoWinProcessesGetModuleName(PVBOXSERVICEVMINFOPROC const pProc,
-                                                      TCHAR *pszName, size_t cbName)
+static int VBoxServiceVMInfoWinProcessesGetModuleNameA(PVBOXSERVICEVMINFOPROC const pProc,
+                                                       char **ppszName)
 {
     AssertPtrReturn(pProc, VERR_INVALID_POINTER);
-    AssertPtrReturn(pszName, VERR_INVALID_POINTER);
-    AssertReturn(cbName, VERR_INVALID_PARAMETER);
+    AssertPtrReturn(ppszName, VERR_INVALID_POINTER);
 
     /** @todo Only do this once. Later. */
@@ -171,6 +167,8 @@
         /* Since GetModuleFileNameEx has trouble with cross-bitness stuff (32-bit apps cannot query 64-bit
            apps and vice verse) we have to use a different code path for Vista and up. */
-
-        /* Note: For 2000 + NT4 we might just use GetModuleFileName() instead. */
+        WCHAR wszName[_1K];
+        DWORD dwLen = sizeof(wszName);
+
+        /* Note: For 2000 + NT4 we might just use GetModuleFileNameW() instead. */
         if (OSInfoEx.dwMajorVersion >= 6 /* Vista or later */)
         {
@@ -179,14 +177,8 @@
             PFNQUERYFULLPROCESSIMAGENAME pfnQueryFullProcessImageName;
             pfnQueryFullProcessImageName = (PFNQUERYFULLPROCESSIMAGENAME)
-                RTLdrGetSystemSymbol("kernel32.dll", "QueryFullProcessImageNameA");
-            /** @todo r=bird: WTF don't we query the UNICODE name? */
+                RTLdrGetSystemSymbol("kernel32.dll", "QueryFullProcessImageNameW");
             if (pfnQueryFullProcessImageName)
             {
-                /** @todo r=bird: Completely bogus use of TCHAR.
-                 *  !!ALL USE OF TCHAR IS HEREWITH BANNED IN ALL VBOX SOURCES!!
-                 *  We use WCHAR when talking to windows, everything else is WRONG. (We don't
-                 *  want Chinese MBCS being treated as UTF-8.) */
-                DWORD dwLen = cbName / sizeof(TCHAR);
-                if (!pfnQueryFullProcessImageName(h, 0 /*PROCESS_NAME_NATIVE*/, pszName, &dwLen))
+                if (!pfnQueryFullProcessImageName(h, 0 /*PROCESS_NAME_NATIVE*/, wszName, &dwLen))
                     rc = VERR_ACCESS_DENIED;
             }
@@ -194,6 +186,20 @@
         else
         {
-            if (!GetModuleFileNameEx(h, NULL /* Get main executable */, pszName, cbName / sizeof(TCHAR)))
+            if (!GetModuleFileNameExW(h, NULL /* Get main executable */, wszName, dwLen))
                 rc = VERR_ACCESS_DENIED;
+        }
+
+        if (   RT_FAILURE(rc)
+            && g_cVerbosity > 3)
+        {
+           VBoxServiceError("Unable to retrieve process name for PID=%ld, error=%ld\n",
+                             pProc->id, GetLastError());
+        }
+        else
+        {
+            char *pszName;
+            rc = RTUtf16ToUtf8(wszName, &pszName);
+            if (RT_SUCCESS(rc))
+                *ppszName = pszName;
         }
 
@@ -577,15 +583,7 @@
      */
     uint32_t cNumProcs = 0;
+
     for (DWORD i = 0; i < cProcs; i++)
     {
-        if (g_cVerbosity)
-        {
-            TCHAR szModule[_1K];
-            rc = VBoxServiceVMInfoWinProcessesGetModuleName(&paProcs[i], szModule, sizeof(szModule));
-            if (RT_SUCCESS(rc))
-                VBoxServiceVerbose(4, "PID=%ld: %s\n",
-                                   paProcs[i].id, szModule);
-        }
-
         PSID pProcSID = paProcs[i].pSid;
         if (   RT_SUCCESS(rc)
@@ -593,10 +591,23 @@
             && IsValidSid(pProcSID))
         {
-            if (   EqualSid(pSessionData->Sid, paProcs[i].pSid)
-                && paProcs[i].fInteractive)
+            if (EqualSid(pSessionData->Sid, paProcs[i].pSid))
             {
-                cNumProcs++;
-                if (!g_cVerbosity) /* We want a bit more info on higher verbosity. */
-                    break;
+                if (g_cVerbosity)
+                {
+                    char *pszName;
+                    int rc2 = VBoxServiceVMInfoWinProcessesGetModuleNameA(&paProcs[i], &pszName);
+                    VBoxServiceVerbose(4, "Session %RU32: PID=%ld (fInt=%RTbool): %s\n",
+                                       pSessionData->Session, paProcs[i].id, paProcs[i].fInteractive,
+                                       RT_SUCCESS(rc2) ? pszName : "<Unknown>");
+                    if (RT_SUCCESS(rc2))
+                        RTStrFree(pszName);
+                }
+
+                if (paProcs[i].fInteractive)
+                {
+                    cNumProcs++;
+                    if (!g_cVerbosity) /* We want a bit more info on higher verbosity. */
+                        break;
+                }
             }
         }
