BOOL MyExpandEnvironmentStrings(const TCHAR *szSrc,TCHAR *szExpandedPath,DWORD nSize) { HANDLE hProcess; HANDLE hToken; BOOL bRet = FALSE; hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId()); if(hProcess != NULL) { bRet = OpenProcessToken(hProcess,TOKEN_IMPERSONATE|TOKEN_QUERY,&hToken); if(bRet) { bRet = ExpandEnvironmentStringsForUser(hToken,szSrc, szExpandedPath,nSize); CloseHandle(hToken); } CloseHandle(hProcess); } return bRet; }
// // eg "%HOMEDRIVE%" -> "C:" // SString SharedUtil::ExpandEnvString ( const SString& strInput ) { HANDLE hProcessToken; if ( !OpenProcessToken ( GetCurrentProcess (), TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_DUPLICATE, &hProcessToken ) ) return strInput; const static int iBufferSize = 32000; char envBuf [ iBufferSize + 2 ]; ExpandEnvironmentStringsForUser ( hProcessToken, strInput, envBuf, iBufferSize ); return envBuf; }
// Dialog box handling functions void vncPropertiesPoll::Show(BOOL show, BOOL usersettings) { HANDLE hProcess=NULL; HANDLE hPToken=NULL; DWORD id=GetExplorerLogonPid(); int iImpersonateResult=0; { char WORKDIR[MAX_PATH]; if (!GetTempPath(MAX_PATH,WORKDIR)) { //Function failed, just set something if (GetModuleFileName(NULL, WORKDIR, MAX_PATH)) { char* p = strrchr(WORKDIR, '\\'); if (p == NULL) return; *p = '\0'; } strcpy(m_Tempfile,""); strcat(m_Tempfile,WORKDIR);//set the directory strcat(m_Tempfile,"\\"); strcat(m_Tempfile,INIFILE_NAME); } else { strcpy(m_Tempfile,""); strcat(m_Tempfile,WORKDIR);//set the directory strcat(m_Tempfile,INIFILE_NAME); } } if (id!=0) { hProcess = OpenProcess(MAXIMUM_ALLOWED,FALSE,id); if(OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY |TOKEN_DUPLICATE|TOKEN_ASSIGN_PRIMARY|TOKEN_ADJUST_SESSIONID |TOKEN_READ|TOKEN_WRITE,&hPToken)) { ImpersonateLoggedOnUser(hPToken); iImpersonateResult = GetLastError(); if(iImpersonateResult == ERROR_SUCCESS) { ExpandEnvironmentStringsForUser(hPToken, "%TEMP%", m_Tempfile, MAX_PATH); strcat(m_Tempfile,"\\"); strcat(m_Tempfile,INIFILE_NAME); } } } if (show) { if (!m_fUseRegistry) // Use the ini file { // We're trying to edit the default local settings - verify that we can /* if (!myIniFile.IsWritable()) { if(iImpersonateResult == ERROR_SUCCESS)RevertToSelf(); CloseHandle(hProcess); CloseHandle(hPToken); return; } */ } else // Use the registry { // Verify that we know who is logged on if (usersettings) { char username[UNLEN+1]; if (!vncService::CurrentUser(username, sizeof(username))) { if(iImpersonateResult == ERROR_SUCCESS)RevertToSelf(); CloseHandle(hProcess); CloseHandle(hPToken); return; } if (strcmp(username, "") == 0) { MessageBoxSecure(NULL, sz_ID_NO_CURRENT_USER_ERR, sz_ID_WINVNC_ERROR, MB_OK | MB_ICONEXCLAMATION); if(iImpersonateResult == ERROR_SUCCESS)RevertToSelf(); CloseHandle(hProcess); CloseHandle(hPToken); return; } } else { // We're trying to edit the default local settings - verify that we can HKEY hkLocal=NULL; HKEY hkDefault=NULL; BOOL canEditDefaultPrefs = 1; DWORD dw; if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, WINVNC_REGISTRY_KEY, 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS) canEditDefaultPrefs = 0; else if (RegCreateKeyEx(hkLocal, "Default", 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_READ, NULL, &hkDefault, &dw) != ERROR_SUCCESS) canEditDefaultPrefs = 0; if (hkLocal) RegCloseKey(hkLocal); if (hkDefault) RegCloseKey(hkDefault); if (!canEditDefaultPrefs) { MessageBoxSecure(NULL, sz_ID_CANNOT_EDIT_DEFAULT_PREFS, sz_ID_WINVNC_ERROR, MB_OK | MB_ICONEXCLAMATION); if(iImpersonateResult == ERROR_SUCCESS)RevertToSelf(); if (hProcess) CloseHandle(hProcess); if (hPToken) CloseHandle(hPToken); return; } } } // Now, if the dialog is not already displayed, show it! if (!m_dlgvisible) { if (m_fUseRegistry) { if (usersettings) vnclog.Print(LL_INTINFO, VNCLOG("show per-user Properties\n")); else vnclog.Print(LL_INTINFO, VNCLOG("show default system Properties\n")); // Load in the settings relevant to the user or system //Load(usersettings); m_usersettings=usersettings; // Load in the settings relevant to the user or system Load(usersettings); } else LoadFromIniFile(); for (;;) { m_returncode_valid = FALSE; // Do the dialog box // [v1.0.2-jp1 fix] //int result = DialogBoxParam(hAppInstance, int result = DialogBoxParam(hInstResDLL, MAKEINTRESOURCE(IDD_PROPERTIES), NULL, (DLGPROC) DialogProcPoll, (LONG_PTR) this); if (!m_returncode_valid) result = IDCANCEL; vnclog.Print(LL_INTINFO, VNCLOG("dialog result = %d\n"), result); if (result == -1) { // Dialog box failed, so quit PostQuitMessage(0); if(iImpersonateResult == ERROR_SUCCESS)RevertToSelf(); CloseHandle(hProcess); CloseHandle(hPToken); return; } break; omni_thread::sleep(4); } // Load in all the settings if (!vncService::RunningAsService()) { if (m_fUseRegistry) Load(TRUE); else LoadFromIniFile(); } } } if(iImpersonateResult == ERROR_SUCCESS)RevertToSelf(); if (hProcess) CloseHandle(hProcess); if (hPToken) CloseHandle(hPToken); }