首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

确定被调用的宿主有关问题

2012-06-20 
确定被调用的宿主问题有过程Sub1、Sub2、Sub3、.....,均要调用另外一个S_Sub。我的问题是如何在S_Sub中确定是

确定被调用的宿主问题
有过程Sub1、Sub2、Sub3、.....,均要调用另外一个S_Sub。
我的问题是如何在S_Sub中确定是那会函数调用了它?当然可以通过在S_Sub中确定返回地址的方法判断调用宿主,也可以用形参实参传递标志的方法或设公用标志变量,但我不想用这些方法。
各位还有方法吗?

[解决办法]
procedure S_Sub(Sub1: Boolean = False; Sub2: Boolean = False; Sub3: Boolean = False);
begin
if Sub1 then ShowMessage('被Sub1调用!')
...
end;

procedure Sub1;
begin
S_Sub(True)
end;

...
[解决办法]
分析callstack
procedure S_Sub();
begin
try
raise Exception.Create('故意的异常');
except
//这这里查询callstack delphi并未提供看堆栈的功能,但是你到网上找找,有一些牛人写的工具是很好用的
end;
end;
[解决办法]
比如madExcept或
这个
http://www.dimusware.com/products/excmagic/index.html
[解决办法]
如果S_Sub中没用到edi,还可以这样:

Delphi(Pascal) code
procedure S_Sub;var  f: word;begin  asm    mov f, di  end;  if f=1 then ShowMessage('被Sub1调用!')end;procedure Sub1;begin  asm    push di    mov di,1    call S_Sub    pop di  end;end;
[解决办法]
可以用形参实参传递标志的方法或设公用标志变量
我想知道你为什么你不用?
你的目的是什么?
也期待你的其他方法
[解决办法]
Delphi(Pascal) code
//调用者的方法地址  mov    eax,   [ebp+$04]
[解决办法]
探讨
Delphi(Pascal) code


//调用者的方法地址
mov eax, [ebp+$04]


依据调用者的方法地址,查询对应的名称等信息。所以要求程序需要带有调试信息、开启栈帧(Stack frame)。
第三方库如MadExcept、JCLDebug,应该都支持以上需求。

[解决办法]
探讨
to 21楼,对于形参个数不同的Sub_S也是这个吗?好象返回地址在栈中的位置与Sub_S的参数有关,而且不同调用约定的DLL也是不一样的,有入栈先后顺序之分。

[解决办法]
楼主可以参考这里的详细阐述:
http://liyiwen.iteye.com/blog/345525
[解决办法]
狗尾续貂一下。(^_^)
C/C++ code
#include <stdio.h>void whocallme();void fun1() {    whocallme();}void fun2() {    whocallme();}void fun3() {    fun1();}void whocallme() {    int *_esp,i;    __asm {        mov eax,esp        mov _esp,eax    }    printf("\nfun1,fun2,fun3,_esp=%08x,%08x,%08x,%08x\n",(int)fun1,(int)fun2,(int)fun3,(int)_esp);    for (i=0;i<100;i++) if (_esp[i]==(int)_esp) break;    if (i<100) {        printf("ret addr=%08x\n",_esp[i+2]);        if ((int)fun1<=_esp[i+2] && _esp[i+2]<(int)fun2) printf("fun1 callme\n");        if ((int)fun2<=_esp[i+2] && _esp[i+2]<(int)fun3) printf("fun2 callme\n");    }}void main() {    fun2();    fun1();}//C:\tmp\tmp\Debug>tmp////fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84//ret addr=0040102e//fun2 callme////fun1,fun2,fun3,_esp=00401000,00401020,00401040,0012fe84//ret addr=0040100e//fun1 callme////C:\tmp\tmp\Debug>cd ..\release////C:\tmp\tmp\Release>tmp////fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c//ret addr=00401012//fun2 callme////fun1,fun2,fun3,_esp=00401000,0040100a,00401014,0012ff5c//ret addr=00401008//fun1 callme//
[解决办法]
我否定楼上所有的做法,我觉得越简单越好,直接使用一个静态变量,在调用S_Sub之前设置静态变量的值,在S_Sub中判断静态变量的值就知道了。如果不需要并发那这个方法是最佳的。
------解决方案--------------------


探讨

狗尾续貂一下。(^_^)
C/C++ code
#include <stdio.h>
void whocallme();
void fun1() {
whocallme();
}
void fun2() {
whocallme();
}
void fun3() {
fun1();
}
void whocallme() {
int *_esp,i;
__……

[解决办法]
为什么都是些很奇怪的方法呢?程序员的任务不是把问题复杂化而是解决问题,忽然看到居然某个大神用汇编,已经被惊倒了 ---- 会汇编很了不起,今天给你换个其他平台玩玩:修改程序已经是比较糟糕的主意了,不就要看这个函数被那些函数调用了,用得着这么麻烦:

是不是这个效果?我想知道_getdrive被谁调用了。使用现成工具IDA就可以了

热点排行