vncproperties.cpp
来自「这是一个比较复杂的远程控制工具,分为服务器与客户斋,让你了解socket编程的知」· C++ 代码 · 共 1,652 行 · 第 1/4 页
CPP
1,652 行
// sf@2003 - Moved DSM params here
m_pref_UseDSMPlugin=false;
m_pref_UseDSMPlugin = LoadInt(hkLocal, "UseDSMPlugin", m_pref_UseDSMPlugin);
LoadDSMPluginName(hkLocal, m_pref_szDSMPlugin);
if (m_server->LoopbackOnly()) m_server->SetLoopbackOk(true);
else m_server->SetLoopbackOk(LoadInt(hkLocal, "AllowLoopback", false));
m_server->SetAuthRequired(LoadInt(hkLocal, "AuthRequired", true));
m_server->SetConnectPriority(LoadInt(hkLocal, "ConnectPriority", 0));
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);
}
// If Socket connections are allowed, should the HTTP server be enabled?
LABELUSERSETTINGS:
// LOAD THE USER PREFERENCES
// Set the default user prefs
vnclog.Print(LL_INTINFO, VNCLOG("clearing user settings\n"));
m_pref_AutoPortSelect=TRUE;
m_pref_HTTPConnect = TRUE;
m_pref_XDMCPConnect = TRUE;
m_pref_PortNumber = RFB_PORT_OFFSET;
m_pref_SockConnect=TRUE;
{
vncPasswd::FromClear crypt;
memcpy(m_pref_passwd, crypt, MAXPWLEN);
}
m_pref_QuerySetting=2;
m_pref_QueryTimeout=10;
m_pref_QueryAccept=0;
m_pref_IdleTimeout=0;
m_pref_EnableRemoteInputs=TRUE;
m_pref_DisableLocalInputs=FALSE;
m_pref_LockSettings=-1;
m_pref_RemoveWallpaper=TRUE;
m_alloweditclients = TRUE;
m_allowshutdown = TRUE;
m_allowproperties = TRUE;
// Modif sf@2002
m_pref_SingleWindow = FALSE;
m_pref_UseDSMPlugin = FALSE;
*m_pref_szDSMPlugin = '\0';
m_pref_EnableFileTransfer = TRUE;
m_pref_FTUserImpersonation = TRUE;
m_pref_EnableBlankMonitor = TRUE;
m_pref_DefaultScale = 1;
m_pref_CaptureAlphaBlending = FALSE;
m_pref_BlackAlphaBlending = FALSE;
// 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 {
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);
}
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();
}
void
vncProperties::LoadUserPrefs(HKEY appkey)
{
// LOAD USER PREFS FROM THE SELECTED KEY
// Modif sf@2002
m_pref_EnableFileTransfer = LoadInt(appkey, "FileTransferEnabled", m_pref_EnableFileTransfer);
m_pref_FTUserImpersonation = LoadInt(appkey, "FTUserImpersonation", m_pref_FTUserImpersonation); // sf@2005
m_pref_EnableBlankMonitor = LoadInt(appkey, "BlankMonitorEnabled", m_pref_EnableBlankMonitor);
m_pref_DefaultScale = LoadInt(appkey, "DefaultScale", m_pref_DefaultScale);
m_pref_CaptureAlphaBlending = LoadInt(appkey, "CaptureAlphaBlending", m_pref_CaptureAlphaBlending); // sf@2005
m_pref_BlackAlphaBlending = LoadInt(appkey, "BlackAlphaBlending", m_pref_BlackAlphaBlending); // sf@2005
m_pref_UseDSMPlugin = LoadInt(appkey, "UseDSMPlugin", m_pref_UseDSMPlugin);
LoadDSMPluginName(appkey, m_pref_szDSMPlugin);
// Connection prefs
m_pref_SockConnect=LoadInt(appkey, "SocketConnect", m_pref_SockConnect);
m_pref_HTTPConnect=LoadInt(appkey, "HTTPConnect", m_pref_HTTPConnect);
m_pref_XDMCPConnect=LoadInt(appkey, "XDMCPConnect", m_pref_XDMCPConnect);
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_IdleTimeout=LoadInt(appkey, "IdleTimeout", m_pref_IdleTimeout);
m_pref_RemoveWallpaper=LoadInt(appkey, "RemoveWallpaper", m_pref_RemoveWallpaper);
// 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);
// Load the password
LoadPassword(appkey, m_pref_passwd);
// 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);
}
void
vncProperties::ApplyUserPrefs()
{
// APPLY THE CACHED PREFERENCES TO THE SERVER
// Modif sf@2002
m_server->EnableFileTransfer(m_pref_EnableFileTransfer);
m_server->FTUserImpersonation(m_pref_FTUserImpersonation); // sf@2005
m_server->CaptureAlphaBlending(m_pref_CaptureAlphaBlending); // sf@2005
m_server->BlackAlphaBlending(m_pref_BlackAlphaBlending); // sf@2005
m_server->BlankMonitorEnabled(m_pref_EnableBlankMonitor);
m_server->SetDefaultScale(m_pref_DefaultScale);
// 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->SetAutoIdleDisconnectTimeout(m_pref_IdleTimeout);
m_server->EnableRemoveWallpaper(m_pref_RemoveWallpaper);
// Is the listening socket closing?
if (!m_pref_SockConnect)
m_server->SockConnect(m_pref_SockConnect);
m_server->EnableHTTPConnect(m_pref_HTTPConnect);
m_server->EnableXDMCPConnect(m_pref_XDMCPConnect);
// Are inputs being disabled?
if (!m_pref_EnableRemoteInputs)
m_server->EnableRemoteInputs(m_pref_EnableRemoteInputs);
if (m_pref_DisableLocalInputs)
m_server->DisableLocalInputs(m_pref_DisableLocalInputs);
// Update the password
m_server->SetPassword(m_pref_passwd);
// Now change the listening port settings
m_server->SetAutoPortSelect(m_pref_AutoPortSelect);
if (!m_pref_AutoPortSelect)
// m_server->SetPort(m_pref_PortNumber);
m_server->SetPorts(m_pref_PortNumber, m_pref_HttpPortNumber); // Tight 1.2.7
m_server->SockConnect(m_pref_SockConnect);
// Remote access prefs
m_server->EnableRemoteInputs(m_pref_EnableRemoteInputs);
m_server->SetLockSettings(m_pref_LockSettings);
m_server->DisableLocalInputs(m_pref_DisableLocalInputs);
// DSM Plugin prefs
m_server->EnableDSMPlugin(m_pref_UseDSMPlugin);
m_server->SetDSMPluginName(m_pref_szDSMPlugin);
if (m_server->IsDSMPluginEnabled()) m_server->SetDSMPlugin();
}
void
vncProperties::SaveInt(HKEY key, LPCSTR valname, LONG val)
{
RegSetValueEx(key, valname, 0, REG_DWORD, (LPBYTE) &val, sizeof(val));
}
void
vncProperties::SavePassword(HKEY key, char *buffer)
{
RegSetValueEx(key, "Password", 0, REG_BINARY, (LPBYTE) buffer, MAXPWLEN);
}
void
vncProperties::SaveDSMPluginName(HKEY key, char *buffer)
{
RegSetValueEx(key, "DSMPlugin", 0, REG_BINARY, (LPBYTE) buffer, MAXPATH);
}
void
vncProperties::LoadDSMPluginName(HKEY key, char *buffer)
{
DWORD type = REG_BINARY;
int slen=MAXPATH;
char inouttext[MAXPATH];
if (RegQueryValueEx(key,
"DSMPlugin",
NULL,
&type,
(LPBYTE) &inouttext,
(LPDWORD) &slen) != ERROR_SUCCESS)
return;
if (slen > MAXPATH)
return;
memcpy(buffer, inouttext, MAXPATH);
}
void
vncProperties::Save()
{
HKEY appkey;
DWORD dw;
if (!m_allowproperties || !RunningAsAdministrator ())
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, sz_ID_MB1, sz_ID_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);
RegCloseKey(HKEY_CURRENT_USER);
// Machine Preferences
// Get the machine registry key for WinVNC
HKEY hkLocal,hkDefault;
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;
if (RegCreateKeyEx(hkLocal,
"Default",
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ,
NULL,
&hkDefault,
&dw) != ERROR_SUCCESS)
hkDefault = NULL;
// sf@2003
SaveInt(hkLocal, "DebugMode", vnclog.GetMode());
SaveInt(hkLocal, "DebugLevel", vnclog.GetLevel());
SaveInt(hkLocal, "AllowLoopback", m_server->LoopbackOk());
SaveInt(hkLocal, "LoopbackOnly", m_server->LoopbackOnly());
if (hkDefault) SaveInt(hkDefault, "AllowShutdown", m_allowshutdown);
if (hkDefault) SaveInt(hkDefault, "AllowProperties", m_allowproperties);
if (hkDefault) SaveInt(hkDefault, "AllowEditClients", m_alloweditclients);
SaveInt(hkLocal, "DisableTrayIcon", m_server->GetDisableTrayIcon());
SaveInt(hkLocal, "MSLogonRequired", m_server->MSLogonRequired());
// Marscha@2004 - authSSP: save "New MS-Logon" state
SaveInt(hkLocal, "NewMSLogon", m_server->GetNewMSLogon());
// sf@2003 - DSM params here
SaveInt(hkLocal, "UseDSMPlugin", m_server->IsDSMPluginEnabled());
SaveInt(hkLocal, "ConnectPriority", m_server->ConnectPriority());
SaveDSMPluginName(hkLocal, m_server->GetDSMPluginName());
RegCloseKey(hkDefault);
RegCloseKey(hkLocal);
}
void
vncProperties::SaveUserPrefs(HKEY appkey)
{
// SAVE THE PER USER PREFS
vnclog.Print(LL_INTINFO, VNCLOG("saving current settings to registry\n"));
// Modif sf@2002
SaveInt(appkey, "FileTransferEnabled", m_server->FileTransferEnabled());
SaveInt(appkey, "FTUserImpersonation", m_server->FTUserImpersonation()); // sf@2005
SaveInt(appkey, "BlankMonitorEnabled", m_server->BlankMonitorEnabled());
SaveInt(appkey, "CaptureAlphaBlending", m_server->CaptureAlphaBlending()); // sf@2005
SaveInt(appkey, "BlackAlphaBlending", m_server->BlackAlphaBlending()); // sf@2005
SaveInt(appkey, "DefaultScale", m_server->GetDefaultScale());
SaveInt(appkey, "UseDSMPlugin", m_server->IsDSMPluginEnabled());
SaveDSMPluginName(appkey, m_server->GetDSMPluginName());
// Connection prefs
SaveInt(appkey, "SocketConnect", m_server->SockConnected());
SaveInt(appkey, "HTTPConnect", m_server->HTTPConnectEnabled());
SaveInt(appkey, "XDMCPConnect", m_server->XDMCPConnectEnabled());
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());
// Connection querying settings
SaveInt(appkey, "QuerySetting", m_server->QuerySetting());
SaveInt(appkey, "QueryTimeout", m_server->QueryTimeout());
SaveInt(appkey, "QueryAccept", m_server->QueryAccept());
// Lock settings
SaveInt(appkey, "LockSetting", m_server->LockSettings());
// Wallpaper removal
SaveInt(appkey, "RemoveWallpaper", m_server->RemoveWallpaperEnabled());
// Save the password
char passwd[MAXPWLEN];
m_server->GetPassword(passwd);
SavePassword(appkey, passwd);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?