要生成NB5.5的服务端,首先编译“svchost”项目,该项目生成NBVip.dll和NBVip.lib动态库文件。之后,将这两个文件拷贝到“InstallServer”项目的目录下,打开“InstallServer”项目,将NBVip.dll导入到项目中,并将其ID设置为IDR_DLL。

接下来编译“InstallServer”项目,生成名为“service.exe”的程序,并将该程序拷贝到“NetBot”项目的“res”文件夹中,并将“service.exe”导入到“NetBot”项目中,ID设置为IDR_EXE。最后编译“NetBot”项目,得到NB5.5的客户端。

在NB5.5的客户端中,点击工具栏中“配服务端”,弹出“配服务端”对话框。在选择了服务端的配置之后,点击“生成”按键,则会生成一个名为“NB_Server.exe”的程序,该程序即为NB5.5的服务端程序。

1 NBVip.dll和NBVip.lib的生成

在svchost.cpp的ServiceMain()入口函数中,创建RunningThread线程,在该线程中又创建ConnectThread线程,创建套接字并连接客户端,通过while()循环不断地接收来自客户端的指令,并将反馈数据发送给客户端。

NBVip.dll和NBVip.lib的生成的详细流程参见“NetBots5.5代码分析之套接字模型2”。

2 “service.exe”的生成

“service.exe”程序由“InstallServer”项目生成。

2.1 DLL资源的释放

在InstallServer.cpp的入口函数WinMain()中,首先调用自定义函数ReleaseResource()函数将之前导入到项目中的DLL资源进行释放:

ReleaseResource(NULL, IDR_DLL, “DLL”, szDllPath);

其中,函数的第一个参数表示模块的句柄;第二个参数表示要释放的资源的ID;第三个参数表示要释放的资源的类型;第四个参数表示资源释放后的绝对路径。szDllPath指定的文件即为NBVip.dll文件。

2.2 DLL的导入

在释放了DLL资源之后,接下来要导入该DLL文件。

HMODULE hModule = LoadLibrary(szDllPath);

其中,szDllPath即为在“2.1”中指定的资源释放后的绝对路径。

2.3 DLL中函数的调用

导入了DLL之后,接下来调用DLL中的函数。

BOOL (_stdcall *InstallFunc)(LPCSTR szDllPath);

(FARPROC&)InstallFunc = GetProcAddress(hModule, “Install”);

InstallFunc(szDllPath);

其中,第1行定义了一个名为InstallFunc的函数指针;第2行将DLL文件中的Install函数的地址保存在InstallFunc中,即获取到了Install函数;第3行调用该函数,并将szDllPath作为该函数的参数。

可以在svchost.cpp源文件中查看Install()函数的功能。该函数的作用是根据服务端的配置信息在服务端电脑中安装服务及修改注册表。

3服务端程序“NB_Server.exe”的生成

通过点击客户端“配服务端”对话框中的“生成”按键,产生服务端程序。“配服务端”对话框对应的是NetBot项目中的CServerDlg类,当点击“生成”按键,会调用CServerDlg::OnCreate()函数。

3.1 获取服务端配置信息

在该函数中,首先获取用户在“配服务端”对话框中选择的服务端配置信息。服务端的配置信息是自定义结构MODIFY_DATA的对象,该结构包含了服务端版本号、VIP的ID号、替换服务还是新建服务、服务名称、服务显示和服务描述等信息。这些信息都保存在全局变量mdoify_data中。

3.2 导入service.exe

service.exe是在“InstallServer”项目中生成的程序,并且已经被导入到“NetBot”项目中。通过FindResource()、SizeofResource()和LoadResource()函数将“service.exe”导入。

3.3 创建服务端

3.3.1 为文件分配内存空间

首先在内存中为“service.exe”分配空间:

p=(LPBYTE)GlobalAlloc(GPTR, dwSize);

其中,GPTR表示分配一个固定的内存并且将该内存清零;dwSize是分配的内存长度。分配的内存地址保存在p中。

3.3.2 将文件内容拷贝到内存中

CopyMemory((LPVOID)p, (LPCVOID)LockResource(hResData), dwSize);

其中,p表示分配的内存地址;LockResource(hResData)是在“3.2”中导入的service.exe的地址;dwSize是程序的大小。

3.3.3 配置信息的写入

接下来将在“3.1”中获取的配置信息写入到文件内存中。

CopyMemory((LPVOID)(p+iPos), (LPCVOID)&modify_data, sizeof(MODIFY_DATA));

