JunFeng 发表于 2005-12-26 20:37:24

关于psendmessage函数调用浅析

首先感谢俄罗斯老兄rst7/cbsie   作的 fam3.2……


不罗嗦,直接看rst7的fam3.2通过发送系统消息来读写mmc

4E663E: E6 FC 70 38 :   mov   r12, #3870h      pof      MMC_FILE_SYSTEM进程号
4E6642: E0 ED       :   mov   r13, #0Eh            pag   页
4E6644: E6 FE 40 00 :   mov   r14, #40h         消息id,rst7就是自定义了这个40的消息,
4E6648: E0 0F       :   mov   r15, #0                        不明
4E664A: DA B4 4C 72 :   calls   0B4h, loc_B4724C             psendmessage系统消息处理函数
4E664E: 06 F0 08 00 :   add   r0, #8
4E6652: DB 00       :   rets


用at+cgsn 读0E:3870   得到58 30 11 00 D6 28 6F 03 ,58 30 11 00未知,而后面的
D6 28 6F 03很明显就是地址,转为seg查看,果然是MMC_FILE_SYSTEM

再看看MMC_FILE_SYSTEM中rst7加入了什么
原函数部分略过…………
4E6610: 46 F8 40 00 :   cmp   r8, #40h                !!消息号是否为40
4E6614: 2D 04       :   jmpr    cc_Z, loc_4E661E
4E6616: 46 F8 22 00 :   cmp   r8, #22h
4E661A: FA DC DE 1E :   jmps    0DCh, loc_DC1EDE   返回原函数处理

JunFeng 发表于 2005-12-26 20:51:39

而通过消息来执行命令的好处就是不用寄存器…………
也就减少了很多冲突或是死机

Xinshou 发表于 2005-12-27 09:50:26

支持你研究的重要进展!

而“解除MP3播放30首的限制”的补丁里有好多个这样的 E6FE2000DC4E 和 E6FF2000DC4F,就是
消息号是否为20的判断,是吗? 或者,还是20(hex.32)为播放32首mp3?

Xinshou 发表于 2005-12-27 17:17:34

FAM 3.2 源码:

#define pid_MMC_FILE_SYSTEM 3B870h
#define SendMessage        0C1AA30h
#define callR5R4      0C7EE88h
;
' *** FAM3.2 File Access Modification v3.2 *** (C)Rst7/CBSIE
' *** FAM3.2 填滂翳赅鲨

Bennie 发表于 2005-12-30 22:32:02

这个东西我略有研究,简单说一点自己还记得的,权当抛砖引玉吧。
大概的情形是:西门子的系统是一个分时的多任务系统,有许多的任务在系统启动时被逐个启动。这个我们暂称之为进程。每个进程有自己的进程控制块,而进程之间是通过发送消息来进行互动的。发送消息时需要制定消息的控制块指针,就是那个pid指向的东西,是一个固定的地址。这个在x65上有了很大的变化,x65使用一个ID号来标示进程。
每一个进程有自己的消息队列和消息响应函数,可以接受特定的消息,并作出响应,这个响应可以同步或异步。消息响应函数可以在进程的信息块那里找到,常见的比如:键盘处理、MMI、MMC文件系统,MMC文件管理器以及其他非常多的进程。而我们经常修改的界面只是MMI的一个子线程。这里我称之为线程实际上是不恰当的,因为这些并不是可以并行执行的,而是排他的,也就是说同一时刻只能有一个线程在活动,称之为当前线程,但是这些线程可以作栈式调用。
我们经常修改界面相关的东西,实际仅仅是界面线程的一个子操作。界面线程的基本信息主要有三个部分,OnInit,OnMsg,OnQuit,这些函数的功能我们可以从名字上看出,这里OnMsg实际上是在MMI的OnMsg过滤了部分消息后转发各线程的OnMsg的。而我们经常修改的OnKeyMsg仅仅是Msg_Key消息的响应函数,所以我们经常会看到,有些时候多个窗口的OnKeyMsg仅仅是简单的接受了键盘消息,然后把它转给当前线程的OnMsg来统一处理。比如短消息的处理,大家就进场会看到这种情况。
这个SendMsg函数就是发送消息给特定的进程,比如FAM就是发给MMC文件管理器进程。而我们用的重启函数也是发消息给特定线程,此外挂断电话那个也是。这个函数和Windows的比较类似,都是由消息号和参数组成,参数可以是多参数的,具体的解释就看各个进程了,不过有几个特定的消息,比如MMC文件系统的响应操作好像F8或FC,具体我记不清楚l了,最近的一次使用这个是修改x65的快速翻阅短信,那时追踪了一下消息的路线,当时很清楚了,并在特定路线上作了过滤,实现的功能。不过没有作日志,现在工作一忙,都忘光了。

[ 本帖最后由 Bennie 于 2005-12-30 22:38 编辑 ]

JunFeng 发表于 2005-12-31 15:04:46

谢B大解释

也就是说,在某个进程里,所有的消息都是由该进程接收消息然后统一调度执行
而进程的操作是不会受变量的影响
想要的也很简单,比如说自动录音器,如果用发送消息执行,是否可以解决偶尔失效的问题??如果有这样的进程和消息的话

[ 本帖最后由 JunFeng 于 2005-12-31 15:14 编辑 ]
页: [1]
查看完整版本: 关于psendmessage函数调用浅析