危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18790852

小小的实现一个远程

大家好,上一章中我们对客户端的界面进行了处理,现在又是一个新的问题等待我们,就是如何去连接服务端了,这里也是很头疼的一个问题,窗体多了之后,要处理的数据越来越多,数据包也会越来越混乱。这里我们还有一个东西要先处理,就是我们注册表管理窗体出现的时间,我们现在只是为了调试方便才程序开始就启动,后面肯定不能这样的,我们要用一个菜单来对其进行控制。我们先在菜单中添加一项“注册表管理”并且添加相应的事件,然后,我们就要获取被选中项的ID,并且根据ID获取到相应的服务端对象,这里的代码之前都有写过,我就不说了。现在,既然有了窗体了,就到了网络通信的流程了,注意这里我们只允许对一个服务端进行操作,第一是防止过卡,第二是我偷懒,所以这里窗体都用模态窗体显示。什么?什么是模态窗体?百度去百度去…

那么我们现在就要来设计数据包了。在此之前,我们要注意一点,就是我们要将对应的服务端对象传给窗体,否则窗体不知道发送指令给谁。这里我就不写啥构造函数啦,直接给public变量好了。只要赋值好了就行,我们一开始并不需要给服务端发送指令,所以我们直接DoModel就OK了。窗体一显示出来,我们就肯定意味着要开始考虑数据包的问题了,当用户展开一个项的时候,我们就要发送获取子项指令,然后服务端要将子项发送回来。好,我们现在开动。这里我又添加了一个名称为REG_MGR_GET_SUBITEM的宏定义,用于获取注册表的命令代号。好了,接下来就轮到两边的收到指令的处理了。现在来添加注册表相关的指令的响应函数。首先就是遍历一个项下面的键和值,我们分开来处理,先处理键,再处理值。先遍历键吧,函数在上一章中已经讲过,我们这里只需要循环处理就OK了,不过这里有一个函数我上一章讲漏了,就是RegOpenKey。

老样子,我们说下参数,hKey是一个注册表键的句柄,这里我们一般只填写预定义好的句柄,lpSubKey是填写我们要打开的键相对于传人键的路径。phkRe sult用于存放我们新打开键而得到的句柄。如果第二个参数为NULL或者是空字符串,那么phkResult将会返回传人的句柄,那么这样就失去意义了。

这个函数什么地方要用到呢?很明显,如果我们的父键就是根键的话,那就很简单,但是如果父键不是根键,那么我们就要通过这个函数来获取父键的句柄才能遍历,否则我们就悲剧了。这个地方的逻辑比较复杂,我们慢慢来说吧。这里我们要在SocketRegData里面加一个HKEY类型的成员,我这里命名为hRootParent,用于存放根父键的句柄,这个不难,只要根据我们展开的情况层层获取父键即可。还要加一个wchar_t类型的数组,用于存放键的路径,这个是有必要要的,具体用来做什么,后面大家就明白了。好了,先这样吧,来编写逻辑代码,首先,当我们展开树控件节点时,我们就要准备数据包并发送指令,这里我们肯定要填充我们的SocketRegData对象了。这个对象的填充很麻烦,SocketData怎么构建不用我说了吧?现在要说的是SocketRegData,根据我们的定义,看到里面有获取到的项的父项,这句话说得有点别扭。简单点说,这个数据包发过去之后,获取的是A项下面的子项,子项的父项即为A,所以这里直接传A的句柄即可。第二个是当前项的根键,这里用循环去查找即可。第三个成员Type上一章讲过,是用于存放注册表值的类型,目前用不到。第四个是keyPath,这个是个缓冲区用于存放当前项的路径,第五个是当前项的名字,第六个是当前项的值。因为改过定义,而且是随手插了一条进去,顺序可能和大家不一样,所有代码以最新光盘中的代码为准。上一章的光盘有一个图片因为随手放了忘记打包,所以大家编译可能不通过,在新期刊中的源代码包中,会修正这个问题。

一个一个来说,首先,当前项的句柄是最简单的,就是一现成的。到了keyPath和hRootParent就不好弄了。我也不知道有没有比较方便的函数直接获取根键,我这里采用笨办法,直接循环向上找。既然循环一层一层找,我们何不把当前项的路径一起找出来呢?这里我提示一下,GetParentltem这个方法在传人值就是根节点的情况下,会返回NULL,我们就正好利用这一点。