vncproperties.cpp
来自「Web VNC samples delphi」· C++ 代码 · 共 1,204 行 · 第 1/3 页
CPP
1,204 行
// Get the default key
if ( hkLocal == NULL ||
RegCreateKeyEx(hkLocal, "Default", 0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkDefault, &dw) != ERROR_SUCCESS )
hkDefault = NULL;
// LOAD THE MACHINE-LEVEL PREFS
// Logging/debugging prefs
vnclog.Print(LL_INTINFO, VNCLOG("loading local-only settings\n"));
vnclog.SetMode(LoadInt(hkLocal, "DebugMode", 0));
vnclog.SetLevel(LoadInt(hkLocal, "DebugLevel", 0));
// Disable Tray Icon
m_server->SetDisableTrayIcon(LoadInt(hkLocal, "DisableTrayIcon", false));
// Authentication required, loopback allowed, loopbackOnly
m_server->SetLoopbackOk(LoadInt(hkLocal, "AllowLoopback", false));
if (!m_server->LoopbackOk())
m_server->SetLoopbackOnly(false);
else
m_server->SetLoopbackOnly(LoadInt(hkLocal, "LoopbackOnly", false));
m_server->SetHttpdEnabled(LoadInt(hkLocal, "EnableHTTPDaemon", true),
LoadInt(hkLocal, "EnableURLParams", false));
m_server->SetAuthRequired(LoadInt(hkLocal, "AuthRequired", true));
// NOTE: RealVNC sets ConnectPriority to 0 by default, we set it to 2.
m_server->SetConnectPriority(LoadInt(hkLocal, "ConnectPriority", 2));
if (!m_server->LoopbackOnly())
{
char *authhosts = LoadString(hkLocal, "AuthHosts");
if (authhosts != 0) {
m_server->SetAuthHosts(authhosts);
delete [] authhosts;
} else {
m_server->SetAuthHosts(0);
}
} else {
m_server->SetAuthHosts(0);
}
// LOAD THE USER PREFERENCES
// Set the default user prefs
vnclog.Print(LL_INTINFO, VNCLOG("clearing user settings\n"));
m_pref_AutoPortSelect=TRUE;
m_pref_PortNumber=RFB_PORT_OFFSET;
m_pref_SockConnect=TRUE;
m_pref_CORBAConn=FALSE;
{
vncPasswd::FromClear crypt;
memcpy(m_pref_passwd, crypt, MAXPWLEN);
m_pref_passwd_set = FALSE;
memcpy(m_pref_passwd_viewonly, crypt, MAXPWLEN);
m_pref_passwd_viewonly_set = FALSE;
}
m_pref_QuerySetting=2;
m_pref_QueryTimeout=30;
m_pref_QueryAccept=FALSE;
m_pref_QueryAllowNoPass=FALSE;
m_pref_IdleTimeout=0;
m_pref_EnableRemoteInputs=TRUE;
m_pref_DisableLocalInputs=FALSE;
m_pref_LockSettings=-1;
m_pref_PollUnderCursor=FALSE;
m_pref_PollForeground=TRUE;
m_pref_PollFullScreen=FALSE;
m_pref_PollConsoleOnly=TRUE;
m_pref_PollOnEventOnly=FALSE;
m_pref_DontSetHooks=FALSE;
m_pref_DontUseDriver=FALSE;
m_pref_DriverDirectAccess=TRUE;
m_pref_RemoveWallpaper=TRUE;
m_pref_BlankScreen = FALSE;
m_pref_EnableFileTransfers = TRUE;
m_alloweditclients = TRUE;
m_allowshutdown = TRUE;
m_allowproperties = TRUE;
m_pref_PriorityTime = 3;
m_pref_LocalInputPriority = FALSE;
m_pref_PollingCycle = 300;
// Load the local prefs for this user
if (hkDefault != NULL)
{
vnclog.Print(LL_INTINFO, VNCLOG("loading DEFAULT local settings\n"));
LoadUserPrefs(hkDefault);
m_allowshutdown = LoadInt(hkDefault, "AllowShutdown", m_allowshutdown);
m_allowproperties = LoadInt(hkDefault, "AllowProperties", m_allowproperties);
m_alloweditclients = LoadInt(hkDefault, "AllowEditClients", m_alloweditclients);
}
// Are we being asked to load the user settings, or just the default local system settings?
if (usersettings) {
// We want the user settings, so load them!
if (hkLocalUser != NULL)
{
vnclog.Print(LL_INTINFO, VNCLOG("loading \"%s\" local settings\n"), username);
LoadUserPrefs(hkLocalUser);
m_allowshutdown = LoadInt(hkLocalUser, "AllowShutdown", m_allowshutdown);
m_allowproperties = LoadInt(hkLocalUser, "AllowProperties", m_allowproperties);
m_alloweditclients = LoadInt(hkLocalUser, "AllowEditClients", m_alloweditclients);
}
// Now override the system settings with the user's settings
// If the username is SYSTEM then don't try to load them, because there aren't any...
if (m_allowproperties && (strcmp(username, "SYSTEM") != 0))
{
HKEY hkGlobalUser;
if (RegCreateKeyEx(HKEY_CURRENT_USER,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkGlobalUser, &dw) == ERROR_SUCCESS)
{
vnclog.Print(LL_INTINFO, VNCLOG("loading \"%s\" global settings\n"), username);
LoadUserPrefs(hkGlobalUser);
RegCloseKey(hkGlobalUser);
// Close the user registry hive so it can unload if required
RegCloseKey(HKEY_CURRENT_USER);
}
}
} else {
vnclog.Print(LL_INTINFO, VNCLOG("bypassing user-specific settings (both local and global)\n"));
}
if (hkLocalUser != NULL) RegCloseKey(hkLocalUser);
if (hkDefault != NULL) RegCloseKey(hkDefault);
if (hkLocal != NULL) RegCloseKey(hkLocal);
// Make the loaded settings active..
ApplyUserPrefs();
// Note whether we loaded the user settings or just the default system settings
m_usersettings = usersettings;
}
void
vncProperties::LoadUserPrefs(HKEY appkey)
{
// LOAD USER PREFS FROM THE SELECTED KEY
// Connection prefs
m_pref_SockConnect=LoadInt(appkey, "SocketConnect", m_pref_SockConnect);
m_pref_AutoPortSelect=LoadInt(appkey, "AutoPortSelect", m_pref_AutoPortSelect);
m_pref_PortNumber=LoadInt(appkey, "PortNumber", m_pref_PortNumber);
m_pref_HttpPortNumber=LoadInt(appkey, "HTTPPortNumber",
DISPLAY_TO_HPORT(PORT_TO_DISPLAY(m_pref_PortNumber)));
m_pref_BeepConnect=LoadInt(appkey, "BeepConnect", m_pref_BeepConnect);
m_pref_BeepDisconnect=LoadInt(appkey, "BeepDisconnect", m_pref_BeepDisconnect);
m_pref_IdleTimeout=LoadInt(appkey, "IdleTimeout", m_pref_IdleTimeout);
m_pref_RemoveWallpaper=LoadInt(appkey, "RemoveWallpaper", m_pref_RemoveWallpaper);
m_pref_BlankScreen=LoadInt(appkey, "BlankScreen", m_pref_BlankScreen);
m_pref_EnableFileTransfers=LoadInt(appkey, "EnableFileTransfers", m_pref_EnableFileTransfers);
m_pref_PriorityTime =LoadInt(appkey, "LocalInputsPriorityTime", m_pref_PriorityTime);
// Connection querying settings
m_pref_QuerySetting=LoadInt(appkey, "QuerySetting", m_pref_QuerySetting);
m_server->SetQuerySetting(m_pref_QuerySetting);
m_pref_QueryTimeout=LoadInt(appkey, "QueryTimeout", m_pref_QueryTimeout);
m_server->SetQueryTimeout(m_pref_QueryTimeout);
m_pref_QueryAccept=LoadInt(appkey, "QueryAccept", m_pref_QueryAccept);
m_server->SetQueryAccept(m_pref_QueryAccept);
m_pref_QueryAllowNoPass=LoadInt(appkey, "QueryAllowNoPass", m_pref_QueryAllowNoPass);
m_server->SetQueryAllowNoPass(m_pref_QueryAllowNoPass);
// Load the primary password
BOOL loaded = LoadPassword(appkey, m_pref_passwd, "Password");
m_pref_passwd_set = m_pref_passwd_set || loaded;
// Load the view-only password
loaded = LoadPassword(appkey, m_pref_passwd_viewonly, "PasswordViewOnly");
m_pref_passwd_viewonly_set = m_pref_passwd_viewonly_set || loaded;
// CORBA Settings
m_pref_CORBAConn=LoadInt(appkey, "CORBAConnect", m_pref_CORBAConn);
// Remote access prefs
m_pref_EnableRemoteInputs=LoadInt(appkey, "InputsEnabled", m_pref_EnableRemoteInputs);
m_pref_LockSettings=LoadInt(appkey, "LockSetting", m_pref_LockSettings);
m_pref_DisableLocalInputs=LoadInt(appkey, "LocalInputsDisabled", m_pref_DisableLocalInputs);
m_pref_PollingCycle=LoadInt(appkey, "PollingCycle", m_pref_PollingCycle);
// Polling prefs
m_pref_PollUnderCursor=LoadInt(appkey, "PollUnderCursor", m_pref_PollUnderCursor);
m_pref_PollForeground=LoadInt(appkey, "PollForeground", m_pref_PollForeground);
m_pref_PollFullScreen=LoadInt(appkey, "PollFullScreen", m_pref_PollFullScreen);
m_pref_PollConsoleOnly=LoadInt(appkey, "OnlyPollConsole", m_pref_PollConsoleOnly);
m_pref_PollOnEventOnly=LoadInt(appkey, "OnlyPollOnEvent", m_pref_PollOnEventOnly);
m_pref_DontSetHooks=LoadInt(appkey, "DontSetHooks", m_pref_DontSetHooks);
m_pref_DontUseDriver=LoadInt(appkey, "DontUseDriver", m_pref_DontUseDriver);
m_pref_DriverDirectAccess=LoadInt(appkey, "DriverDirectAccess", m_pref_DriverDirectAccess);
m_pref_LocalInputPriority=LoadInt(appkey, "LocalInputsPriority", m_pref_LocalInputPriority);
}
void
vncProperties::ApplyUserPrefs()
{
// APPLY THE CACHED PREFERENCES TO THE SERVER
// Update the connection querying settings
m_server->SetQuerySetting(m_pref_QuerySetting);
m_server->SetQueryTimeout(m_pref_QueryTimeout);
m_server->SetQueryAccept(m_pref_QueryAccept);
m_server->SetQueryAllowNoPass(m_pref_QueryAllowNoPass);
m_server->SetAutoIdleDisconnectTimeout(m_pref_IdleTimeout);
m_server->EnableRemoveWallpaper(m_pref_RemoveWallpaper);
m_server->SetBlankScreen(m_pref_BlankScreen);
m_server->EnableFileTransfers(m_pref_EnableFileTransfers);
// Update the password
m_server->SetPassword(m_pref_passwd_set, m_pref_passwd);
m_server->SetPasswordViewOnly(m_pref_passwd_viewonly_set, m_pref_passwd_viewonly);
// Now change the listening port settings
m_server->SetAutoPortSelect(m_pref_AutoPortSelect);
if (!m_pref_AutoPortSelect)
m_server->SetPorts(m_pref_PortNumber, m_pref_HttpPortNumber);
// Set the beep options
m_server->SetBeepConnect(m_pref_BeepConnect);
m_server->SetBeepDisconnect(m_pref_BeepDisconnect);
// Set the CORBA connection status
m_server->CORBAConnect(m_pref_CORBAConn);
// Remote access prefs
m_server->EnableRemoteInputs(m_pref_EnableRemoteInputs);
m_server->SetLockSettings(m_pref_LockSettings);
m_server->DisableLocalInputs(m_pref_DisableLocalInputs);
m_server->SetDisableTime(m_pref_PriorityTime);
m_server->SetPollingCycle(m_pref_PollingCycle);
m_server->SockConnect(m_pref_SockConnect);
// Polling prefs
m_server->PollUnderCursor(m_pref_PollUnderCursor);
m_server->PollForeground(m_pref_PollForeground);
m_server->PollFullScreen(m_pref_PollFullScreen);
m_server->PollConsoleOnly(m_pref_PollConsoleOnly);
m_server->PollOnEventOnly(m_pref_PollOnEventOnly);
m_server->DontSetHooks(m_pref_DontSetHooks);
m_server->DontUseDriver(m_pref_DontUseDriver);
m_server->DriverDirectAccess(m_pref_DriverDirectAccess);
m_server->LocalInputPriority(m_pref_LocalInputPriority);
}
void
vncProperties::SaveInt(HKEY key, LPCSTR valname, LONG val)
{
RegSetValueEx(key, valname, 0, REG_DWORD, (LPBYTE) &val, sizeof(val));
}
void
vncProperties::SavePassword(HKEY key, const char *buffer, const char *entry_name)
{
RegSetValueEx(key, entry_name, 0, REG_BINARY, (LPBYTE) buffer, MAXPWLEN);
}
void
vncProperties::Save()
{
HKEY appkey;
DWORD dw;
if (!m_allowproperties)
return;
// NEW (R3) PREFERENCES ALGORITHM
// The user's prefs are only saved if the user is allowed to override
// the machine-local settings specified for them. Otherwise, the
// properties entry on the tray icon menu will be greyed out.
// GET THE CORRECT KEY TO READ FROM
// Have we loaded user settings, or system settings?
if (m_usersettings) {
// Verify that we know who is logged on
char username[UNLEN+1];
if (!vncService::CurrentUser((char *)&username, sizeof(username)))
return;
if (strcmp(username, "") == 0)
return;
// Try to get the per-user, global registry key for WinVNC
if (RegCreateKeyEx(HKEY_CURRENT_USER,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL, &appkey, &dw) != ERROR_SUCCESS)
return;
} else {
// Try to get the default local registry key for WinVNC
HKEY hkLocal;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS) {
MessageBox(NULL, "MB1", "WVNC", MB_OK);
return;
}
if (RegCreateKeyEx(hkLocal,
"Default",
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL, &appkey, &dw) != ERROR_SUCCESS) {
RegCloseKey(hkLocal);
return;
}
RegCloseKey(hkLocal);
}
// SAVE PER-USER PREFS IF ALLOWED
SaveUserPrefs(appkey);
RegCloseKey(appkey);
// Machine Preferences
// Try to get the machine registry key for WinVNC
HKEY hkLocal;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS)
return;
SaveInt(hkLocal, "ConnectPriority", m_server->ConnectPriority());
SaveInt(hkLocal, "LoopbackOnly", m_server->LoopbackOnly());
SaveInt(hkLocal, "EnableHTTPDaemon", m_server->HttpdEnabled());
SaveInt(hkLocal, "EnableURLParams", m_server->HttpdParamsEnabled());
SaveInt(hkLocal, "AllowLoopback", m_server->LoopbackOk());
SaveInt(hkLocal, "AuthRequired", m_server->AuthRequired());
SaveInt(hkLocal, "DebugMode", vnclog.GetMode());
SaveInt(hkLocal, "DebugLevel", vnclog.GetLevel());
RegCloseKey(hkLocal);
// Close the user registry hive, to allow it to unload if reqd
RegCloseKey(HKEY_CURRENT_USER);
}
void
vncProperties::SaveUserPrefs(HKEY appkey)
{
// SAVE THE PER USER PREFS
vnclog.Print(LL_INTINFO, VNCLOG("saving current settings to registry\n"));
// Connection prefs
SaveInt(appkey, "SocketConnect", m_server->SockConnected());
SaveInt(appkey, "AutoPortSelect", m_server->AutoPortSelect());
if (!m_server->AutoPortSelect()) {
SaveInt(appkey, "PortNumber", m_server->GetPort());
SaveInt(appkey, "HTTPPortNumber", m_server->GetHttpPort());
}
SaveInt(appkey, "InputsEnabled", m_server->RemoteInputsEnabled());
SaveInt(appkey, "LocalInputsDisabled", m_server->LocalInputsDisabled());
SaveInt(appkey, "IdleTimeout", m_server->AutoIdleDisconnectTimeout());
SaveInt(appkey, "LocalInputsPriorityTime", m_server->DisableTime());
// Connection querying settings
SaveInt(appkey, "QuerySetting", m_server->QuerySetting());
SaveInt(appkey, "QueryTimeout", m_server->QueryTimeout());
SaveInt(appkey, "QueryAccept", m_server->QueryAccept());
SaveInt(appkey, "QueryAllowNoPass", m_server->QueryAllowNoPass());
SaveInt(appkey, "LockSetting", m_server->LockSettings());
SaveInt(appkey, "RemoveWallpaper", m_server->RemoveWallpaperEnabled());
SaveInt(appkey, "BlankScreen", m_server->GetBlankScreen());
SaveInt(appkey, "EnableFileTransfers", m_server->FileTransfersEnabled());
// Save the password
char passwd[MAXPWLEN];
if (m_server->GetPassword(passwd))
SavePassword(appkey, passwd, "Password");
if (m_server->GetPasswordViewOnly(passwd))
SavePassword(appkey, passwd, "PasswordViewOnly");
#if(defined(_CORBA))
// Don't save the CORBA enabled flag if CORBA is not compiled in!
SaveInt(appkey, "CORBAConnect", m_server->CORBAConnected());
#endif
// Polling prefs
SaveInt(appkey, "PollUnderCursor", m_server->PollUnderCursor());
SaveInt(appkey, "PollForeground", m_server->PollForeground());
SaveInt(appkey, "PollFullScreen", m_server->PollFullScreen());
SaveInt(appkey, "OnlyPollConsole", m_server->PollConsoleOnly());
SaveInt(appkey, "OnlyPollOnEvent", m_server->PollOnEventOnly());
SaveInt(appkey, "PollingCycle", m_server->GetPollingCycle());
SaveInt(appkey, "DontSetHooks", m_server->DontSetHooks());
SaveInt(appkey, "DontUseDriver", m_server->DontUseDriver());
SaveInt(appkey, "DriverDirectAccess", m_server->DriverDirectAccess());
SaveInt(appkey, "LocalInputsPriority", m_server->LocalInputPriority());
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?