- fixed getting the process owner - build as unicode by default Modified: trunk/reactos/subsys/system/taskmgr/perfdata.c Modified: trunk/reactos/subsys/system/taskmgr/precomp.h Modified: trunk/reactos/subsys/system/taskmgr/taskmgr.xml _____
Modified: trunk/reactos/subsys/system/taskmgr/perfdata.c --- trunk/reactos/subsys/system/taskmgr/perfdata.c 2006-01-21 23:00:16 UTC (rev 20965) +++ trunk/reactos/subsys/system/taskmgr/perfdata.c 2006-01-22 02:43:36 UTC (rev 20966) @@ -38,9 +38,11 @@
SYSTEM_CACHE_INFORMATION SystemCacheInfo; SYSTEM_HANDLE_INFORMATION SystemHandleInfo; PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION SystemProcessorTimeInfo = NULL; +PSID SystemUserSid = NULL;
BOOL PerfDataInitialize(void) { + SID_IDENTIFIER_AUTHORITY NtSidAuthority = {SECURITY_NT_AUTHORITY}; NTSTATUS status;
InitializeCriticalSection(&PerfDataCriticalSection); @@ -52,14 +54,34 @@ if (status != NO_ERROR) return FALSE;
+ /* + * Create the SYSTEM Sid + */ + AllocateAndInitializeSid(&NtSidAuthority, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &SystemUserSid); return TRUE; }
void PerfDataUninitialize(void) { DeleteCriticalSection(&PerfDataCriticalSection); + + if (SystemUserSid != NULL) + { + FreeSid(SystemUserSid); + SystemUserSid = NULL; + } }
+static void SidToUserName(PSID Sid, LPTSTR szBuffer, DWORD BufferSize) +{ + static TCHAR szDomainNameUnused[255]; + DWORD DomainNameLen = sizeof(szDomainNameUnused) / sizeof(szDomainNameUnused[0]); + SID_NAME_USE Use; + + if (Sid != NULL) + LookupAccountSid(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use); +} + void PerfDataRefresh(void) { ULONG ulSize; @@ -70,15 +92,14 @@ PPERFDATA pPDOld; ULONG Idx, Idx2; HANDLE hProcess; - HANDLE hProcessToken; - TCHAR szTemp[MAX_PATH]; - DWORD dwSize; 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; + PSID ProcessUser;
/* Get new system time */ status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0); @@ -259,33 +280,14 @@ pPerfData[Idx].HandleCount = pSPI->HandleCount; pPerfData[Idx].ThreadCount = pSPI->NumberOfThreads; pPerfData[Idx].SessionId = pSPI->SessionId; + pPerfData[Idx].UserName[0] = _T('\0'); + ProcessUser = SystemUserSid;
if (pSPI->UniqueProcessId != NULL) { - hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, (DWORD)pSPI->UniqueProcessId); + hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | READ_CONTROL, FALSE, PtrToUlong(pSPI->UniqueProcessId)); if (hProcess) { - if (OpenProcessToken(hProcess, TOKEN_QUERY|TOKEN_DUPLICATE|TOKEN_IMPERSONATE, &hProcessToken)) { - ImpersonateLoggedOnUser(hProcessToken); - memset(szTemp, 0, sizeof(TCHAR[MAX_PATH])); - dwSize = MAX_PATH; - GetUserName(szTemp, &dwSize); -#ifndef UNICODE - MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szTemp, -1, pPerfData[Idx].UserName, MAX_PATH); -/* -int MultiByteToWideChar( - UINT CodePage, // code page - DWORD dwFlags, // character-type options - LPCSTR lpMultiByteStr, // string to map - int cbMultiByte, // number of bytes in string - LPWSTR lpWideCharStr, // wide-character buffer - int cchWideChar // size of buffer -); - */ -#endif - RevertToSelf(); - CloseHandle(hProcessToken); - } else { - pPerfData[Idx].UserName[0] = _T('\0'); - } + 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); @@ -296,11 +298,18 @@ } else { ClearInfo: /* clear information we were unable to fetch */ - pPerfData[Idx].UserName[0] = _T('\0'); pPerfData[Idx].USERObjectCount = 0; pPerfData[Idx].GDIObjectCount = 0; ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS)); } + + SidToUserName(ProcessUser, pPerfData[Idx].UserName, sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0])); + + if (ProcessSD != NULL) + { + LocalFree((HLOCAL)ProcessSD); + } + pPerfData[Idx].UserTime.QuadPart = pSPI->UserTime.QuadPart; pPerfData[Idx].KernelTime.QuadPart = pSPI->KernelTime.QuadPart; pSPI = (PSYSTEM_PROCESS_INFORMATION)((LPBYTE)pSPI + pSPI->NextEntryOffset); _____
Modified: trunk/reactos/subsys/system/taskmgr/precomp.h --- trunk/reactos/subsys/system/taskmgr/precomp.h 2006-01-21 23:00:16 UTC (rev 20965) +++ trunk/reactos/subsys/system/taskmgr/precomp.h 2006-01-22 02:43:36 UTC (rev 20966) @@ -7,6 +7,7 @@
#include <ndk/ntndk.h> #include <commctrl.h> #include <shellapi.h> +#include <aclapi.h> #include <stdlib.h> #include <math.h> #include <tchar.h> _____
Modified: trunk/reactos/subsys/system/taskmgr/taskmgr.xml --- trunk/reactos/subsys/system/taskmgr/taskmgr.xml 2006-01-21 23:00:16 UTC (rev 20965) +++ trunk/reactos/subsys/system/taskmgr/taskmgr.xml 2006-01-22 02:43:36 UTC (rev 20966) @@ -3,6 +3,8 @@
<define name="__USE_W32API" /> <define name="_WIN32_IE">0x0501</define> <define name="_WIN32_WINNT">0x0501</define> + <define name="UNICODE" /> + <define name="_UNICODE" /> <library>ntdll</library> <library>kernel32</library> <library>user32</library>