下面的内容是用 VC.NET 的调试器调试的整个源码而确定的执行流程. 在分析代码时尽量不要静态的分析代码,这样速度很慢的。利用调试器我们可以通过简单的设置断点来跟踪整个执行流程。
WINVNC 调试其整体流程
WinMain 中进行
(1) 初始化套接字库 VSocketSystem
(2) 解析命令行参数
(3) 调用主窗口过程  WinVNCAppMain
       
 WinVNCAppMain 中进行
(1)    确认当前只有一个本实例运行,vncInstHandler
(2)    创建 Server 类, 该类的作用:
动态添加和删除客户端
把本地窗口的更新发送给所有连接的客户端
把客户端的鼠标和键盘事件传递给本地
创建套套接字的连接
(3)    创建菜单和托盘图标 vncMenu
vncMenu中进行:
(1)    构造函数中进行:创建托盘图标窗口
把窗口托盘图标句柄加入到 vncServer.m_notifyList 中
初始化 vncProperties->Init
在调用 Init 中 vncProperties->Load 调用 vncProperties ->ApplyUserPrefs 调用 server->SockConnect 完成各种线程的创建和端口邦定工作。
在 Init 中得到密码检查是否需要验证。
当我们双击图标时vncProperties->ApplyUserPrefs会被调用,
vncProperties->ApplyUserPrefs 调用 vncServer::SockConnect 完成可能的程序重新启动。
当有客户端连接时:
当有客户端连接时,run_undetached 线程接收到连接后调用 AddClient 把客户端添加到一个客户端的映射数组中 Key 是 ClientSocket,值是新建的客户端的类。
然后创建客户端线程.
把客户端添加到未授权客户端列表.
客户端线程的工作(处理与客户端相关的工作):
客户端线程类vncClientThread的Run函数,就相当于线程函数(在线程中被调用)。
在vncClientThread->run 函数中调用 vncClientThread::InitVersion() 函数, InitVersion 函数中工作如下:
(1)    首先向客户端发送自己的(服务器方的)版本号
(2)    接收客户端的版本号
(3)    验证版本号
客户端线程类vncClientThread的Run函数调用vncClientThread->InitAuthenticate
InitAuthenticate的工作是:
(1)    给客户端发送认证请求
(2)    验证客户端是否合法
vncDesktopThread->run_undetached 线程的工作(最核心的功能):
(1)    该线程调用vncDesktop::Startup():
进行所有的初始化工作:
1.    设置象素格式和位图信息
2.    设置各种系统 Hook, 添加系统挂钩,包括屏幕, 键盘,鼠标。
3.    设置一个定时器来处理拉模式(polling mode),每一秒钟执行一次.
这样 TriggerUpdate 例程每秒钟被执行一次.
(2)    设置处理剪切板消息
(3)    创建一个缓存区域对象。所有的区域更新消息都被缓存在该对象中,仅当 TriggerUpdate被触发时,才把这些消息传给所有的客户端。
认证流程:
1.    版本认证过程:
去掉该版本认证过程。
该版本认证过程:大致是服务器端
                     WinVNC 客户端分析
WinMainàVNCviewerApp32::NewConnection(创建ClientConnection 对象)à ClientConnection::Run
ClientConnection::Run 的功能:
(1)    弹出窗口,接收用户输入的服务器的IP地址和端口号
(2)    取得连接信息,进行连接 ClientConnection::GetConnectDetails()
(3)    版本信息的认证  ClientConnection::NegotiateProtocolVersion()
(4)    进行权限的验证  ClientConnection::Authenticate();
修改时间:2007年8月25日星期六
修改内容:去掉了 AuthDialog.cpp,AuthDialog.h ,这个认证会话框的内容是客户端输入服务器的密码才能对服务器端进行远程控制。
修改时间:8/25/2007 9:43:10 AM
修改内容:去掉 log.cpp 和log.h 内容
        这个是对各个操作结果内容的记录
