+static
+BOOL
+GetUserAndDomainName(IN HANDLE hToken,
+ OUT LPWSTR *UserName,
+ OUT LPWSTR *DomainName)
+{
+ PSID Sid = NULL;
+ LPWSTR lpUserName = NULL;
+ LPWSTR lpDomainName = NULL;
+ DWORD cbUserName = 0;
+ DWORD cbDomainName = 0;
+ SID_NAME_USE SidNameUse;
+ BOOL bRet = TRUE;
+
+ if (!GetUserSidFromToken(hToken,
+ &Sid))
+ {
+ DPRINT1("GetUserSidFromToken() failed\n");
+ return FALSE;
+ }
+
+ if (!LookupAccountSidW(NULL,
+ Sid,
+ NULL,
+ &cbUserName,
+ NULL,
+ &cbDomainName,
+ &SidNameUse))
+ {
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ bRet = FALSE;
+ goto done;
+ }
+ }
+
+ lpUserName = LocalAlloc(LPTR,
+ cbUserName * sizeof(WCHAR));
+ if (lpUserName == NULL)
+ {
+ bRet = FALSE;
+ goto done;
+ }
+
+ lpDomainName = LocalAlloc(LPTR,
+ cbDomainName * sizeof(WCHAR));
+ if (lpDomainName == NULL)
+ {
+ bRet = FALSE;
+ goto done;
+ }
+
+ if (!LookupAccountSidW(NULL,
+ Sid,
+ lpUserName,
+ &cbUserName,
+ lpDomainName,
+ &cbDomainName,
+ &SidNameUse))
+ {
+ bRet = FALSE;
+ goto done;
+ }
+
+ *UserName = lpUserName;
+ *DomainName = lpDomainName;
+
+done:
+ if (bRet == FALSE)
+ {
+ if (lpUserName != NULL)
+ LocalFree(lpUserName);
+
+ if (lpDomainName != NULL)
+ LocalFree(lpDomainName);
+ }
+
+ LocalFree(Sid);
+
+ return bRet;
+}
+
+