xref: /aoo4110/main/sal/osl/w32/security.c (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include "system.h"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <osl/security.h>
28*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
29*b1cdbd2cSJim Jagielski #include <osl/thread.h>
30*b1cdbd2cSJim Jagielski #include <osl/file.h>
31*b1cdbd2cSJim Jagielski #include <systools/win32/uwinapi.h>
32*b1cdbd2cSJim Jagielski #include "secimpl.h"
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski /*****************************************************************************/
35*b1cdbd2cSJim Jagielski /* Data Type Definition */
36*b1cdbd2cSJim Jagielski /*****************************************************************************/
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski /* Data for use in (un)LoadProfile Functions */
40*b1cdbd2cSJim Jagielski /* Declarations based on USERENV.H for Windows 2000 Beta 2 */
41*b1cdbd2cSJim Jagielski #define PI_NOUI         0x00000001   // Prevents displaying of messages
42*b1cdbd2cSJim Jagielski #define PI_APPLYPOLICY  0x00000002   // Apply NT4 style policy
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski typedef struct _PROFILEINFOW {
45*b1cdbd2cSJim Jagielski   DWORD    dwSize;          // Must be set to sizeof(PROFILEINFO)
46*b1cdbd2cSJim Jagielski   DWORD    dwFlags;         // See flags above
47*b1cdbd2cSJim Jagielski   LPWSTR   lpUserName;      // User name (required)
48*b1cdbd2cSJim Jagielski   LPWSTR   lpProfilePath;   // Roaming profile path
49*b1cdbd2cSJim Jagielski   LPWSTR   lpDefaultPath;   // Default user profile path
50*b1cdbd2cSJim Jagielski   LPWSTR   lpServerName;    // Validating DC name in netbios format
51*b1cdbd2cSJim Jagielski   LPWSTR   lpPolicyPath;    // Path to the NT4 style policy file
52*b1cdbd2cSJim Jagielski   HANDLE   hProfile;        // Registry key handle - filled by function
53*b1cdbd2cSJim Jagielski } PROFILEINFOW, FAR * LPPROFILEINFOW;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski /* Typedefs for function pointers in USERENV.DLL */
56*b1cdbd2cSJim Jagielski typedef BOOL (STDMETHODCALLTYPE FAR * LPFNLOADUSERPROFILE) (
57*b1cdbd2cSJim Jagielski   HANDLE hToken,
58*b1cdbd2cSJim Jagielski   LPPROFILEINFOW lpProfileInfo
59*b1cdbd2cSJim Jagielski );
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski typedef BOOL (STDMETHODCALLTYPE FAR * LPFNUNLOADUSERPROFILE) (
62*b1cdbd2cSJim Jagielski   HANDLE hToken,
63*b1cdbd2cSJim Jagielski   HANDLE hProfile
64*b1cdbd2cSJim Jagielski );
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETUSERPROFILEDIR) (
67*b1cdbd2cSJim Jagielski   HANDLE hToken,
68*b1cdbd2cSJim Jagielski   LPTSTR lpProfileDir,
69*b1cdbd2cSJim Jagielski   LPDWORD lpcchSize
70*b1cdbd2cSJim Jagielski );
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski /* To get an impersonation token we need to create an impersonation
73*b1cdbd2cSJim Jagielski    duplicate so every access token has to be created with duplicate
74*b1cdbd2cSJim Jagielski    access rights */
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski #define TOKEN_DUP_QUERY	(TOKEN_QUERY|TOKEN_DUPLICATE)
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski /*****************************************************************************/
79*b1cdbd2cSJim Jagielski /* Static Module Function Declarations */
80*b1cdbd2cSJim Jagielski /*****************************************************************************/
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski static sal_Bool isWNT(void);
83*b1cdbd2cSJim Jagielski static sal_Bool GetSpecialFolder(rtl_uString **strPath,int nFolder);
84*b1cdbd2cSJim Jagielski static BOOL Privilege(LPTSTR pszPrivilege, BOOL bEnable);
85*b1cdbd2cSJim Jagielski static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName, sal_Bool bIncludeDomain);
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski /*****************************************************************************/
88*b1cdbd2cSJim Jagielski /* Exported Module Functions */
89*b1cdbd2cSJim Jagielski /*****************************************************************************/
90*b1cdbd2cSJim Jagielski 
osl_getCurrentSecurity(void)91*b1cdbd2cSJim Jagielski oslSecurity SAL_CALL osl_getCurrentSecurity(void)
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski     oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 	pSecImpl->m_pNetResource = NULL;
96*b1cdbd2cSJim Jagielski 	pSecImpl->m_User[0] = '\0';
97*b1cdbd2cSJim Jagielski 	pSecImpl->m_hToken = NULL;
98*b1cdbd2cSJim Jagielski 	pSecImpl->m_hProfile = NULL;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski 	return ((oslSecurity)pSecImpl);
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski 
osl_loginUser(rtl_uString * strUserName,rtl_uString * strPasswd,oslSecurity * pSecurity)103*b1cdbd2cSJim Jagielski oslSecurityError SAL_CALL osl_loginUser( rtl_uString *strUserName, rtl_uString *strPasswd, oslSecurity *pSecurity )
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski 	oslSecurityError ret;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 	if (!isWNT())
108*b1cdbd2cSJim Jagielski 	{
109*b1cdbd2cSJim Jagielski 		*pSecurity = osl_getCurrentSecurity();
110*b1cdbd2cSJim Jagielski 		ret = osl_Security_E_None;
111*b1cdbd2cSJim Jagielski 	}
112*b1cdbd2cSJim Jagielski 	else
113*b1cdbd2cSJim Jagielski 	{
114*b1cdbd2cSJim Jagielski 		sal_Unicode*	strUser;
115*b1cdbd2cSJim Jagielski 		sal_Unicode*	strDomain = _wcsdup(rtl_uString_getStr(strUserName));
116*b1cdbd2cSJim Jagielski 		HANDLE	hUserToken;
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski         #if OSL_DEBUG_LEVEL > 0
119*b1cdbd2cSJim Jagielski 		    LUID luid;
120*b1cdbd2cSJim Jagielski 		#endif
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 		if (NULL != (strUser = wcschr(strDomain, L'/')))
123*b1cdbd2cSJim Jagielski 			*strUser++ = L'\0';
124*b1cdbd2cSJim Jagielski 		else
125*b1cdbd2cSJim Jagielski 		{
126*b1cdbd2cSJim Jagielski 			strUser   = strDomain;
127*b1cdbd2cSJim Jagielski 			strDomain = NULL;
128*b1cdbd2cSJim Jagielski 		}
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 		// this process must have the right: 'act as a part of operatingsystem'
131*b1cdbd2cSJim Jagielski 		OSL_ASSERT(LookupPrivilegeValue(NULL, SE_TCB_NAME, &luid));
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 		if (LogonUserW(strUser, strDomain ? strDomain : L"", rtl_uString_getStr(strPasswd),
134*b1cdbd2cSJim Jagielski 					  LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
135*b1cdbd2cSJim Jagielski 		 			  &hUserToken))
136*b1cdbd2cSJim Jagielski 		{
137*b1cdbd2cSJim Jagielski 			oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 			pSecImpl->m_pNetResource = NULL;
140*b1cdbd2cSJim Jagielski 			pSecImpl->m_hToken = hUserToken;
141*b1cdbd2cSJim Jagielski 			pSecImpl->m_hProfile = NULL;
142*b1cdbd2cSJim Jagielski 			wcscpy(pSecImpl->m_User, strUser);
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski 			*pSecurity = (oslSecurity)pSecImpl;
145*b1cdbd2cSJim Jagielski 			ret = osl_Security_E_None;
146*b1cdbd2cSJim Jagielski 		}
147*b1cdbd2cSJim Jagielski 		else
148*b1cdbd2cSJim Jagielski 			ret = osl_Security_E_UserUnknown;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 		if (strDomain)
151*b1cdbd2cSJim Jagielski 			free(strDomain);
152*b1cdbd2cSJim Jagielski 		else
153*b1cdbd2cSJim Jagielski 			free(strUser);
154*b1cdbd2cSJim Jagielski 	}
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 	return ret;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski 
osl_loginUserOnFileServer(rtl_uString * strUserName,rtl_uString * strPasswd,rtl_uString * strFileServer,oslSecurity * pSecurity)159*b1cdbd2cSJim Jagielski oslSecurityError SAL_CALL osl_loginUserOnFileServer(rtl_uString *strUserName,
160*b1cdbd2cSJim Jagielski 													rtl_uString *strPasswd,
161*b1cdbd2cSJim Jagielski 													rtl_uString *strFileServer,
162*b1cdbd2cSJim Jagielski 													oslSecurity *pSecurity)
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski 	oslSecurityError 	ret;
165*b1cdbd2cSJim Jagielski 	DWORD 				err;
166*b1cdbd2cSJim Jagielski 	NETRESOURCEW 		netResource;
167*b1cdbd2cSJim Jagielski 	sal_Unicode* 				remoteName;
168*b1cdbd2cSJim Jagielski 	sal_Unicode*				userName;
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	remoteName 	= malloc(rtl_uString_getLength(strFileServer) + rtl_uString_getLength(strUserName) + 4);
171*b1cdbd2cSJim Jagielski 	userName 	= malloc(rtl_uString_getLength(strFileServer) + rtl_uString_getLength(strUserName) + 2);
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	wcscpy(remoteName, L"\\\\");
174*b1cdbd2cSJim Jagielski 	wcscat(remoteName, rtl_uString_getStr(strFileServer));
175*b1cdbd2cSJim Jagielski 	wcscat(remoteName, L"\\");
176*b1cdbd2cSJim Jagielski 	wcscat(remoteName, rtl_uString_getStr(strUserName));
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	wcscpy(userName, rtl_uString_getStr(strFileServer));
179*b1cdbd2cSJim Jagielski 	wcscat(userName, L"\\");
180*b1cdbd2cSJim Jagielski 	wcscat(userName, rtl_uString_getStr(strUserName));
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 	netResource.dwScope 		= RESOURCE_GLOBALNET;
183*b1cdbd2cSJim Jagielski 	netResource.dwType			= RESOURCETYPE_DISK;
184*b1cdbd2cSJim Jagielski 	netResource.dwDisplayType 	= RESOURCEDISPLAYTYPE_SHARE;
185*b1cdbd2cSJim Jagielski 	netResource.dwUsage 		= RESOURCEUSAGE_CONNECTABLE;
186*b1cdbd2cSJim Jagielski 	netResource.lpLocalName 	= NULL;
187*b1cdbd2cSJim Jagielski 	netResource.lpRemoteName 	= remoteName;
188*b1cdbd2cSJim Jagielski 	netResource.lpComment 		= NULL;
189*b1cdbd2cSJim Jagielski 	netResource.lpProvider 		= NULL;
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	err = WNetAddConnection2W(&netResource, rtl_uString_getStr(strPasswd), userName, 0);
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	if ((err == NO_ERROR) || (err == ERROR_ALREADY_ASSIGNED))
194*b1cdbd2cSJim Jagielski 	{
195*b1cdbd2cSJim Jagielski 	    oslSecurityImpl* pSecImpl = malloc(sizeof(oslSecurityImpl));
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 		pSecImpl->m_pNetResource = malloc(sizeof(NETRESOURCE));
198*b1cdbd2cSJim Jagielski 		*pSecImpl->m_pNetResource = netResource;
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 		pSecImpl->m_hToken = NULL;
201*b1cdbd2cSJim Jagielski 		pSecImpl->m_hProfile = NULL;
202*b1cdbd2cSJim Jagielski 		wcscpy(pSecImpl->m_User, rtl_uString_getStr(strUserName));
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 		*pSecurity = (oslSecurity)pSecImpl;
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 		ret = osl_Security_E_None;
207*b1cdbd2cSJim Jagielski 	}
208*b1cdbd2cSJim Jagielski 	else
209*b1cdbd2cSJim Jagielski 		ret = osl_Security_E_UserUnknown;
210*b1cdbd2cSJim Jagielski 
211*b1cdbd2cSJim Jagielski 	free(remoteName);
212*b1cdbd2cSJim Jagielski 	free(userName);
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	return ret;
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 
CheckTokenMembership_Stub(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember)218*b1cdbd2cSJim Jagielski static BOOL	WINAPI CheckTokenMembership_Stub( HANDLE TokenHandle, PSID SidToCheck, PBOOL IsMember )
219*b1cdbd2cSJim Jagielski {
220*b1cdbd2cSJim Jagielski 	typedef BOOL (WINAPI *CheckTokenMembership_PROC)( HANDLE, PSID, PBOOL );
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 	static HMODULE	hModule = NULL;
223*b1cdbd2cSJim Jagielski 	static CheckTokenMembership_PROC	pCheckTokenMembership = NULL;
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	if ( !hModule )
226*b1cdbd2cSJim Jagielski 	{
227*b1cdbd2cSJim Jagielski 		/* SAL is always linked against ADVAPI32 so we can rely on that it is already mapped */
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 		hModule = GetModuleHandleA( "ADVAPI32.DLL" );
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 		pCheckTokenMembership = (CheckTokenMembership_PROC)GetProcAddress( hModule, "CheckTokenMembership" );
232*b1cdbd2cSJim Jagielski 	}
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 	if ( pCheckTokenMembership )
235*b1cdbd2cSJim Jagielski 		return pCheckTokenMembership( TokenHandle, SidToCheck, IsMember );
236*b1cdbd2cSJim Jagielski 	else
237*b1cdbd2cSJim Jagielski 	{
238*b1cdbd2cSJim Jagielski 		SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
239*b1cdbd2cSJim Jagielski 		return FALSE;
240*b1cdbd2cSJim Jagielski 	}
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 
osl_isAdministrator(oslSecurity Security)245*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security)
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski     if (Security != NULL)
248*b1cdbd2cSJim Jagielski 	{
249*b1cdbd2cSJim Jagielski 		/* ts: on Window 95 systems any user seems to be an adminstrator */
250*b1cdbd2cSJim Jagielski 		if (!isWNT())
251*b1cdbd2cSJim Jagielski 		{
252*b1cdbd2cSJim Jagielski 			return(sal_True);
253*b1cdbd2cSJim Jagielski 		}
254*b1cdbd2cSJim Jagielski 		else
255*b1cdbd2cSJim Jagielski 		{
256*b1cdbd2cSJim Jagielski 			HANDLE						hImpersonationToken = NULL;
257*b1cdbd2cSJim Jagielski 			PSID 						psidAdministrators;
258*b1cdbd2cSJim Jagielski 			SID_IDENTIFIER_AUTHORITY 	siaNtAuthority = SECURITY_NT_AUTHORITY;
259*b1cdbd2cSJim Jagielski 			sal_Bool 					bSuccess = sal_False;
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 			/* If Security contains an access token we need to duplicate it to an impersonation
263*b1cdbd2cSJim Jagielski 			   access token. NULL works with CheckTokenMembership() as the current effective
264*b1cdbd2cSJim Jagielski 			   impersonation token
265*b1cdbd2cSJim Jagielski 			 */
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski 			if ( ((oslSecurityImpl*)Security)->m_hToken )
268*b1cdbd2cSJim Jagielski 			{
269*b1cdbd2cSJim Jagielski 				if ( !DuplicateToken (((oslSecurityImpl*)Security)->m_hToken, SecurityImpersonation, &hImpersonationToken) )
270*b1cdbd2cSJim Jagielski 					return sal_False;
271*b1cdbd2cSJim Jagielski 			}
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 			/* CheckTokenMembership() can be used on W2K and higher (NT4 no longer supported by OOo)
274*b1cdbd2cSJim Jagielski 			   and also works on Vista to retrieve the effective user rights. Just checking for
275*b1cdbd2cSJim Jagielski 			   membership of Administrators group is not enough on Vista this would require additional
276*b1cdbd2cSJim Jagielski 			   complicated checks as described in KB arcticle Q118626: http://support.microsoft.com/kb/118626/en-us
277*b1cdbd2cSJim Jagielski 			*/
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 			if (AllocateAndInitializeSid(&siaNtAuthority,
280*b1cdbd2cSJim Jagielski 										 2,
281*b1cdbd2cSJim Jagielski 			 							 SECURITY_BUILTIN_DOMAIN_RID,
282*b1cdbd2cSJim Jagielski 			 							 DOMAIN_ALIAS_RID_ADMINS,
283*b1cdbd2cSJim Jagielski 			 							 0, 0, 0, 0, 0, 0,
284*b1cdbd2cSJim Jagielski 			 							 &psidAdministrators))
285*b1cdbd2cSJim Jagielski 			{
286*b1cdbd2cSJim Jagielski 				BOOL	fSuccess = FALSE;
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 				if ( CheckTokenMembership_Stub( hImpersonationToken, psidAdministrators, &fSuccess ) && fSuccess )
289*b1cdbd2cSJim Jagielski 					bSuccess = sal_True;
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 				FreeSid(psidAdministrators);
292*b1cdbd2cSJim Jagielski 			}
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 			if ( hImpersonationToken )
295*b1cdbd2cSJim Jagielski 				CloseHandle( hImpersonationToken );
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 			return (bSuccess);
298*b1cdbd2cSJim Jagielski 		}
299*b1cdbd2cSJim Jagielski 	}
300*b1cdbd2cSJim Jagielski 	else
301*b1cdbd2cSJim Jagielski 		return (sal_False);
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 
osl_freeSecurityHandle(oslSecurity Security)305*b1cdbd2cSJim Jagielski void SAL_CALL osl_freeSecurityHandle(oslSecurity Security)
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski 	if (Security)
308*b1cdbd2cSJim Jagielski 	{
309*b1cdbd2cSJim Jagielski 		oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski 		if (pSecImpl->m_pNetResource != NULL)
312*b1cdbd2cSJim Jagielski 		{
313*b1cdbd2cSJim Jagielski 			WNetCancelConnection2W(pSecImpl->m_pNetResource->lpRemoteName, 0, sal_True);
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 			free(pSecImpl->m_pNetResource->lpRemoteName);
316*b1cdbd2cSJim Jagielski 			free(pSecImpl->m_pNetResource);
317*b1cdbd2cSJim Jagielski 		}
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 		if (pSecImpl->m_hToken)
320*b1cdbd2cSJim Jagielski 			CloseHandle(pSecImpl->m_hToken);
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 		if ( pSecImpl->m_hProfile )
323*b1cdbd2cSJim Jagielski 			CloseHandle(pSecImpl->m_hProfile);
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 		free (pSecImpl);
326*b1cdbd2cSJim Jagielski 	}
327*b1cdbd2cSJim Jagielski }
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 
osl_getUserIdent(oslSecurity Security,rtl_uString ** strIdent)330*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **strIdent)
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski 	if (Security != NULL)
333*b1cdbd2cSJim Jagielski 	{
334*b1cdbd2cSJim Jagielski 		oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 		HANDLE hAccessToken = pSecImpl->m_hToken;
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 		if (hAccessToken == NULL)
339*b1cdbd2cSJim Jagielski 			OpenProcessToken(GetCurrentProcess(), TOKEN_DUP_QUERY, &hAccessToken);
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 		if (hAccessToken)
342*b1cdbd2cSJim Jagielski 		{
343*b1cdbd2cSJim Jagielski 			sal_Char		*Ident;
344*b1cdbd2cSJim Jagielski 			DWORD  nInfoBuffer = 512;
345*b1cdbd2cSJim Jagielski 			UCHAR* pInfoBuffer = malloc(nInfoBuffer);
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski 			while (!GetTokenInformation(hAccessToken, TokenUser,
349*b1cdbd2cSJim Jagielski            							    pInfoBuffer, nInfoBuffer, &nInfoBuffer))
350*b1cdbd2cSJim Jagielski 			{
351*b1cdbd2cSJim Jagielski 				if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
352*b1cdbd2cSJim Jagielski 					pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
353*b1cdbd2cSJim Jagielski 				else
354*b1cdbd2cSJim Jagielski 				{
355*b1cdbd2cSJim Jagielski 					free(pInfoBuffer);
356*b1cdbd2cSJim Jagielski 					pInfoBuffer = NULL;
357*b1cdbd2cSJim Jagielski 					break;
358*b1cdbd2cSJim Jagielski 				}
359*b1cdbd2cSJim Jagielski 			}
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 			if (pSecImpl->m_hToken == NULL)
362*b1cdbd2cSJim Jagielski 				CloseHandle(hAccessToken);
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski 			if (pInfoBuffer)
365*b1cdbd2cSJim Jagielski 			{
366*b1cdbd2cSJim Jagielski 				PSID pSid = ((PTOKEN_USER)pInfoBuffer)->User.Sid;
367*b1cdbd2cSJim Jagielski 			    PSID_IDENTIFIER_AUTHORITY psia;
368*b1cdbd2cSJim Jagielski 			    DWORD dwSubAuthorities;
369*b1cdbd2cSJim Jagielski 			    DWORD dwSidRev=SID_REVISION;
370*b1cdbd2cSJim Jagielski 			    DWORD dwCounter;
371*b1cdbd2cSJim Jagielski 			    DWORD dwSidSize;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski 			    /* obtain SidIdentifierAuthority */
374*b1cdbd2cSJim Jagielski 			    psia=GetSidIdentifierAuthority(pSid);
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 			    /* obtain sidsubauthority count */
377*b1cdbd2cSJim Jagielski 			    dwSubAuthorities=min(*GetSidSubAuthorityCount(pSid), 5);
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 				/* buffer length: S-SID_REVISION- + identifierauthority- + subauthorities- + NULL */
380*b1cdbd2cSJim Jagielski 				Ident=malloc(88*sizeof(sal_Char));
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 			    /* prepare S-SID_REVISION- */
383*b1cdbd2cSJim Jagielski 			    dwSidSize=wsprintf(Ident, TEXT("S-%lu-"), dwSidRev);
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 			    /* prepare SidIdentifierAuthority */
386*b1cdbd2cSJim Jagielski 			    if ((psia->Value[0] != 0) || (psia->Value[1] != 0))
387*b1cdbd2cSJim Jagielski 			    {
388*b1cdbd2cSJim Jagielski 			        dwSidSize+=wsprintf(Ident + strlen(Ident),
389*b1cdbd2cSJim Jagielski 			                    TEXT("0x%02hx%02hx%02hx%02hx%02hx%02hx"),
390*b1cdbd2cSJim Jagielski 			                    (USHORT)psia->Value[0],
391*b1cdbd2cSJim Jagielski 			                    (USHORT)psia->Value[1],
392*b1cdbd2cSJim Jagielski 			                    (USHORT)psia->Value[2],
393*b1cdbd2cSJim Jagielski 			                    (USHORT)psia->Value[3],
394*b1cdbd2cSJim Jagielski 			                    (USHORT)psia->Value[4],
395*b1cdbd2cSJim Jagielski 			                    (USHORT)psia->Value[5]);
396*b1cdbd2cSJim Jagielski 			    }
397*b1cdbd2cSJim Jagielski 			    else
398*b1cdbd2cSJim Jagielski 			    {
399*b1cdbd2cSJim Jagielski 			        dwSidSize+=wsprintf(Ident + strlen(Ident),
400*b1cdbd2cSJim Jagielski 			                    TEXT("%lu"),
401*b1cdbd2cSJim Jagielski 			                    (ULONG)(psia->Value[5]      )   +
402*b1cdbd2cSJim Jagielski 			                    (ULONG)(psia->Value[4] <<  8)   +
403*b1cdbd2cSJim Jagielski 			                    (ULONG)(psia->Value[3] << 16)   +
404*b1cdbd2cSJim Jagielski 			                    (ULONG)(psia->Value[2] << 24)   );
405*b1cdbd2cSJim Jagielski 			    }
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski 			    /* loop through SidSubAuthorities */
408*b1cdbd2cSJim Jagielski 			    for (dwCounter=0; dwCounter < dwSubAuthorities; dwCounter++)
409*b1cdbd2cSJim Jagielski 			    {
410*b1cdbd2cSJim Jagielski 			        dwSidSize+=wsprintf(Ident + dwSidSize, TEXT("-%lu"),
411*b1cdbd2cSJim Jagielski 			                    *GetSidSubAuthority(pSid, dwCounter) );
412*b1cdbd2cSJim Jagielski 			    }
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski 				rtl_uString_newFromAscii( strIdent, Ident );
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 				free(pInfoBuffer);
417*b1cdbd2cSJim Jagielski 				free(Ident);
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 				return (sal_True);
420*b1cdbd2cSJim Jagielski 			}
421*b1cdbd2cSJim Jagielski 		}
422*b1cdbd2cSJim Jagielski 		else
423*b1cdbd2cSJim Jagielski 		{
424*b1cdbd2cSJim Jagielski 			DWORD needed=0;
425*b1cdbd2cSJim Jagielski 			sal_Unicode		*Ident;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 			WNetGetUserA(NULL, NULL, &needed);
428*b1cdbd2cSJim Jagielski 			needed = max( 16 , needed );
429*b1cdbd2cSJim Jagielski 			Ident=malloc(needed*sizeof(sal_Unicode));
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 			if (WNetGetUserW(NULL, Ident, &needed) != NO_ERROR)
432*b1cdbd2cSJim Jagielski 			{
433*b1cdbd2cSJim Jagielski 				wcscpy(Ident, L"unknown");
434*b1cdbd2cSJim Jagielski 				Ident[7] = L'\0';
435*b1cdbd2cSJim Jagielski 			}
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 			rtl_uString_newFromStr( strIdent, Ident);
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 			free(Ident);
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski 			return sal_True;
442*b1cdbd2cSJim Jagielski 		}
443*b1cdbd2cSJim Jagielski 	}
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski 	return sal_False;
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 
osl_getUserName(oslSecurity Security,rtl_uString ** strName)450*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **strName)
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski 	return getUserNameImpl(Security, strName, sal_True);
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 
osl_getHomeDir(oslSecurity Security,rtl_uString ** pustrDirectory)456*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	rtl_uString	*ustrSysDir = NULL;
459*b1cdbd2cSJim Jagielski 	sal_Bool	bSuccess = sal_False;
460*b1cdbd2cSJim Jagielski 
461*b1cdbd2cSJim Jagielski     if (Security != NULL)
462*b1cdbd2cSJim Jagielski 	{
463*b1cdbd2cSJim Jagielski 		oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski 		if (pSecImpl->m_pNetResource != NULL)
466*b1cdbd2cSJim Jagielski 		{
467*b1cdbd2cSJim Jagielski 			rtl_uString_newFromStr( &ustrSysDir, pSecImpl->m_pNetResource->lpRemoteName);
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 			bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath( ustrSysDir, pustrDirectory ));
470*b1cdbd2cSJim Jagielski 		}
471*b1cdbd2cSJim Jagielski 		else
472*b1cdbd2cSJim Jagielski 		{
473*b1cdbd2cSJim Jagielski #if 0
474*b1cdbd2cSJim Jagielski 			if (pSecImpl->m_hToken)
475*b1cdbd2cSJim Jagielski 			{
476*b1cdbd2cSJim Jagielski 				DWORD  nInfoBuffer = 512;
477*b1cdbd2cSJim Jagielski 				UCHAR* pInfoBuffer = malloc(nInfoBuffer);
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 				while (!GetTokenInformation(pSecImpl->m_hToken, TokenUser,
480*b1cdbd2cSJim Jagielski 	           							    pInfoBuffer, nInfoBuffer, &nInfoBuffer))
481*b1cdbd2cSJim Jagielski 				{
482*b1cdbd2cSJim Jagielski 					if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
483*b1cdbd2cSJim Jagielski 						pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
484*b1cdbd2cSJim Jagielski 					else
485*b1cdbd2cSJim Jagielski 					{
486*b1cdbd2cSJim Jagielski 						free(pInfoBuffer);
487*b1cdbd2cSJim Jagielski 						pInfoBuffer = NULL;
488*b1cdbd2cSJim Jagielski 						break;
489*b1cdbd2cSJim Jagielski 					}
490*b1cdbd2cSJim Jagielski 				}
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski 				/* not implemented */
493*b1cdbd2cSJim Jagielski 				OSL_ASSERT(sal_False);
494*b1cdbd2cSJim Jagielski 
495*b1cdbd2cSJim Jagielski 				if (pInfoBuffer)
496*b1cdbd2cSJim Jagielski 				{
497*b1cdbd2cSJim Jagielski 					/* if (EqualSid() ... */
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski 				}
500*b1cdbd2cSJim Jagielski 			}
501*b1cdbd2cSJim Jagielski 			else
502*b1cdbd2cSJim Jagielski #endif
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 				bSuccess = (sal_Bool)(GetSpecialFolder(&ustrSysDir, CSIDL_PERSONAL) &&
505*b1cdbd2cSJim Jagielski 				                     (osl_File_E_None == osl_getFileURLFromSystemPath(ustrSysDir, pustrDirectory)));
506*b1cdbd2cSJim Jagielski 		}
507*b1cdbd2cSJim Jagielski 	}
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 	if ( ustrSysDir )
510*b1cdbd2cSJim Jagielski 		rtl_uString_release( ustrSysDir );
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski 	return bSuccess;
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski 
osl_getConfigDir(oslSecurity Security,rtl_uString ** pustrDirectory)515*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory)
516*b1cdbd2cSJim Jagielski {
517*b1cdbd2cSJim Jagielski 	sal_Bool	bSuccess = sal_False;
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski     if (Security != NULL)
520*b1cdbd2cSJim Jagielski 	{
521*b1cdbd2cSJim Jagielski 		oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski 		if (pSecImpl->m_pNetResource != NULL)
524*b1cdbd2cSJim Jagielski 		{
525*b1cdbd2cSJim Jagielski 			rtl_uString *ustrSysDir = NULL;
526*b1cdbd2cSJim Jagielski 
527*b1cdbd2cSJim Jagielski 			rtl_uString_newFromStr( &ustrSysDir, pSecImpl->m_pNetResource->lpRemoteName);
528*b1cdbd2cSJim Jagielski 			bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath( ustrSysDir, pustrDirectory));
529*b1cdbd2cSJim Jagielski 
530*b1cdbd2cSJim Jagielski 			if ( ustrSysDir )
531*b1cdbd2cSJim Jagielski 				rtl_uString_release( ustrSysDir );
532*b1cdbd2cSJim Jagielski 		}
533*b1cdbd2cSJim Jagielski 		else
534*b1cdbd2cSJim Jagielski 		{
535*b1cdbd2cSJim Jagielski 			if (pSecImpl->m_hToken)
536*b1cdbd2cSJim Jagielski 			{
537*b1cdbd2cSJim Jagielski 				/* not implemented */
538*b1cdbd2cSJim Jagielski 				OSL_ASSERT(sal_False);
539*b1cdbd2cSJim Jagielski 			}
540*b1cdbd2cSJim Jagielski 			else
541*b1cdbd2cSJim Jagielski 			{
542*b1cdbd2cSJim Jagielski                 rtl_uString *ustrFile = NULL;
543*b1cdbd2cSJim Jagielski 				sal_Unicode	sFile[_MAX_PATH];
544*b1cdbd2cSJim Jagielski 
545*b1cdbd2cSJim Jagielski 				if ( !GetSpecialFolder( &ustrFile, CSIDL_APPDATA) )
546*b1cdbd2cSJim Jagielski 				{
547*b1cdbd2cSJim Jagielski 					OSL_VERIFY(GetWindowsDirectoryW(sFile, _MAX_DIR) > 0);
548*b1cdbd2cSJim Jagielski 
549*b1cdbd2cSJim Jagielski 					rtl_uString_newFromStr( &ustrFile, sFile);
550*b1cdbd2cSJim Jagielski 				}
551*b1cdbd2cSJim Jagielski 
552*b1cdbd2cSJim Jagielski 				bSuccess = (sal_Bool)(osl_File_E_None == osl_getFileURLFromSystemPath(ustrFile, pustrDirectory));
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski 				if ( ustrFile )
555*b1cdbd2cSJim Jagielski 					rtl_uString_release( ustrFile );
556*b1cdbd2cSJim Jagielski 			}
557*b1cdbd2cSJim Jagielski 		}
558*b1cdbd2cSJim Jagielski 	}
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 	return bSuccess;
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski 
osl_loadUserProfile(oslSecurity Security)564*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security)
565*b1cdbd2cSJim Jagielski {
566*b1cdbd2cSJim Jagielski 	/* 	CreateProcessAsUser does not load the specified user's profile
567*b1cdbd2cSJim Jagielski 		into the HKEY_USERS registry key. This means that access to information
568*b1cdbd2cSJim Jagielski 		in the HKEY_CURRENT_USER registry key may not produce results consistent
569*b1cdbd2cSJim Jagielski 		with a normal interactive logon.
570*b1cdbd2cSJim Jagielski 		It is your responsibility to load the user's registry hive into HKEY_USERS
571*b1cdbd2cSJim Jagielski 		with the LoadUserProfile function before calling CreateProcessAsUser.
572*b1cdbd2cSJim Jagielski 	*/
573*b1cdbd2cSJim Jagielski 	BOOL bOk = FALSE;
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 	RegCloseKey(HKEY_CURRENT_USER);
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	if (Privilege(SE_RESTORE_NAME, TRUE))
578*b1cdbd2cSJim Jagielski 	{
579*b1cdbd2cSJim Jagielski 		HMODULE                 hUserEnvLib			= NULL;
580*b1cdbd2cSJim Jagielski 		LPFNLOADUSERPROFILE     fLoadUserProfile	= NULL;
581*b1cdbd2cSJim Jagielski 		LPFNUNLOADUSERPROFILE   fUnloadUserProfile	= NULL;
582*b1cdbd2cSJim Jagielski 		HANDLE 					hAccessToken 		= ((oslSecurityImpl*)Security)->m_hToken;
583*b1cdbd2cSJim Jagielski 		DWORD					nError				= 0;
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski 		/* try to create user profile */
586*b1cdbd2cSJim Jagielski 		if ( !hAccessToken )
587*b1cdbd2cSJim Jagielski 		{
588*b1cdbd2cSJim Jagielski 			/* retrieve security handle if not done before e.g. osl_getCurrentSecurity()
589*b1cdbd2cSJim Jagielski 			*/
590*b1cdbd2cSJim Jagielski 			HANDLE hProcess = GetCurrentProcess();
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 			if (hProcess != NULL)
593*b1cdbd2cSJim Jagielski 			{
594*b1cdbd2cSJim Jagielski 				OpenProcessToken(hProcess, TOKEN_IMPERSONATE, &hAccessToken);
595*b1cdbd2cSJim Jagielski 				CloseHandle(hProcess);
596*b1cdbd2cSJim Jagielski 			}
597*b1cdbd2cSJim Jagielski 		}
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 	    hUserEnvLib = LoadLibraryA("userenv.dll");
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 		if (hUserEnvLib)
602*b1cdbd2cSJim Jagielski 		{
603*b1cdbd2cSJim Jagielski 			fLoadUserProfile = (LPFNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "LoadUserProfileW");
604*b1cdbd2cSJim Jagielski 			fUnloadUserProfile = (LPFNUNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "UnloadUserProfile");
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski 			if (fLoadUserProfile && fUnloadUserProfile)
607*b1cdbd2cSJim Jagielski 			{
608*b1cdbd2cSJim Jagielski 				rtl_uString  	*buffer = 0;
609*b1cdbd2cSJim Jagielski 				PROFILEINFOW	pi;
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski 				getUserNameImpl(Security, &buffer, sal_False);
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 				ZeroMemory( &pi, sizeof(pi) );
614*b1cdbd2cSJim Jagielski 	  			pi.dwSize = sizeof(pi);
615*b1cdbd2cSJim Jagielski 				pi.lpUserName = rtl_uString_getStr(buffer);
616*b1cdbd2cSJim Jagielski 				pi.dwFlags = PI_NOUI;
617*b1cdbd2cSJim Jagielski 
618*b1cdbd2cSJim Jagielski 				if (fLoadUserProfile(hAccessToken, &pi))
619*b1cdbd2cSJim Jagielski 				{
620*b1cdbd2cSJim Jagielski 					fUnloadUserProfile(hAccessToken, pi.hProfile);
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski 					bOk = TRUE;
623*b1cdbd2cSJim Jagielski 				}
624*b1cdbd2cSJim Jagielski 				else
625*b1cdbd2cSJim Jagielski 					nError = GetLastError();
626*b1cdbd2cSJim Jagielski 
627*b1cdbd2cSJim Jagielski 				rtl_uString_release(buffer);
628*b1cdbd2cSJim Jagielski 			}
629*b1cdbd2cSJim Jagielski 
630*b1cdbd2cSJim Jagielski 			FreeLibrary(hUserEnvLib);
631*b1cdbd2cSJim Jagielski 		}
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski 		if (hAccessToken && (hAccessToken != ((oslSecurityImpl*)Security)->m_hToken))
634*b1cdbd2cSJim Jagielski 			CloseHandle(hAccessToken);
635*b1cdbd2cSJim Jagielski 	}
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	return (sal_Bool)bOk;
638*b1cdbd2cSJim Jagielski }
639*b1cdbd2cSJim Jagielski 
640*b1cdbd2cSJim Jagielski 
osl_unloadUserProfile(oslSecurity Security)641*b1cdbd2cSJim Jagielski void SAL_CALL osl_unloadUserProfile(oslSecurity Security)
642*b1cdbd2cSJim Jagielski {
643*b1cdbd2cSJim Jagielski 	if ( ((oslSecurityImpl*)Security)->m_hProfile != NULL )
644*b1cdbd2cSJim Jagielski 	{
645*b1cdbd2cSJim Jagielski 		HMODULE                 hUserEnvLib			= NULL;
646*b1cdbd2cSJim Jagielski 		LPFNLOADUSERPROFILE     fLoadUserProfile	= NULL;
647*b1cdbd2cSJim Jagielski 		LPFNUNLOADUSERPROFILE   fUnloadUserProfile	= NULL;
648*b1cdbd2cSJim Jagielski 		BOOL 					bOk 				= FALSE;
649*b1cdbd2cSJim Jagielski 		HANDLE 					hAccessToken 		= ((oslSecurityImpl*)Security)->m_hToken;
650*b1cdbd2cSJim Jagielski 
651*b1cdbd2cSJim Jagielski 		if ( !hAccessToken )
652*b1cdbd2cSJim Jagielski 		{
653*b1cdbd2cSJim Jagielski 			/* retrieve security handle if not done before e.g. osl_getCurrentSecurity()
654*b1cdbd2cSJim Jagielski 			*/
655*b1cdbd2cSJim Jagielski 			HANDLE hProcess = GetCurrentProcess();
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 			if (hProcess != NULL)
658*b1cdbd2cSJim Jagielski 			{
659*b1cdbd2cSJim Jagielski 				OpenProcessToken(hProcess, TOKEN_IMPERSONATE, &hAccessToken);
660*b1cdbd2cSJim Jagielski 				CloseHandle(hProcess);
661*b1cdbd2cSJim Jagielski 			}
662*b1cdbd2cSJim Jagielski 		}
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski 	    hUserEnvLib = LoadLibrary("userenv.dll");
665*b1cdbd2cSJim Jagielski 
666*b1cdbd2cSJim Jagielski 		if (hUserEnvLib)
667*b1cdbd2cSJim Jagielski 		{
668*b1cdbd2cSJim Jagielski 			fLoadUserProfile = (LPFNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "LoadUserProfileA");
669*b1cdbd2cSJim Jagielski 			fUnloadUserProfile = (LPFNUNLOADUSERPROFILE)GetProcAddress(hUserEnvLib, "UnloadUserProfile");
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski 			if (fLoadUserProfile && fUnloadUserProfile)
672*b1cdbd2cSJim Jagielski 			{
673*b1cdbd2cSJim Jagielski 				/* unloading the user profile */
674*b1cdbd2cSJim Jagielski 				if (fLoadUserProfile && fUnloadUserProfile)
675*b1cdbd2cSJim Jagielski 					bOk = fUnloadUserProfile(hAccessToken, ((oslSecurityImpl*)Security)->m_hProfile);
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski 				if (hUserEnvLib)
678*b1cdbd2cSJim Jagielski 					FreeLibrary(hUserEnvLib);
679*b1cdbd2cSJim Jagielski 			}
680*b1cdbd2cSJim Jagielski 		}
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 		((oslSecurityImpl*)Security)->m_hProfile;
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 		if (hAccessToken && (hAccessToken != ((oslSecurityImpl*)Security)->m_hToken))
685*b1cdbd2cSJim Jagielski 		{
686*b1cdbd2cSJim Jagielski 			CloseHandle(hAccessToken);
687*b1cdbd2cSJim Jagielski 		}
688*b1cdbd2cSJim Jagielski 	}
689*b1cdbd2cSJim Jagielski }
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski /*****************************************************************************/
692*b1cdbd2cSJim Jagielski /* Static Module Functions */
693*b1cdbd2cSJim Jagielski /*****************************************************************************/
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 
GetSpecialFolder(rtl_uString ** strPath,int nFolder)696*b1cdbd2cSJim Jagielski static sal_Bool GetSpecialFolder(rtl_uString **strPath, int nFolder)
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski 	sal_Bool bRet = sal_False;
699*b1cdbd2cSJim Jagielski 	HINSTANCE hLibrary;
700*b1cdbd2cSJim Jagielski 	sal_Char PathA[_MAX_PATH];
701*b1cdbd2cSJim Jagielski 	sal_Unicode	PathW[_MAX_PATH];
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski 	if ((hLibrary = LoadLibrary("shell32.dll")) != NULL)
704*b1cdbd2cSJim Jagielski 	{
705*b1cdbd2cSJim Jagielski 		BOOL (WINAPI *pSHGetSpecialFolderPathA)(HWND, LPSTR, int, BOOL);
706*b1cdbd2cSJim Jagielski 		BOOL (WINAPI *pSHGetSpecialFolderPathW)(HWND, LPWSTR, int, BOOL);
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski         pSHGetSpecialFolderPathA = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathA");
709*b1cdbd2cSJim Jagielski         pSHGetSpecialFolderPathW = (BOOL (WINAPI *)(HWND, LPWSTR, int, BOOL))GetProcAddress(hLibrary, "SHGetSpecialFolderPathW");
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 		if (pSHGetSpecialFolderPathA)
712*b1cdbd2cSJim Jagielski 		{
713*b1cdbd2cSJim Jagielski 			if (pSHGetSpecialFolderPathA(GetActiveWindow(), PathA, nFolder, TRUE))
714*b1cdbd2cSJim Jagielski 			{
715*b1cdbd2cSJim Jagielski 				rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS);
716*b1cdbd2cSJim Jagielski                 OSL_ASSERT(*strPath != NULL);
717*b1cdbd2cSJim Jagielski 				bRet = sal_True;
718*b1cdbd2cSJim Jagielski 			}
719*b1cdbd2cSJim Jagielski 		}
720*b1cdbd2cSJim Jagielski 		else if (pSHGetSpecialFolderPathW)
721*b1cdbd2cSJim Jagielski 		{
722*b1cdbd2cSJim Jagielski 			if (pSHGetSpecialFolderPathW(GetActiveWindow(), PathW, nFolder, TRUE))
723*b1cdbd2cSJim Jagielski 			{
724*b1cdbd2cSJim Jagielski 				rtl_uString_newFromStr( strPath, PathW);
725*b1cdbd2cSJim Jagielski 				bRet = sal_True;
726*b1cdbd2cSJim Jagielski 			}
727*b1cdbd2cSJim Jagielski 		}
728*b1cdbd2cSJim Jagielski 		else
729*b1cdbd2cSJim Jagielski 		{
730*b1cdbd2cSJim Jagielski 			HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *) = (HRESULT (WINAPI *)(HWND, int, LPITEMIDLIST *))GetProcAddress(hLibrary, "SHGetSpecialFolderLocation");
731*b1cdbd2cSJim Jagielski 			BOOL (WINAPI *pSHGetPathFromIDListA)(LPCITEMIDLIST, LPSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListA");
732*b1cdbd2cSJim Jagielski 			BOOL (WINAPI *pSHGetPathFromIDListW)(LPCITEMIDLIST, LPWSTR) = (BOOL (WINAPI *)(LPCITEMIDLIST, LPWSTR))GetProcAddress(hLibrary, "SHGetPathFromIDListW");
733*b1cdbd2cSJim Jagielski  			HRESULT (WINAPI *pSHGetMalloc)(LPMALLOC *) = (HRESULT (WINAPI *)(LPMALLOC *))GetProcAddress(hLibrary, "SHGetMalloc");
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 
736*b1cdbd2cSJim Jagielski 			if (pSHGetSpecialFolderLocation && (pSHGetPathFromIDListA || pSHGetPathFromIDListW ) && pSHGetMalloc )
737*b1cdbd2cSJim Jagielski 			{
738*b1cdbd2cSJim Jagielski 			   	LPITEMIDLIST pidl;
739*b1cdbd2cSJim Jagielski 				LPMALLOC pMalloc;
740*b1cdbd2cSJim Jagielski 			   	HRESULT  hr;
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 			   	hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 				/* Get SHGetSpecialFolderLocation fails if directory does not exists. */
745*b1cdbd2cSJim Jagielski 				/* If it fails we try to create the directory and redo the call */
746*b1cdbd2cSJim Jagielski 				if (! SUCCEEDED(hr))
747*b1cdbd2cSJim Jagielski 				{
748*b1cdbd2cSJim Jagielski 					HKEY hRegKey;
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski 					if (RegOpenKey(HKEY_CURRENT_USER,
751*b1cdbd2cSJim Jagielski 								   "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",
752*b1cdbd2cSJim Jagielski 								   &hRegKey) == ERROR_SUCCESS)
753*b1cdbd2cSJim Jagielski 					{
754*b1cdbd2cSJim Jagielski 						LONG lRet;
755*b1cdbd2cSJim Jagielski 						DWORD lSize = elementsof(PathA);
756*b1cdbd2cSJim Jagielski 						DWORD Type = REG_SZ;
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 						switch (nFolder)
759*b1cdbd2cSJim Jagielski 						{
760*b1cdbd2cSJim Jagielski 							case CSIDL_APPDATA:
761*b1cdbd2cSJim Jagielski 								lRet = RegQueryValueEx(hRegKey, "AppData", NULL, &Type, (LPBYTE)PathA, &lSize);
762*b1cdbd2cSJim Jagielski 	  							break;
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 							case CSIDL_PERSONAL:
765*b1cdbd2cSJim Jagielski 								lRet = RegQueryValueEx(hRegKey, "Personal", NULL, &Type, (LPBYTE)PathA, &lSize);
766*b1cdbd2cSJim Jagielski 								break;
767*b1cdbd2cSJim Jagielski 
768*b1cdbd2cSJim Jagielski 							default:
769*b1cdbd2cSJim Jagielski 								lRet = -1l;
770*b1cdbd2cSJim Jagielski 						}
771*b1cdbd2cSJim Jagielski 
772*b1cdbd2cSJim Jagielski 						if ((lRet == ERROR_SUCCESS) && (Type == REG_SZ))
773*b1cdbd2cSJim Jagielski 						{
774*b1cdbd2cSJim Jagielski 							if (_access(PathA, 0) < 0)
775*b1cdbd2cSJim Jagielski 								CreateDirectory(PathA, NULL);
776*b1cdbd2cSJim Jagielski 
777*b1cdbd2cSJim Jagielski 						   	hr = pSHGetSpecialFolderLocation(GetActiveWindow(), nFolder, &pidl);
778*b1cdbd2cSJim Jagielski 						}
779*b1cdbd2cSJim Jagielski 
780*b1cdbd2cSJim Jagielski 						RegCloseKey(hRegKey);
781*b1cdbd2cSJim Jagielski 					}
782*b1cdbd2cSJim Jagielski 				}
783*b1cdbd2cSJim Jagielski 
784*b1cdbd2cSJim Jagielski 				if (SUCCEEDED(hr))
785*b1cdbd2cSJim Jagielski 				{
786*b1cdbd2cSJim Jagielski 					if (pSHGetPathFromIDListW && pSHGetPathFromIDListW(pidl, PathW))
787*b1cdbd2cSJim Jagielski 			   		{
788*b1cdbd2cSJim Jagielski 						/* if directory does not exist, create it */
789*b1cdbd2cSJim Jagielski 						if (_waccess(PathW, 0) < 0)
790*b1cdbd2cSJim Jagielski 							CreateDirectoryW(PathW, NULL);
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski 						rtl_uString_newFromStr( strPath, PathW);
793*b1cdbd2cSJim Jagielski 						bRet = sal_True;
794*b1cdbd2cSJim Jagielski 				   	}
795*b1cdbd2cSJim Jagielski 					else if (pSHGetPathFromIDListA && pSHGetPathFromIDListA(pidl, PathA))
796*b1cdbd2cSJim Jagielski 					{
797*b1cdbd2cSJim Jagielski 						/* if directory does not exist, create it */
798*b1cdbd2cSJim Jagielski 						if (_access(PathA, 0) < 0)
799*b1cdbd2cSJim Jagielski 							CreateDirectoryA(PathA, NULL);
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski 						rtl_string2UString( strPath, PathA, strlen(PathA), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS);
802*b1cdbd2cSJim Jagielski                         OSL_ASSERT(*strPath != NULL);
803*b1cdbd2cSJim Jagielski 						bRet = sal_True;
804*b1cdbd2cSJim Jagielski 					}
805*b1cdbd2cSJim Jagielski 			   	}
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski 			   	if (SUCCEEDED(pSHGetMalloc(&pMalloc)))
808*b1cdbd2cSJim Jagielski 				{
809*b1cdbd2cSJim Jagielski 				   	pMalloc->lpVtbl->Free(pMalloc, pidl);
810*b1cdbd2cSJim Jagielski 					pMalloc->lpVtbl->Release(pMalloc);
811*b1cdbd2cSJim Jagielski 				}
812*b1cdbd2cSJim Jagielski 			}
813*b1cdbd2cSJim Jagielski 		}
814*b1cdbd2cSJim Jagielski 	}
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 	FreeLibrary(hLibrary);
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski 	return (bRet);
819*b1cdbd2cSJim Jagielski }
820*b1cdbd2cSJim Jagielski 
821*b1cdbd2cSJim Jagielski 
isWNT(void)822*b1cdbd2cSJim Jagielski static sal_Bool isWNT(void)
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski 	static sal_Bool isInit = sal_False;
825*b1cdbd2cSJim Jagielski 	static sal_Bool isWNT = sal_False;
826*b1cdbd2cSJim Jagielski 
827*b1cdbd2cSJim Jagielski 	if (!isInit)
828*b1cdbd2cSJim Jagielski 	{
829*b1cdbd2cSJim Jagielski 		OSVERSIONINFO VersionInformation =
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski 		{
832*b1cdbd2cSJim Jagielski 			sizeof(OSVERSIONINFO),
833*b1cdbd2cSJim Jagielski 			0,
834*b1cdbd2cSJim Jagielski 	    	0,
835*b1cdbd2cSJim Jagielski 	    	0,
836*b1cdbd2cSJim Jagielski 	    	0,
837*b1cdbd2cSJim Jagielski 	    	"",
838*b1cdbd2cSJim Jagielski 		};
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 		if (
841*b1cdbd2cSJim Jagielski 			GetVersionEx(&VersionInformation) &&
842*b1cdbd2cSJim Jagielski 			(VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT)
843*b1cdbd2cSJim Jagielski 		   )
844*b1cdbd2cSJim Jagielski 		{
845*b1cdbd2cSJim Jagielski 			isWNT = sal_True;
846*b1cdbd2cSJim Jagielski 		}
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski 		isInit = sal_True;
849*b1cdbd2cSJim Jagielski 	}
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski 	return(isWNT);
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski 
Privilege(LPTSTR strPrivilege,BOOL bEnable)854*b1cdbd2cSJim Jagielski static BOOL Privilege(LPTSTR strPrivilege, BOOL bEnable)
855*b1cdbd2cSJim Jagielski {
856*b1cdbd2cSJim Jagielski 	HANDLE           hToken;
857*b1cdbd2cSJim Jagielski 	TOKEN_PRIVILEGES tp;
858*b1cdbd2cSJim Jagielski 
859*b1cdbd2cSJim Jagielski 	/*
860*b1cdbd2cSJim Jagielski 		obtain the processes token
861*b1cdbd2cSJim Jagielski 	*/
862*b1cdbd2cSJim Jagielski 	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_DUP_QUERY, &hToken))
863*b1cdbd2cSJim Jagielski 		return FALSE;
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski 	/*
866*b1cdbd2cSJim Jagielski 		get the luid
867*b1cdbd2cSJim Jagielski 	*/
868*b1cdbd2cSJim Jagielski 	if (!LookupPrivilegeValue(NULL, strPrivilege, &tp.Privileges[0].Luid))
869*b1cdbd2cSJim Jagielski 		return FALSE;
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski 	tp.PrivilegeCount = 1;
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski 	if (bEnable)
874*b1cdbd2cSJim Jagielski 		tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
875*b1cdbd2cSJim Jagielski 	else
876*b1cdbd2cSJim Jagielski 		tp.Privileges[0].Attributes = 0;
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 	/*
879*b1cdbd2cSJim Jagielski 		enable or disable the privilege
880*b1cdbd2cSJim Jagielski 	*/
881*b1cdbd2cSJim Jagielski 	if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
882*b1cdbd2cSJim Jagielski 		return FALSE;
883*b1cdbd2cSJim Jagielski 
884*b1cdbd2cSJim Jagielski 	if (!CloseHandle(hToken))
885*b1cdbd2cSJim Jagielski 		return FALSE;
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 	return TRUE;
888*b1cdbd2cSJim Jagielski }
889*b1cdbd2cSJim Jagielski 
getUserNameImpl(oslSecurity Security,rtl_uString ** strName,sal_Bool bIncludeDomain)890*b1cdbd2cSJim Jagielski static sal_Bool SAL_CALL getUserNameImpl(oslSecurity Security, rtl_uString **strName,  sal_Bool bIncludeDomain)
891*b1cdbd2cSJim Jagielski {
892*b1cdbd2cSJim Jagielski     if (Security != NULL)
893*b1cdbd2cSJim Jagielski 	{
894*b1cdbd2cSJim Jagielski 		oslSecurityImpl *pSecImpl = (oslSecurityImpl*)Security;
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski 		HANDLE hAccessToken = pSecImpl->m_hToken;
897*b1cdbd2cSJim Jagielski 
898*b1cdbd2cSJim Jagielski 		if (hAccessToken == NULL)
899*b1cdbd2cSJim Jagielski 			OpenProcessToken(GetCurrentProcess(), TOKEN_DUP_QUERY, &hAccessToken);
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski 		if (hAccessToken)
902*b1cdbd2cSJim Jagielski 		{
903*b1cdbd2cSJim Jagielski 			DWORD  nInfoBuffer = 512;
904*b1cdbd2cSJim Jagielski 			UCHAR* pInfoBuffer = malloc(nInfoBuffer);
905*b1cdbd2cSJim Jagielski 
906*b1cdbd2cSJim Jagielski 			while (!GetTokenInformation(hAccessToken, TokenUser,
907*b1cdbd2cSJim Jagielski            							    pInfoBuffer, nInfoBuffer, &nInfoBuffer))
908*b1cdbd2cSJim Jagielski 			{
909*b1cdbd2cSJim Jagielski 				if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
910*b1cdbd2cSJim Jagielski 					pInfoBuffer = realloc(pInfoBuffer, nInfoBuffer);
911*b1cdbd2cSJim Jagielski 				else
912*b1cdbd2cSJim Jagielski 				{
913*b1cdbd2cSJim Jagielski 					free(pInfoBuffer);
914*b1cdbd2cSJim Jagielski 					pInfoBuffer = NULL;
915*b1cdbd2cSJim Jagielski 					break;
916*b1cdbd2cSJim Jagielski 				}
917*b1cdbd2cSJim Jagielski 			}
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 			if (pSecImpl->m_hToken == NULL)
920*b1cdbd2cSJim Jagielski 				CloseHandle(hAccessToken);
921*b1cdbd2cSJim Jagielski 
922*b1cdbd2cSJim Jagielski 			if (pInfoBuffer)
923*b1cdbd2cSJim Jagielski 			{
924*b1cdbd2cSJim Jagielski 				sal_Unicode  UserName[128];
925*b1cdbd2cSJim Jagielski 				sal_Unicode  DomainName[128];
926*b1cdbd2cSJim Jagielski 				sal_Unicode	 Name[257];
927*b1cdbd2cSJim Jagielski 				DWORD nUserName   = sizeof(UserName);
928*b1cdbd2cSJim Jagielski 				DWORD nDomainName = sizeof(DomainName);
929*b1cdbd2cSJim Jagielski 				SID_NAME_USE sUse;
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski 				if (LookupAccountSidW(NULL, ((PTOKEN_USER)pInfoBuffer)->User.Sid,
932*b1cdbd2cSJim Jagielski            						     UserName, &nUserName,
933*b1cdbd2cSJim Jagielski            						     DomainName, &nDomainName, &sUse))
934*b1cdbd2cSJim Jagielski 				{
935*b1cdbd2cSJim Jagielski 					if (bIncludeDomain)
936*b1cdbd2cSJim Jagielski 					{
937*b1cdbd2cSJim Jagielski 						wcscpy(Name, DomainName);
938*b1cdbd2cSJim Jagielski 						wcscat(Name, L"/");
939*b1cdbd2cSJim Jagielski 						wcscat(Name, UserName);
940*b1cdbd2cSJim Jagielski 					}
941*b1cdbd2cSJim Jagielski 					else
942*b1cdbd2cSJim Jagielski 					{
943*b1cdbd2cSJim Jagielski 						wcscpy(Name, UserName);
944*b1cdbd2cSJim Jagielski 					}
945*b1cdbd2cSJim Jagielski            		}
946*b1cdbd2cSJim Jagielski 				rtl_uString_newFromStr( strName, Name);
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 				free(pInfoBuffer);
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski 				return (sal_True);
951*b1cdbd2cSJim Jagielski 			}
952*b1cdbd2cSJim Jagielski 		}
953*b1cdbd2cSJim Jagielski 		else
954*b1cdbd2cSJim Jagielski 		{
955*b1cdbd2cSJim Jagielski 			DWORD needed=0;
956*b1cdbd2cSJim Jagielski 			sal_Unicode			*pNameW=NULL;
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski 			WNetGetUserW(NULL, NULL, &needed);
959*b1cdbd2cSJim Jagielski 			pNameW = malloc (needed*sizeof(sal_Unicode));
960*b1cdbd2cSJim Jagielski 
961*b1cdbd2cSJim Jagielski 			if (WNetGetUserW(NULL, pNameW, &needed) == NO_ERROR)
962*b1cdbd2cSJim Jagielski 			{
963*b1cdbd2cSJim Jagielski 				rtl_uString_newFromStr( strName, pNameW);
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski 				if (pNameW)
966*b1cdbd2cSJim Jagielski 					free(pNameW);
967*b1cdbd2cSJim Jagielski 				return (sal_True);
968*b1cdbd2cSJim Jagielski 			}
969*b1cdbd2cSJim Jagielski 			else
970*b1cdbd2cSJim Jagielski 				if (wcslen(pSecImpl->m_User) > 0)
971*b1cdbd2cSJim Jagielski 				{
972*b1cdbd2cSJim Jagielski 					rtl_uString_newFromStr( strName, pSecImpl->m_pNetResource->lpRemoteName);
973*b1cdbd2cSJim Jagielski 
974*b1cdbd2cSJim Jagielski 					if (pNameW)
975*b1cdbd2cSJim Jagielski 						free(pNameW);
976*b1cdbd2cSJim Jagielski 
977*b1cdbd2cSJim Jagielski 					return (sal_True);
978*b1cdbd2cSJim Jagielski 				}
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski 			if (pNameW)
981*b1cdbd2cSJim Jagielski 				free(pNameW);
982*b1cdbd2cSJim Jagielski 		}
983*b1cdbd2cSJim Jagielski 	}
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski     return sal_False;
986*b1cdbd2cSJim Jagielski }
987*b1cdbd2cSJim Jagielski 
988