对于客户端的代码
该功能实现的一个重要方法:
ClientConnection 类的创建主显示窗口,窗口过程是静态方法
Static ClientConnection::WinProc
ClientConnection 类的创建一个线程,
在线程中调用了 ClientConnection ::run_undetached 这就相当于该类中的方法是线程方法一样。
ClientConnection::run_undetached 分析:
run_undetached 是假的线程方法()中
实现方法可能是:该方法是虚函数,在基类中就已经把该方法作为线程的参数传给了start 函数,该参数是作为函数指针传递的,这样在Start函数中利用函数指针调用该函数就可以了。
继承类只需把run_undetached当做线程方法实现就行了。(这样做的原因是:在线程中不允许线程方法作为其成员,编译不过,是调用约定的问题)
该例程的实现过程:
接收服务器端发送过来的消息类型: frame 更新,ReadBell 等。然后 switch 进入对应的分。
对于 FrameUpdate 的后续处理是:
1.    读取服务器端更新的Rect数目 RectCount,然后进入for循环,次数RectCount
2.    读取每个Rect的头部信息,确定这个Rect的坐标和宽度和高度,以及编码信息
3.    根据编码信息进入swtich 的特定分支, 接收真正的数据
4.    把接收到的 Rect 区域坐标转换成 Windows 坐标。

winVNC 源代码分析相关推荐

  1. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home应 ...

  2. 《LINUX3.0内核源代码分析》第一章:内存寻址

    https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...

  3. Scrapy源代码分析-经常使用的爬虫类-CrawlSpider(三)

    CrawlSpider classscrapy.contrib.spiders.CrawlSpider 爬取一般站点经常使用的spider.其定义了一些规则(rule)来提供跟进link的方便的机制. ...

  4. Android 中View的绘制机制源代码分析 三

    到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...

  5. Android应用程序进程启动过程的源代码分析(1)

    Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制:这两个特点都是在进程的初始化过程中实 ...

  6. AFNetworking 源代码分析

    关于其他 AFNetworking 源代码分析的其他文章: AFNetworking 概述(一) AFNetworking 的核心 AFURLSessionManager(二) 处理请求和响应 AFU ...

  7. Hadoop源代码分析 - MapReduce(转载)

    1. Hadoop源代码分析(MapReduce概论) http://caibinbupt.javaeye.com/blog/336467

  8. RTMPdump(libRTMP) 源代码分析 3: AMF编码

    2019独角兽企业重金招聘Python工程师标准>>> 注:此前写了一些列的分析RTMPdump(libRTMP)源代码的文章,在此列一个列表: RTMPdump 源代码分析 1: ...

  9. Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)

    Step 13.  ActivityStack.startActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/ ...

  10. 区块链教程Fabric1.0源代码分析scc(系统链码)

    区块链教程Fabric1.0源代码分析scc(系统链码),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退,让人们更 ...

最新文章

  1. 置信区间(Confidence Intervals)是什么?如何计算置信区间?置信区间的两种计算方法是什么?二值样本置信区间如何计算?如何基于bootstrap抽样进行置信区间计算?
  2. 【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )
  3. SSO模型及单点登录SSO技术选型
  4. redis主从复制原理、断点续传、无磁盘化复制、过期key处理
  5. C#实现查找指定端口被哪个进程占用并处理进程及dos命令下操作
  6. PHP7 ini 配置大全
  7. 3-2:HTTP协议之URI(URL)和HTTP基本概念及其特征
  8. 高级应用-路由协议配置
  9. docker 配置ssh
  10. 接口测试--apipost如何自定义header中的content-type
  11. Apache Kylin 与 ClickHouse 的对比
  12. 采用install.sh安装脚本进行快速安装astercc
  13. wsdl2java 生成不带JAXBElement的客户端
  14. 原油等特殊期货开户要求和豁免
  15. matlab给语音信号添加噪声
  16. 【微信小程序】微信Web开发者工具的部分界面功能
  17. 华数机器人旋转编程_华数工业机器人编程 MOVE运动指令
  18. python123手机版本_Python123
  19. Qt与云服务器项目,qt 云服务器
  20. 丽江古城历史悠久,古朴自然

热门文章

  1. C++类的常数据成员和常成员函数
  2. Latex的pdf合并
  3. vlan绑定_华为S5700交换机设置IP-MAC绑定功能
  4. linux运行ktr文件,Linux下用命令來執行kettle文件資源庫的文件ktr與kjb的方法
  5. OCR营业执照识别助力工商信息智能注册
  6. 商品详情页静态html,day08(商品详情页SKU联动+FreeMarker模版页面静态化)
  7. dell服务器新bois系统设置u盘启动,跟大家讲讲dell新版biosU盘启动顺序
  8. 古时候有个【百僧问题】,一百馒头一百僧,大僧三个更无争,小僧三人分一个,大小和尚各几丁? *...
  9. itunes下载的软件所在目录
  10. TLD文件自定义标签