try to get the user from the token and fall back to reading the owner from the process when needed
Modified: trunk/reactos/subsys/system/taskmgr/perfdata.c

Modified: trunk/reactos/subsys/system/taskmgr/perfdata.c
--- trunk/reactos/subsys/system/taskmgr/perfdata.c	2006-01-22 03:53:02 UTC (rev 20970)
+++ trunk/reactos/subsys/system/taskmgr/perfdata.c	2006-01-22 04:20:30 UTC (rev 20971)
@@ -92,14 +92,16 @@
     PPERFDATA                        pPDOld;
     ULONG                            Idx, Idx2;
     HANDLE                            hProcess;
+    HANDLE                            hProcessToken;
     SYSTEM_PERFORMANCE_INFORMATION    SysPerfInfo;
     SYSTEM_TIMEOFDAY_INFORMATION      SysTimeInfo;
     SYSTEM_CACHE_INFORMATION        SysCacheInfo;
     LPBYTE                            SysHandleInfoData;
     PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SysProcessorTimeInfo;
     double                            CurrentKernelTime;
-    PSECURITY_DESCRIPTOR              ProcessSD = NULL;
+    PSECURITY_DESCRIPTOR              ProcessSD;
     PSID                              ProcessUser;
+    ULONG                             Buffer[64]; /* must be 4 bytes aligned! */
 
     /* Get new system time */
     status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0);
@@ -281,15 +283,41 @@
         pPerfData[Idx].ThreadCount = pSPI->NumberOfThreads;
         pPerfData[Idx].SessionId = pSPI->SessionId;
         pPerfData[Idx].UserName[0] = _T('\0');
+        pPerfData[Idx].USERObjectCount = 0;
+        pPerfData[Idx].GDIObjectCount = 0;
         ProcessUser = SystemUserSid;
+        ProcessSD = NULL;
 
         if (pSPI->UniqueProcessId != NULL) {
             hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId));
             if (hProcess) {
-                GetSecurityInfo(hProcess, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &ProcessUser, NULL, NULL, NULL, &ProcessSD);
+                /* don't query the information of the system process. It's possible but
+                   returns Administrators as the owner of the process instead of SYSTEM */
+                if (pSPI->UniqueProcessId != (HANDLE)0x4)
+                {
+                    if (OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
+                    {
+                        DWORD RetLen = 0;
+                        BOOL Ret;
 
-                pPerfData[Idx].USERObjectCount = GetGuiResources(hProcess, GR_USEROBJECTS);
-                pPerfData[Idx].GDIObjectCount = GetGuiResources(hProcess, GR_GDIOBJECTS);
+                        Ret = GetTokenInformation(hProcessToken, TokenUser, (LPVOID)Buffer, sizeof(Buffer), &RetLen);
+                        CloseHandle(hProcessToken);
+
+                        if (Ret)
+                            ProcessUser = ((PTOKEN_USER)Buffer)->User.Sid;
+                        else
+                            goto ReadProcOwner;
+                    }
+                    else
+                    {
+ReadProcOwner:
+                        GetSecurityInfo(hProcess, SE_KERNEL_OBJECT, OWNER_SECURITY_INFORMATION, &ProcessUser, NULL, NULL, NULL, &ProcessSD);
+                    }
+
+                    pPerfData[Idx].USERObjectCount = GetGuiResources(hProcess, GR_USEROBJECTS);
+                    pPerfData[Idx].GDIObjectCount = GetGuiResources(hProcess, GR_GDIOBJECTS);
+                }
+
                 GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters);
                 CloseHandle(hProcess);
             } else {
@@ -298,8 +326,6 @@
         } else {
 ClearInfo:
             /* clear information we were unable to fetch */
-            pPerfData[Idx].USERObjectCount = 0;
-            pPerfData[Idx].GDIObjectCount = 0;
             ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS));
         }