其中,p+iPos是配置信息在文件中的位置;modify_data是配置信息;sizeof(MODIFY_DATA)是配置信息的大小。

3.3.4 服务端文件的创建

最后,将内存中的服务端文件写入到创建好的服务端文件中。

CreateFile(Path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);

WriteFile(hFile, (LPVOID)p, dwSize, &dwWritten, NULL);

其中,第1行是创建服务端文件;第2行是将内存中的文件数据写入到服务端文件中,完成服务端的创建。

4 服务端程序流程

NB5.5源代码分析之服务端生成相关推荐

  1. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  2. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  3. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

  4. SharedCache分析:服务端程序

    SharedCache由3个主要的项目组成MergeSystem.Indexus.WinServiceCommon.MergeSystem.Indexus.WinService和MergeSystem ...

  5. Spring Cloud Eureka 源码分析(一) 服务端启动过程

    2019独角兽企业重金招聘Python工程师标准>>> 一. 前言 我们在使用Spring Cloud Eureka服务发现功能的时候,简单的引入maven依赖,且在项目入口类根据服 ...

  6. 【Netty系列_3】Netty源码分析之服务端channel

    highlight: androidstudio 前言 学习源码要有十足的耐性!越是封装完美的框架,内部就越复杂,源码很深很长!不过要抓住要点分析,实在不行多看几遍,配合debug,去一窥优秀框架的精 ...

  7. backbone 模板 html,用Backbone.js绑住服务端生成的html

    去年做雪球的timeline模块时我正深受 #newTwitter 的影响,倾向于把尽可能多的逻辑放到客户端去做,最后实现的时候选择了Backbone.js.使用Backbone.js的好处就不说了, ...

  8. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  9. Fabric 1.0源代码分析(12)cryptogen(生成组织关系和身份证书)

    # Fabric 1.0源代码笔记 之 cryptogen(生成组织关系和身份证书) ## 1.cryptogen概述 cryptogen,用于生成组织关系和身份证书. 命令为:cryptogen g ...

  10. Netbackup8.0以上版本,服务端生成证书,客户端获取、更新证书方式(整理中)

    创建重发令牌 如果非主控主机已在主服务器上注册但其基于主机ID的证书不再有效,则可以重新颁发基于主机ID的证书.例如,证书在过期,被撤销或丢失时无效. 重发令牌是一种可用于重新颁发证书的令牌.它是一种 ...

最新文章

  1. 如何将字符数组里的内容转换成uint8的类型?将一个字符数组里面的所有元素变成一个字符串?
  2. ahk编程_AHK编程可视化的实现
  3. Java中Socket通信-客户端向服务端发送照片
  4. VC++如何处理自定义消息
  5. 流畅的python目录_流畅的python python 序列
  6. the development of c language(转)
  7. PS图片无损放大插件 Alien Skin Blow Up 3 for Mac
  8. Python文件操作与matplotlib数据可视化案例一则
  9. FreeMarker笔记 第二章 数值和类型
  10. 骑士CMS模版注入+文件包含getshell漏洞复现
  11. 计算机的屏幕为什么成黑色,电脑液晶显示器老是黑屏怎么回事
  12. iTunes恢复系统显示正在等待iPhone解决步骤
  13. lisp 多段线转面域_CAD自定义线型,lisp多段线绘制方向 | 伙计百科
  14. 读书笔记-采购与供应链管理(一个实践者的角度)
  15. 用清水洗手和肥皂、洗手液等洗手的区别???
  16. error: cannot connect to daemon
  17. 类似360的轨迹加密功能
  18. Python Django,模型,模型管理器类(models.Manager)(与数据库交互的接口),自定义模型管理器类
  19. iOS-友盟消息推送
  20. 根据IP获取具体城市名称及经纬度坐标

热门文章

  1. 服务器组态文件在哪里,组态王怎么读取服务器数据库
  2. 电机与拖动基础--第二章第一节
  3. Java —— 学生成绩分析程序Demo(附源代码)
  4. LoadRunner 11.50 下载+安装+补丁
  5. 震惊!PC端QQ也能防撤回?
  6. SSH智能社区住户信息管理系统
  7. 新广告法违规词、敏感词在线检测工具 淘宝违规词检测、查询
  8. python爬取五百丁word模板(有图+有代码)
  9. python选择题题库百度文库_(完整版)Python题库
  10. C# WinAPI 编程详解(一)