作为优秀的开源软件,VNC中的类库定义得很规范,逻辑结构也很完整。由于对静态库还不是很熟悉,并且我的任务只是看看VNC配置功能的是如何实现的,因此这里把我对这些功能的代码分析贴出来,希望能给想对VNC的程序结构进行探索的人提供一点思路,也希望有开发过VNC经验的人指证和指导。
Vncconfig这个工程里面主要实现的是服务器端的系统配置,具体过程如下:
建立控制台——》初始化系统日志表——》创建编辑注册表的对象——》异常处理程序访问注册表权限——》创建读取注册表的键类——》建立登陆对话框,初始化方法写入注册表……——》属性页设制——》生成调试日志——》显示属性页
功能图:
vncconfig
一
Authentication
二
Connections
三
Desktop
六
Legacy
七
Sharing
五
Inputs
四
Hooking
具体功能如下:
一.登陆验证设定
关联文件:Authentication.h
关联类或函数:AuthenticationPage类,初始化带一个注册键值的参数
关联类:
VncPasswdDialog操作登陆对话框
AuthenticationPage操作登陆属性页
功能:登陆密码设定,可选项为
无需验证setItemChecked(IDC_AUTH_NONE, useNone);
设置密码setItemChecked(IDC_AUTH_VNC, useVNC);
即时连接rfb::Server::queryConnect
二.连接设置
关联文件:Connections.h, network/TcpSocket.h
关联类或函数:
静态:
ConnectionsPage类,初始化带一个注册键值的参数
IntParameter类,初始化连接参数
StringParameter类,筛选服务器认证的客户IP
BoolParameter类,筛选带低延迟,高带宽的客户
内部:
ConnHostDialog类,连接主机对话框
ConnectionsPage类,连接设置属性页
功能:
1.设定端口号setItemInt
2.设定多长时间后禁用不活动的客户rfb::Server::idleTimeout
3.设定网络服务端口setItemInt
联入限制:
1.只限本地用户连接setItemChecked
2.添加删除修改授权用户setItemChecked
关联关键技术函数实现:
三.桌面设置
关联文件:Desktop.h
关联类或函数:DesktopPage类,初始化带一个注册键值的参数
功能:1.连接时可选:
移除壁纸rfb::win32::SDisplay::removeWallpaper
移除背景模型rfb::win32::SDisplay::removePattern
禁用用用户对桌面的操作rfb::win32::SDisplay::disableEffects
2.断线时可选:
无操作!disconnectLock && !disconnectLogoff
锁定工作区disconnectLock
强制用户下线disconnectLogoff
四.钩子设置
关联文件:Hooking.h
关联类或函数:HookingPage类,初始化带一个注册键值的参数
功能:可选
1.跟踪图像变化rfb::win32::SDisplay::use_hooks
2.控制台窗口变化rfb::win32::WMPoller::poll_console_windows
3.过滤变化效果rfb::Server::compareFB
五.输入设置
关联文件:Inputs.h
关联类或函数:InputsPage类,初始化带一个注册键值的参数
功能:可选
1.接受客户鼠标操作rfb::Server::acceptPointerEvents
2.接受客户键盘操作rfb::Server::acceptKeyEvents
3.接受客户剪切板操作rfb::Server::acceptCutText
4.发送剪切板变化给客户rfb::Server::sendCutText
5.允许客户对屏幕操作
6.当本地需要操作时禁用客户操作SDisplay::disableLocalInputs
六.版本兼容
关联文件:Legacy.h/Legacy.cxx
关联类或函数:
legacy类,初始化带一个注册键值及键值设置的参数
LoadPrefs(),加载3.3版本参数
LoadUserPrefs(), 加载客户设置
功能:兼容3.3版
七.共享设置
关联文件:Sharing.h
关联类或函数:SharingPage类,初始化带一个注册键值的参数
功能:可选
关联关键技术函数实现:
1.从不连接客户rfb::Server::disconnectClients
2.从不默认连接共享rfb::Server::neverShared
3. 总是默认连接共rfb::Server::alwaysShared
4. 使用客户设定的共享设置rfb::Server::neverShared || rfb::Server::alwaysShared
RFB_WIN32静态库里定义了:
1. 对话框类:Dialog,VncPasswdDialog等类都是从它继承的
功能函数:
bool showDialog(const TCHAR* resource, HWND owner=0);
virtual void initDialog() {}
virtual bool onCommand(int item, int cmd) { return false; }
virtual bool onHelp(int item) { return false; }
virtual bool onOk() { return true; }
bool isItemChecked(int id);
int getItemInt(int id);
TCHAR* getItemString(int id);
void setItemChecked(int id, bool state);
void setItemInt(int id, int value);
void setItemString(int id, const TCHAR* s);
void enableItem(int id, bool state);
2. 属性页类:PropSheetPage, AuthenticationPage等类都是从它继承的,其中主要函数:
initDialog()用于初始化子对话框
OnCommand()用于响应功能消息
OnOK()用于确认执行将属性写入注册表的操作
3. 编辑注册表键类:RegKey
功能函数:
bool createKey(const RegKey& root, const TCHAR* name);
void openKey(const RegKey& root, const TCHAR* name, bool readOnly=false);
void setDACL(const PACL acl, bool inheritFromParent=true);设置任意访问控制列表
void close();
void deleteKey(const TCHAR* name) const;
void deleteValue(const TCHAR* name) const;
void awaitChange(bool watchSubTree, DWORD filter) const;
void setExpandString(const TCHAR* valname, const TCHAR* s) const;
void setString(const TCHAR* valname, const TCHAR* s) const;
void setBinary(const TCHAR* valname, const void* data, int length) const;
void setInt(const TCHAR* valname, int i) const;
void setBool(const TCHAR* valname, bool b) const;
TCHAR* getString(const TCHAR* valname) const;
TCHAR* getString(const TCHAR* valname, const TCHAR* def) const;
void getBinary(const TCHAR* valname, void** data, int* length) const;
void getBinary(const TCHAR* valname, void** data, int* length, void* def, int deflength) const;
int getInt(const TCHAR* valname) const;
int getInt(const TCHAR* valname, int def) const;
bool getBool(const TCHAR* valname) const;
bool getBool(const TCHAR* valname, bool def) const;
TCHAR* getRepresentation(const TCHAR* valname) const;
bool isValue(const TCHAR* valname) const;
const TCHAR* getValueName(int i);
4. 读取注册表键类:RegistryReader
功能函数:
bool setKey(const HKEY rootkey, const TCHAR* keyname);
bool setNotifyThread(Thread* thread, UINT winMsg, WPARAM wParam=0, LPARAM lParam=0);
bool setNotifyWindow(HWND window, UINT winMsg, WPARAM wParam=0, LPARAM lParam=0);
static void loadRegistryConfig(RegKey& key);
5. 写入注册表限定类(结构体):包含在Security.h里,估计是保证安全的代码
AccessEntries建立控制入口列表
Sid 设置安全ID
AccessControlList控制入口列表
RFB静态库里定义了:
1. 操作日志类:
LogWriter(写日志)
Logger(生成日志实例)
LogParameter(设置日志记录参数)
2. 服务器设置参数定义类Server:封装定义了idleTimeout等参数
阅读(2354) | 评论(0) | 转发(0) |