能力值:
( LV2,RANK:10 )
|
-
-
2 楼
INTF_ENTRY ie;
ZeroMemory(&ie, sizeof(ie));
ie.wszGuid=deviceGuid; //from WZCEnumInterfaces()
DWORD dwOutFlags;
DWORD dwStatus=pfnWZCQueryInterface(NULL, INTF_ALL, &ie, &dwOutFlags);
Bedrich Svoboda
有人这么用过 我也不知道啊! 只是尽量给你也信息!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我也在网上查过这个贴子,可是这个贴子不全,他又用到了另一个未公开函数,就是WZCEnumInterfaces(*,*,*,*)得出的一个返回值,所以我还是无法成功搞定,我写信给他,也没有回.并且奇怪的是,我通过反汇编发现WZCQueryInterface的参数的第二个是指针,而这个贴子给的第二个却不是地址,我非常不明白.
我还把WINCE下的这个参数的原形拿来试了一下,也还是不行.
所以才来发贴子,请教各位的.
|
能力值:
( LV12,RANK:650 )
|
-
-
4 楼
你确认是stdcall?
stdcall和pascal的参数次序是反的。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
是Stdcall,我是用IDA,这是我COPY来的
__declspec(dllimport) __stdcall WZCQueryInterface(x,x,x,x)
.idata:58971144 extrn __imp__WZCQueryInterface@16:dword
.idata:58971144
; DATA XREF: WZCQueryInterface(x,x,x,x)r
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
再请教一个相关的问题,我发现有一个函数在push了两个参数后,进入被调用函数后,却意外发现三个参数,请各位指教啊.
lea edi, [esi+0B8h]
.text:58973B2F and dword ptr [edi], 0
.text:58973B32 push edi
.text:58973B33 mov ebx, 404FFFFh
.text:58973B38 push ebx
.text:58973B39 mov ecx, esi
.text:58973B3B call ?GetOIDs@CWZCQuickCfg@@QAEKKPAK@Z ; CWZCQuickCfg::GetOIDs(ulong,ulong *)
进入函数后的函数堆栈是这样的
-00000004 var_4 dd ?
+00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)
+00000008 db ? ; undefined
+00000009 db ? ; undefined
+0000000A arg_2 db ?
+0000000B arg_3 db ?
+0000000C arg_4 dd ?
+00000010
+00000010 ; end of stack variables
这是怎么回事啊?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
第二个参数的确不是地址,我发现我弄错了,不过还是现在还是不行,我试过调用了一下,还是出错,出错码是57H,参数错误
HMODULE hDll = LoadLibrary(_T("Wzcsapi.dll"));
typedef BOOL (WINAPI* fun)(UINT dwflag2,ULONG Byte,ULONG * pStr,PDWORD dwflag);
fun pFun;
pFun = (fun) GetProcAddress(hDll,"WZCQueryInterface");
ULONG buffer2[19]={0};
ULONG dwflag= 0x404ffff ;
DWORD dwOutFlag = 0 ;
BOOL IsSUCCESS = pFun(NULL,dwflag,&buffer2[0],&dwOutFlag);
哪位兄弟有这方面的经验的,可否说一下经验?
|
能力值:
( LV12,RANK:650 )
|
-
-
8 楼
一共有4个arg,按照堆栈顺序:
arg_0和arg_4是数,前2个。
arg_8肯定是地址。第三个。
arg_c是地址,第四个。
其实对于一个函数,只要知道它的大致类型。至于究竟是pascal还是stdcall不重要。注意:只有参数顺序不同的调用类型完全可以混用,只要在声明extern时调换一下参数的顺序即可!
|
能力值:
( LV12,RANK:650 )
|
-
-
9 楼
最初由 骑猪到处跑 发布 第二个参数的确不是地址,我发现我弄错了,不过还是现在还是不行,我试过调用了一下,还是出错,出错码是57H,参数错误 HMODULE hDll = LoadLibrary(_T("Wzcsapi.dll")); typedef BOOL (WINAPI* fun)(UINT dwflag2,ULONG Byte,ULONG * pStr,PDWORD dwflag); fun pFun; pFun = (fun) GetProcAddress(hDll,"WZCQueryInterface"); ........
跟一下。看看堆栈是不是和函数要求的一样就可以了。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
楼上的兄弟分析的是哪个函数的堆栈?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
哎,楼上的兄弟不明白我的意思,我就是不知道第三个参数指向的数据结构是什么,所以调用 时出错的,这是一个未公开函数,我只知道第三个参数指向的结构变量有19个双字啊.
|
能力值:
( LV12,RANK:650 )
|
-
-
12 楼
废话,当然是WZCQueryInterface了。
2楼不是说了吗?你按照他的方法试。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
57h为“参数不正确”
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
嗯,57H为参数不正确,有出现会出现0XC0000005H(访问违规)
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
用AutoDebug for Windows
自动对目标程序进行跟踪,记录函数调用的输入输出结果。支持对COM接口函数的跟踪。自动分析目标程序,自动显示DLL的导出函数进行跟踪监视。
可跟踪各种api参数
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
非常感谢楼上的建议,
这个软件还可以,能得到每个函数的参数的地址和个数,不过对于参数用的数据结构还是得不到,::
|
|
|