/* * Author: NoMachine * * Copyright (c) 2009, 2011 NoMachine * All rights reserved * * Support functions and system calls' replacements needed to let the * software run on Win32 based operating systems. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "win32auth.h" wchar_t HomeDirLsaW[MAX_PATH] = {L'\0'}; wchar_t *gethomedir_w(char *pUserName, char *pDomainName) { HANDLE token; PROFILEINFOW profileInfo; wchar_t szPathW[MAX_PATH] = {0}; wchar_t pUserName_w[UNLEN + 1] = {0}; static wchar_t username_w[UNLEN + 1] = {0}; DWORD usernamelen = UNLEN + 1; wchar_t pDomainName_w[UNLEN + 1] = {0}; wchar_t *userprofile_w; /* * If there is home dir from lsa return it. */ if (HomeDirLsaW[0] != L'\0') { debug("Using LSA HomeDirW."); return _wcsdup(HomeDirLsaW); } szPathW[0] = '\0'; if (MultiByteToWideChar(CP_UTF8, 0, pUserName, -1, pUserName_w, UNLEN) == 0) { return NULL; } if (pDomainName && MultiByteToWideChar(CP_UTF8, 0, pDomainName, -1, pDomainName_w, UNLEN) == 0) { return NULL; } debug3("gethomedir: pUserName [%s]", pUserName); GetUserNameW(username_w, &usernamelen); debug3("gethomedir: username [%ls]", username_w); if (wcscmp(pUserName_w, username_w) == 0) { /* * User query his own home dir, we can take it from env. */ debug3("gethomedir: getenv"); userprofile_w = _wgetenv(L"USERPROFILE"); if (userprofile_w) { debug3("gethomedir: userprofile [%ls]", userprofile_w); /* * We have a %USERPROFILE% and we can return it */ return _wcsdup(userprofile_w); } /* * Env not set, let's try to take it from token */ } /* * If all above fail try to create user token manually * and get homedir using this token. */ return NULL; } /* * Retreave path, where current binary live. * * buffer - buffer, where path store (OUT) * bufSize - size of output buffer (IN) * * RETURNS: 0 if OK. */ int GetRootBaseDir(char *buffer, int bufSize) { int exitCode = -1; char *end = NULL; char *tmp = buffer; FAIL(buffer == NULL); FAIL(GetModuleFileName(NULL, buffer, bufSize) == FALSE); FAIL(PathRemoveFileSpec(buffer) == FALSE); while ((tmp = strstr(tmp, "\\bin"))) { end = tmp; tmp++; } FAIL(end == NULL); *end = 0; exitCode = 0; fail: return exitCode; }