Index: perfdata.c =================================================================== --- perfdata.c (revision 32915) +++ perfdata.c (working copy) @@ -86,6 +86,73 @@ LookupAccountSidW(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use); } +typedef struct _SIDTOUSERNAME +{ + LIST_ENTRY List; + LPWSTR pszName; + ULONG cwcName; + BYTE Data[0]; +} SIDTOUSERNAME, *PSIDTOUSERNAME; + +static LIST_ENTRY SidToUserNameHead = {&SidToUserNameHead, &SidToUserNameHead}; + +// CRITICAL_SECTION CGUFSCritSect; + +VOID +WINAPI +CachedGetUserFromSid( + PSID pSid, + LPWSTR pUserName, + PULONG pcwcUserName) +{ + PLIST_ENTRY pCur; + PSIDTOUSERNAME pEntry; + ULONG cbSid, cwcUserName; + + cwcUserName = *pcwcUserName; + +// EnterCriticalSection(&CGUFSCritSect); + + /* Walk through the list */ + for(pCur = SidToUserNameHead.Flink; + pCur != &SidToUserNameHead; + pCur = pCur->Flink) + { + pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List); + if (EqualSid((PSID)&pEntry->Data, pSid)) + { + wcsncpy(pUserName, pEntry->pszName, cwcUserName); + *pcwcUserName = pEntry->cwcName; + return; + } + } + + /* We didn't find the SID in the list, get the name conventional */ + SidToUserName(pSid, pUserName, cwcUserName); + + /* Allocate a new entry */ + *pcwcUserName = wcslen(pUserName); + cwcUserName = *pcwcUserName + 1; + cbSid = GetLengthSid(pSid); + pEntry = malloc(sizeof(SIDTOUSERNAME) + cbSid + cwcUserName * sizeof(WCHAR)); + + /* Copy the Sid and name to our entry */ + CopySid(cbSid, (PSID)&pEntry->Data, pSid); + pEntry->pszName = (LPWSTR)(pEntry->Data + cbSid); + wcsncpy(pEntry->pszName, pUserName, cwcUserName); + pEntry->cwcName = cwcUserName; + + /* Insert the new entry */ + pEntry->List.Flink = &SidToUserNameHead; + pEntry->List.Blink = SidToUserNameHead.Blink; + SidToUserNameHead.Blink->Flink = &pEntry->List; + SidToUserNameHead.Blink = &pEntry->List; + +// LeaveCriticalSection(&CGUFSCritSect); + + return; +} + void PerfDataRefresh(void) { SIZE_T ulSize; @@ -338,7 +405,9 @@ ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS)); } - SidToUserName(ProcessUser, pPerfData[Idx].UserName, sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0])); + ULONG cwcUserName = sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0]); + CachedGetUserFromSid(ProcessUser, pPerfData[Idx].UserName, &cwcUserName); +// SidToUserName(ProcessUser, pPerfData[Idx].UserName, cwcUserName); if (ProcessSD != NULL) {