V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ruoyu0088
V2EX  › 

遇到了奇葩的进程通信方式,我该怎么办?

  •  1
     
  •   ruoyu0088 · 2018-11-15 20:43:06 +08:00 · 8030 次点击
    这是一个创建于 2195 天前的主题,其中的信息可能已经有所发展或是发生改变。

    12000 元买了两个陀螺仪传感器,它提供的驱动程序是这样把数据传送给用户程序的:

    1. 调用 WindowFromPoint 获取某固定坐标对应的窗口句柄
    2. 使用 PostMessage 向该窗口发送大量的 Windows 消息

    这样做有如下好处:

    1. 一条消息只能发送 64bit 的数据,一组数据需要分 4 次发送,因此在最快取样频率 100Hz 下,一秒钟要接受 400 条 Windows 消息
    2. 用户窗口必须放在指定的位置,并且保持可见。一旦用户窗口被其他窗口覆盖,消息就发送到不相干的窗口去了。如果该窗口恰好也有处理相应消息 ID 的程序,该窗口就会发生不可知的动作
    3. 无法在一台电脑上同时读取两个传感器,因为消息中没有传感器 ID,并且都发送到同一个坐标的窗口。因此为了同时读取,我还要再配备两台电脑

    有什么办法处理这么疯的程序吗。也许可以开两个虚拟机,让它们在虚拟机里面向各自的用户窗口发送数据,然后用户窗口通过网络传送到虚拟机外面的接收程序?

    第 1 条附言  ·  2018-11-15 22:22:27 +08:00
    厂家提供的程序有设置端口的地方,可以启动两个副本分别与两个传感器通信,只是用户程序无法区分传感器。

    多谢 @wafm 提醒,找到了一个用 DeviareCOM 做 HOOK 的例子,等有时间试试看。

    https://github.com/srw/windows-api-hooking-in-python-with-deviare-sample
    9 条回复    2018-11-19 10:30:20 +08:00
    ech0x
        1
    ech0x  
       2018-11-15 20:52:56 +08:00
    听说过有这样的程序,没想到真的存在。
    GDC
        2
    GDC  
       2018-11-15 21:47:51 +08:00
    好屌的程序……
    wafm
        3
    wafm  
       2018-11-15 21:58:56 +08:00
    好处?是不是打错字了?

    如果没有传感器 ID 那你就无法区分到底是哪一个传感器过来的消息呀?

    N 年前曾经写过 API HOOK 我说个思路不知道可不可行

    你可以把消息转到自己的程序中处理再返回给系统
    WordTian
        4
    WordTian  
       2018-11-15 21:59:55 +08:00 via Android
    666
    ruoyu0088
        5
    ruoyu0088  
    OP
       2018-11-15 22:10:16 +08:00
    @wafm 当然是打引号的"好处",不过对我来说就是又有活干了,也算一个真的好处。

    能用 API HOOK 把那个 PostMessage 换成我自己的函数吗。如果这样能行的话,就可以比较好地解决了。我原本打算复制并直接修改 exe 程序,把坐标换一个地方,这样我可以在不同的地方放窗口分别接收消息。但是窗口一移动就会出问题。能 HOOK 最好。
    ruoyu0088
        6
    ruoyu0088  
    OP
       2018-11-15 22:12:03 +08:00
    厂家提供的程序有设置端口的地方,可以启动两次分别与两个传感器通信,只是用户程序无法区分传感器。
    wafm
        7
    wafm  
       2018-11-15 23:26:56 +08:00
    @ruoyu0088 理论上来说 API HOOK 本来就是可以拦截函数并自行处理 所以得实践 基本上就是复写 API
    mcdull619
        8
    mcdull619  
       2018-11-16 14:25:33 +08:00
    看上去很厉害的样子 , 点赞 .
    flowfire
        9
    flowfire  
       2018-11-19 10:30:20 +08:00 via iPhone
    为什么我觉得反编译硬件驱动都比找解决方案要靠谱🤣🤣🤣
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2667 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 15:34 · PVG 23:34 · LAX 07:34 · JFK 10:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.