攻关
USB线的生产商叫BAFO。我的第一个反应,是给他们发邮件,索要技术资料。石沉大海,毫无音讯。怎么办?
在CSDN上开了帐号,发了贴,给出仅有的100分。没有人回答我的问题。而且遭到了一些人的耻笑,说我对USB设备一窍不通(那时候倒确实是一窍不通,呵呵)。说USB设备是Master-Slave结构,不可能连接两个Master。靠,笨蛋说别人笨是最可笑的事情。人家东西都做出来了,这还有假吗?一个USB设备是M-S机构,两个加一起呢。(M-S)+(S-M)=>M-(S+S)-M=>M-M,推理多一步他们就傻眼了。
花絮
我当时火气也大,MD,万一整不出来,在盛润就没法混了。所以,我在CSDN上发了个贴,说:CSDN无高手啊。此贴一出,砖头满天飞了过来。骂人的多,回答问题的就没有。呵呵,从此我很少上CSDN。那上面的伪高手真不少。从我有限的几次关注来看,这个结论至今不变。
继续攻关
没办法了,帮助是得不到了,只有动粗了。
所幸的是,BAFO随线除了附上驱动程序之外,还附送了一个工具。用这个桌面程序,可以在两台PC之间传送文件。这个程序给了我切入点。
首先,我分析了这个程序的模块依赖关系,发现它调用了一个也是由BAFO提供的模块transfer.dll。再查看transfer.dll,发现它有6个输出函数,形如_USB_OpenConnect@4,_USB_ReadConnect@16,_USB_WriteConnect@12,...。这些名字使我相信,只要能找到这6个函数的参数就可以了。
怎么找?还不就是用那些反编译或者动态调试工具喽。SoftIce,TRW2000,都是赫赫有名的。但我用的是wdasm,够用了。其实,对你破译大部分非伪码程序(比如VB程序就不好搞)都够用了。
熟悉工具,熟悉BAFO提供的应用,猜测调用点,跟踪到上述函数的调用,分析参数堆栈。由于他们的程序没有采用任何反破译策略(谁能想到会有个疯子干这事呢),我用了三天就把问题解决了。
此关一破,前途宽阔。三个月后,我的试用期结束了,我的产品也通过了测试。迄今为止,市场上尚无同类型的产品出现。
盛润给这个产品的定价是¥2万/套,几乎它所有的主要客户都安装了这个产品。这个产品,一直是我的职业生涯的一个骄傲。因为,我在盛润的两年,对它,真正做到了零维护。没有收到任何一个客户的BUG反馈,没有为修改程序的BUG而进行过一次维护。唯一的一次升级,是为其连接管理增加一个Block状态,该状态显示连接的另一端的接受能力已经不行了,需要通知发送端暂停或者减缓发送。光是在这个产品上的收益,就已经够支付我两年的工资有余了。这个买卖,盛润不亏。
现在,盛润已经不是市场上的玩家了,我的这个USB隔离系统仍然在数十家券商处稳定运行着。遗憾的是,由于零维护,这没能给我带来进一步的收益。
新问题
随着USB协议的发展,USB2.0逐渐成为现实。它和1.1最大的不同,在于带宽增加到500M左右(具体数字待查),与网卡不相上下了。所以,我一直惦记着,能不能把这个USB Cable升级到2.0呢,这样的话,传输性能可是一个飞跃啊。
上个月去赛格买个电脑配件,居然不小心看到BAFO已经出了USB 2.0 Cable。很便宜,我买了一根回来。我想试着给这个产品升一下级。因为有两个盛润以前的同事,他们辞职搞了个公司,我这个产品也是他们准备卖的东西之一。他们很希望我能给它升级一下。
买回来一装,发现它这个应用的架构也不一样了。transfer.dll没了。原来的系统不能用了。一切要重新开始。
还得攻关
其实,transfer.dll这种方式一直让我很不满意。因为这样就造成了我对于BAFO这家厂商的依赖,如果这家厂商停产了,或者,象这个2.0一样,升级过程中结构改了,我们就有了麻烦。所以,我一直在寻找一种更通用的访问USB设备的方式,让这个系统可以不依赖于特定的USB Cable。比如说,在我离开盛润之后,还有个券商向我购买过这个USB隔离系统。他们开始买的是一条国内厂商盗版的线,从硬件到软件界面,一模一样,但就是连不通,因为软件他们是自己写的,没有transfer.dll。
我一直想改,但一直没改。因为没有做这件事的经济动力。
BAFO的USB2.0 Cable推出,重新淘出了我的兴趣。因为这个时候,我已经开始坚信,通用的方法是存在的。它就是CreateFile,ReadFile和WriteFile。关键的问题还是,参数应该怎样传递?特别的,CreateFile的第一个参数FileName如何确定?
问BAFO?肯定没戏(不过也不一定,回头试一下)。CSDN?不上。这次我上MSDN。
(累了,休息一下......)
