vncproperties.cpp
来自「这是一个比较复杂的远程控制工具,分为服务器与客户斋,让你了解socket编程的知」· C++ 代码 · 共 1,652 行 · 第 1/4 页
CPP
1,652 行
case IDC_AUTO_DISPLAY_NO:
// User has toggled the Auto Port Select feature.
// If this is in use, then we don't allow the Display number field
// to be modified!
{
// Get the auto select button
HWND hPortNoAuto = GetDlgItem(hwnd, IDC_AUTO_DISPLAY_NO);
// Should the portno field be modifiable?
BOOL enable = SendMessage(hPortNoAuto, BM_GETCHECK, 0, 0) != BST_CHECKED;
// Set the state
HWND hPortNo = GetDlgItem(hwnd, IDC_PORTNO);
EnableWindow(hPortNo, enable);
}
return TRUE;
*/
// Query window option - Taken from TightVNC advanced properties code
case IDQUERY:
{
HWND hQuery = GetDlgItem(hwnd, IDQUERY);
BOOL queryon = (SendMessage(hQuery, BM_GETCHECK, 0, 0) == BST_CHECKED);
EnableWindow(GetDlgItem(hwnd, IDQUERYTIMEOUT), queryon);
}
return TRUE;
// sf@2002 - DSM Plugin
case IDC_PLUGIN_CHECK:
{
HWND hUse = GetDlgItem(hwnd, IDC_PLUGIN_CHECK);
BOOL enable = SendMessage(hUse, BM_GETCHECK, 0, 0) == BST_CHECKED;
HWND hButton = GetDlgItem(hwnd, IDC_PLUGIN_BUTTON);
EnableWindow(hButton, enable);
}
return TRUE;
// Marscha@2004 - authSSP: moved MSLogon checkbox back to admin props page
// Reason: Different UI for old and new mslogon group config.
case IDC_MSLOGON_CHECKD:
{
BOOL bMSLogonChecked =
(SendDlgItemMessage(hwnd, IDC_MSLOGON_CHECKD,
BM_GETCHECK, 0, 0) == BST_CHECKED);
EnableWindow(GetDlgItem(hwnd, IDC_NEW_MSLOGON), bMSLogonChecked);
EnableWindow(GetDlgItem(hwnd, IDC_MSLOGON), bMSLogonChecked);
}
return TRUE;
case IDC_MSLOGON:
{
// Marscha@2004 - authSSP: if "New MS-Logon" is checked,
// call vncEditSecurity from SecurityEditor.dll,
// else call "old" dialog.
BOOL bNewMSLogonChecked =
(SendDlgItemMessage(hwnd, IDC_NEW_MSLOGON,
BM_GETCHECK, 0, 0) == BST_CHECKED);
if (bNewMSLogonChecked) {
char szCurrentDir[MAX_PATH];
if (GetModuleFileName(NULL, szCurrentDir, MAX_PATH)) {
char* p = strrchr(szCurrentDir, '\\');
*p = '\0';
strcat (szCurrentDir,"\\authSSP.dll");
}
HMODULE hModule = LoadLibrary(szCurrentDir);
if (hModule) {
vncEditSecurity = (vncEditSecurityFn) GetProcAddress(hModule, "vncEditSecurity");
HRESULT hr = CoInitialize(NULL);
vncEditSecurity(hwnd, hAppInstance);
CoUninitialize();
FreeLibrary(hModule);
}
} else {
// Marscha@2004 - authSSP: end of change
_this->m_vncauth.Init(_this->m_server);
_this->m_vncauth.Show(TRUE);
}
}
return TRUE;
case IDC_CHECKDRIVER:
{
CheckVideoDriver(1);
}
return TRUE;
case IDC_PLUGIN_BUTTON:
{
HWND hPlugin = GetDlgItem(hwnd, IDC_PLUGIN_CHECK);
if (SendMessage(hPlugin, BM_GETCHECK, 0, 0) == BST_CHECKED)
{
TCHAR szPlugin[MAX_PATH];
GetDlgItemText(hwnd, IDC_PLUGINS_COMBO, szPlugin, MAX_PATH);
if (!_this->m_server->GetDSMPluginPointer()->IsLoaded())
_this->m_server->GetDSMPluginPointer()->LoadPlugin(szPlugin, false);
else
{
// sf@2003 - We check if the loaded plugin is the same than
// the currently selected one or not
_this->m_server->GetDSMPluginPointer()->DescribePlugin();
if (stricmp(_this->m_server->GetDSMPluginPointer()->GetPluginFileName(), szPlugin))
{
_this->m_server->GetDSMPluginPointer()->UnloadPlugin();
_this->m_server->GetDSMPluginPointer()->LoadPlugin(szPlugin, false);
}
}
if (_this->m_server->GetDSMPluginPointer()->IsLoaded())
{
// We don't send the password yet... no matter the plugin requires
// it or not, we will provide it later (at plugin "real" init)
// Knowing the environnement ("server-svc" or "server-app") right
// now can be usefull or even mandatory for the plugin
// (specific params saving and so on...)
char szParams[32];
strcpy(szParams, "NoPassword,");
strcat(szParams, vncService::RunningAsService() ? "server-svc" : "server-app");
_this->m_server->GetDSMPluginPointer()->SetPluginParams(hwnd, szParams);
}
else
{
MessageBox(NULL,
sz_ID_PLUGIN_NOT_LOAD,
sz_ID_PLUGIN_LOADIN, MB_OK | MB_ICONEXCLAMATION );
}
}
return TRUE;
}
}
break;
}
return 0;
}
// TightVNC 1.2.7
// Set display/port settings to the correct state
void
vncProperties::InitPortSettings(HWND hwnd)
{
BOOL bConnectSock = m_server->SockConnected();
BOOL bAutoPort = m_server->AutoPortSelect();
UINT port_rfb = m_server->GetPort();
UINT port_http = m_server->GetHttpPort();
int d1 = PORT_TO_DISPLAY(port_rfb);
int d2 = HPORT_TO_DISPLAY(port_http);
BOOL bValidDisplay = (d1 == d2 && d1 >= 0 && d1 <= 99);
CheckDlgButton(hwnd, IDC_PORTNO_AUTO,
(bAutoPort) ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hwnd, IDC_SPECDISPLAY,
(!bAutoPort && bValidDisplay) ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hwnd, IDC_SPECPORT,
(!bAutoPort && !bValidDisplay) ? BST_CHECKED : BST_UNCHECKED);
EnableWindow(GetDlgItem(hwnd, IDC_PORTNO_AUTO), bConnectSock);
EnableWindow(GetDlgItem(hwnd, IDC_SPECDISPLAY), bConnectSock);
EnableWindow(GetDlgItem(hwnd, IDC_SPECPORT), bConnectSock);
if (bValidDisplay) {
SetDlgItemInt(hwnd, IDC_DISPLAYNO, d1, FALSE);
} else {
SetDlgItemText(hwnd, IDC_DISPLAYNO, "");
}
SetDlgItemInt(hwnd, IDC_PORTRFB, port_rfb, FALSE);
SetDlgItemInt(hwnd, IDC_PORTHTTP, port_http, FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_DISPLAYNO),
bConnectSock && !bAutoPort && bValidDisplay);
EnableWindow(GetDlgItem(hwnd, IDC_PORTRFB),
bConnectSock && !bAutoPort && !bValidDisplay);
EnableWindow(GetDlgItem(hwnd, IDC_PORTHTTP),
bConnectSock && !bAutoPort && !bValidDisplay);
}
// Functions to load & save the settings
LONG
vncProperties::LoadInt(HKEY key, LPCSTR valname, LONG defval)
{
LONG pref;
ULONG type = REG_DWORD;
ULONG prefsize = sizeof(pref);
if (RegQueryValueEx(key,
valname,
NULL,
&type,
(LPBYTE) &pref,
&prefsize) != ERROR_SUCCESS)
return defval;
if (type != REG_DWORD)
return defval;
if (prefsize != sizeof(pref))
return defval;
return pref;
}
void
vncProperties::LoadPassword(HKEY key, char *buffer)
{
DWORD type = REG_BINARY;
int slen=MAXPWLEN;
char inouttext[MAXPWLEN];
// Retrieve the encrypted password
if (RegQueryValueEx(key,
"Password",
NULL,
&type,
(LPBYTE) &inouttext,
(LPDWORD) &slen) != ERROR_SUCCESS)
return;
if (slen > MAXPWLEN)
return;
memcpy(buffer, inouttext, MAXPWLEN);
}
char *
vncProperties::LoadString(HKEY key, LPCSTR keyname)
{
DWORD type = REG_SZ;
DWORD buflen = 0;
BYTE *buffer = 0;
// Get the length of the AuthHosts string
if (RegQueryValueEx(key,
keyname,
NULL,
&type,
NULL,
&buflen) != ERROR_SUCCESS)
return 0;
if (type != REG_SZ)
return 0;
buffer = new BYTE[buflen];
if (buffer == 0)
return 0;
// Get the AuthHosts string data
if (RegQueryValueEx(key,
keyname,
NULL,
&type,
buffer,
&buflen) != ERROR_SUCCESS) {
delete [] buffer;
return 0;
}
// Verify the type
if (type != REG_SZ) {
delete [] buffer;
return 0;
}
return (char *)buffer;
}
void
vncProperties::ResetRegistry()
{
char username[UNLEN+1];
HKEY hkLocal, hkLocalUser, hkDefault;
DWORD dw;
if (!vncService::CurrentUser((char *)&username, sizeof(username)))
return;
// If there is no user logged on them default to SYSTEM
if (strcmp(username, "") == 0)
strcpy((char *)&username, "SYSTEM");
// Try to get the machine registry key for WinVNC
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS)
{
hkLocalUser=NULL;
hkDefault=NULL;
goto LABELUSERSETTINGS;
}
// Now try to get the per-user local key
if (RegOpenKeyEx(hkLocal,
username,
0, KEY_READ,
&hkLocalUser) != ERROR_SUCCESS)
hkLocalUser = NULL;
// Get the default key
if (RegCreateKeyEx(hkLocal,
"Default",
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ,
NULL,
&hkDefault,
&dw) != ERROR_SUCCESS)
hkDefault = NULL;
if (hkLocalUser != NULL) RegCloseKey(hkLocalUser);
if (hkDefault != NULL) RegCloseKey(hkDefault);
if (hkLocal != NULL) RegCloseKey(hkLocal);
RegCloseKey(HKEY_LOCAL_MACHINE);
LABELUSERSETTINGS:
if ((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)
{
RegCloseKey(hkGlobalUser);
RegCloseKey(HKEY_CURRENT_USER);
}
}
}
void
vncProperties::Load(BOOL usersettings)
{
if (m_dlgvisible) {
vnclog.Print(LL_INTWARN, VNCLOG("service helper invoked while Properties panel displayed\n"));
return;
}
ResetRegistry();
if (vncService::RunningAsService()) usersettings=false;
m_usersettings=usersettings;
char username[UNLEN+1];
HKEY hkLocal, hkLocalUser, hkDefault;
DWORD dw;
// NEW (R3) PREFERENCES ALGORITHM
// 1. Look in HKEY_LOCAL_MACHINE/Software/ORL/WinVNC3/%username%
// for sysadmin-defined, user-specific settings.
// 2. If not found, fall back to %username%=Default
// 3. If AllowOverrides is set then load settings from
// HKEY_CURRENT_USER/Software/ORL/WinVNC3
// GET THE CORRECT KEY TO READ FROM
// Get the user name / service name
if (!vncService::CurrentUser((char *)&username, sizeof(username)))
return;
// If there is no user logged on them default to SYSTEM
if (strcmp(username, "") == 0)
strcpy((char *)&username, "SYSTEM");
// Try to get the machine registry key for WinVNC
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE,
WINVNC_REGISTRY_KEY,
0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hkLocal, &dw) != ERROR_SUCCESS)
{
hkLocalUser=NULL;
hkDefault=NULL;
goto LABELUSERSETTINGS;
}
// Now try to get the per-user local key
if (RegOpenKeyEx(hkLocal,
username,
0, KEY_READ,
&hkLocalUser) != ERROR_SUCCESS)
hkLocalUser = NULL;
// Get the default key
if (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->SetLoopbackOnly(LoadInt(hkLocal, "LoopbackOnly", false));
m_pref_RequireMSLogon=false;
m_pref_RequireMSLogon = LoadInt(hkLocal, "MSLogonRequired", m_pref_RequireMSLogon);
m_server->RequireMSLogon(m_pref_RequireMSLogon);
// Marscha@2004 - authSSP: added NewMSLogon checkbox to admin props page
m_pref_NewMSLogon = false;
m_pref_NewMSLogon = LoadInt(hkLocal, "NewMSLogon", m_pref_NewMSLogon);
m_server->SetNewMSLogon(m_pref_NewMSLogon);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?