下面的内容是用 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. 跟随一笔交易来看以太坊c++客户端源码执行流程 / 源码分析

    本文初步分析了一个交易在以太坊内部的处理流程,涉及到交易的接收,检查,执行,同步,区块的构建以及挖矿,结合前面一篇基于黄皮书的理解总结,对以太坊有了更多的认识.因为主要的工作在c++层面,所以这里以c ...

  2. Glide源码--执行流程

    Glide的基本使用 看一下郭神的博客,Android图片加载框架最全解析(八),带你全面了解Glide 4的用法 图片加载机制的基本流程 我们从这行代码看起 Glide.with(this).loa ...

  3. python多线程gil_Python 多线程、多进程 (一)之 源码执行流程、GIL

    一.python程序的运行原理 许多时候,在执行一个python文件的时候,会发现在同一目录下会出现一个__pyc__文件夹(python3)或者.pyc后缀(python2)的文件 Python在执 ...

  4. python多线程执行同样代码_Python 多线程、多进程 (一)之 源码执行流程、GIL

    一.python程序的运行原理 许多时候,在执行一个python文件的时候,会发现在同一目录下会出现一个__pyc__文件夹(python3)或者.pyc后缀(python2)的文件 Python在执 ...

  5. Spring源码-执行流程

    编写启动类 public static void main(String[] args) throws Exception {ApplicationContext context = new Clas ...

  6. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  7. struts2 处理请求流程分析(结合源码)1- 孤星随缘ツ http://t.sina.com.cn/samzhxing-iteye技术网站...

    struts2 处理请求流程分析(结合源码)1- 孤星随缘ツ http://t.sina.com.cn/samzhxing-iteye技术网站 2011年08月01日 struts2 源码版本2.0. ...

  8. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  9. Linux内核 eBPF基础:kprobe原理源码分析:源码分析

    Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...

  10. Android 事件分发机制分析及源码详解

    Android 事件分发机制分析及源码详解 文章目录 Android 事件分发机制分析及源码详解 事件的定义 事件分发序列模型 分发序列 分发模型 事件分发对象及相关方法 源码分析 事件分发总结 一般 ...

最新文章

  1. Failed to initiate service connection to simulator
  2. 当Swin Transformer遇上DCN,清华可变形注意力Transformer模型优于多数ViT
  3. cura-engine学习(1)
  4. php utf8格式显示中文,php截取中文字符(utf-8格式)的函数
  5. COM, COM+ and .NET 程序集的区别
  6. table表格字母无法换行
  7. 个人微信api接口调用代码
  8. abb机器人伺服电机报闸是什么_ABB机器人伺服电机进油的分析及解决措施
  9. c语言差分qpsk编码信道估计 pudn,基于DSP的电力线载波OFDM调制解调器设计.doc
  10. python求角度_python根据坐标点的坐标计算角度
  11. iOS(iPhone,iPad))开发(Obje…
  12. git如何撤销未push的commit
  13. Git常用命令有哪些?
  14. 小白在线要饭系统源码
  15. GAU : Transformer Quality in Linear Time(new attention+)
  16. Mycat的配置---雄关漫道真如铁,而今迈步从头越
  17. Linux 下 Influx 安装 初始化 学习笔记
  18. ACM四五周学习总结
  19. 上海市高校计算机等级(一级)考试成绩查询,上海市高校计算机等级考试(一级).doc...
  20. keil遇到FCARM - Output Name not specified, please check 'Options for Target - Utilities'解决方法

热门文章

  1. FTP 在局域网搭建ftp服务器-共享文件资料
  2. 淘宝订单接口|订单插旗备注,API稳定、QPS高的方案
  3. python求偏导_python中几种自动微分库解析
  4. 500. 键盘行【我亦无他唯手熟尔】
  5. 2020中南大学计算机学院考研初试成绩,中南大学2020考研复试分数线已公布
  6. 字节跳动后端开发实习生面试经验
  7. 文本过滤器Filters
  8. 电脑双屏有一个黑屏_电脑显示器 黑屏(只应对其中一个原因的方案)
  9. MySQL原理与实践(三):由三种数据结构引入MySQL索引及其特性
  10. 小学计算机画图课件第一册,小学信息技术有趣的画图工具PPT课件.ppt