首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从TAPI服务供应商(TSP)取得香港大学的用户资料

从TAPI服务供应商(TSP)取得香港大学的用户资料
EN

Stack Overflow用户
提问于 2013-09-04 19:05:43
回答 2查看 343关注 0票数 1

我在试着制造一个tsp。现在的问题是,我需要一些信息(从HKCU的用户配置位置)是谁提出的请求。

由于TSP运行在电话服务的上下文中,所以我不能直接访问TSP。我的计划是使用LINE_CREATEDIALOGINSTANCE的功能来读取这些信息,就像描述这里这里的信息一样。

这个问题与其他类似的问题相似,电话服务+拨号程序正在使用下面的堆栈跟踪崩溃。

代码语言:javascript
复制
(1e4.e10): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
TSP_ATSPMod!TSPI_lineMakeCall+0x367:
000007fe`f25a53e7 48894828        **mov     qword ptr [rax+28h],rcx** ds:00000000`0000002d=????????????????
0:015> kP
Child-SP          RetAddr           Call Site
00000000`01dbebe0 000007fe`f49c65ca TSP_ATSPMod!TSPI_lineMakeCall(
            unsigned long dwRequestID = 0x103aa, 
            **struct HDRVLINE__ * hdLine = 0x00000000`00000005**, 
            struct HTAPICALL__ * htCall = 0x00000000`00010399, 
            struct HDRVCALL__ ** lphdCall = 0x00000000`00e85ee8, 
            wchar_t * lpszDestAddress = 0x00000000`00e85c80 "T444", 
            unsigned long dwCountryCode = 0, 
            struct linecallparams_tag * lpCallParams = 0x00000000`00e85df0)+0x367 [c:\freedomvoice_tsp\tsp_atspmod\tsp_atspmod.cpp @ 1714]
00000000`01dbec70 000007fe`f49db14c tapisrv+0x165ca
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\system32\RPCRT4.dll - 
00000000`01dbed50 000007fe`fdd523d5 tapisrv!ServiceMain+0x4bb4
00000000`01dbed90 000007fe`fddfb68e RPCRT4!RpcBindingSetAuthInfoW+0xe5
00000000`01dbedf0 000007fe`fdd3ac40 RPCRT4!Ndr64AsyncServerCallAll+0x120e
00000000`01dbf3b0 000007fe`fdd450f4 RPCRT4!NdrServerCallAll+0x40
00000000`01dbf400 000007fe`fdd44f56 RPCRT4!NdrServerCall2+0x1d84
00000000`01dbf430 000007fe`fdd45679 RPCRT4!NdrServerCall2+0x1be6
00000000`01dbf550 000007fe`fdd4532d RPCRT4!NdrServerCall2+0x2309
00000000`01dbf630 000007fe`fdd62e7f RPCRT4!NdrServerCall2+0x1fbd
00000000`01dbf760 000007fe`fdd62a35 RPCRT4!RpcBindingCopy+0x5df
00000000`01dbf8a0 00000000`7739b68b RPCRT4!RpcBindingCopy+0x195
00000000`01dbf930 00000000`7739feff ntdll!TpSetTimer+0x39b
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\system32\kernel32.dll - 
00000000`01dbf9c0 00000000`7727652d ntdll!RtlValidateHeap+0x4af
00000000`01dbfcc0 00000000`773ac521 kernel32!BaseThreadInitThunk+0xd
00000000`01dbfcf0 00000000`00000000 ntdll!RtlUserThreadStart+0x21

坠机时的登记簿,

代码语言:javascript
复制
0:015> r
rax=**0000000000000005** rbx=0000000000e85c90 rcx=0000000000010399
rdx=000007fef261f988 rsi=0000000000e85c40 rdi=0000000001dbec60
rip=000007fef25a53e7 rsp=0000000001dbebe0 rbp=00000000000103aa
 r8=0000000001dbe6c8  r9=00000000000103aa r10=0000000000000000
r11=0000000000000246 r12=0000000000e85d70 r13=0000000000000002
r14=0000000000e85c7c r15=0000000000e85ec0
iopl=0         nv up ei pl nz na pe nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010200

并且,代码片段:

代码语言:javascript
复制
PDRVLINE pLine = (PDRVLINE) hdLine;

*lphdCall = (HDRVCALL)hdLine;

typedef TUISPICREATEDIALOGINSTANCEPARAMS PARAMS;

pLine->htCall = htCall; <========= ********OFFENDING CODE************

DWORD lLength = (lstrlenW(lpszDestAddress) + 1) * sizeof(WCHAR);

PARAMS* lParams = (PARAMS*)DrvAlloc(sizeof(PARAMS) + lLength);
RtlZeroMemory(lParams, sizeof(PARAMS) + lLength);

lParams->dwRequestID = dwRequestID;
lParams->hdDlgInst = (HDRVDIALOGINSTANCE)1000;
lParams->lpszUIDLLName = L"TSP_ATSPMod.tsp";
lParams->lpParams = lParams + 1;
lParams->dwSize = lLength;

lstrcpyW((LPWSTR)(lParams + 1), lpszDestAddress);
(*pLine->pfnEventProc)(pLine->htLine, 0, LINE_CREATEDIALOGINSTANCE, (DWORD)lParams, 0, 0);

看来我们不能把hdLine投给PDRVLINE了。

有什么想法吗?

PS:在VMWare上使用Windows7 VMWare。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-07 11:01:30

最后,MSDN进行救援:根据MSDN,该事件的LINEEVENT调用的第一个参数需要是一个HPROVIDER。但如果你仔细观察,MSDN说,

作为TSPI_providerEnumDevices.参数提供给服务提供者的hProvider ProviderHandle

所以,您必须先保存传递给TSPI_providerEnumDevicesTSPI_providerEnumDevices,然后在这里使用它。

工作代码是,

代码语言:javascript
复制
PDRVLINE pLine = (PDRVLINE) ghProvider;    
...
(pDI->lpfnEventProc)((HTAPILINE)ghProvider, 0, LINE_CREATEDIALOGINSTANCE, (DWORD)lParams, 0, 0);

还要确保正确导出方法TUISPI_providerGenericDialog

票数 0
EN

Stack Overflow用户

发布于 2013-09-06 08:56:29

你有进展了吗?我想我现在明白你想做什么了。您希望发送LINE_CREATEDIALOGINSTANCE以响应TSPI_lineMakeCall命令,以便找出哪个用户正在请求makecall。对吗?

如果是这样的话,我认为你当时还应该处理一个问题。如果您可以暂时假设用户信息并处理makecall请求,那么您仍然必须先解决无效的类型广播问题。为了解决这个问题,看看您将在TSPI_lineOpen代码中处理哪些内容。在MakeCall函数中,您只能在lineOpen的第三个参数中返回所提供的电话服务

参数 dwDeviceID标识要打开的线路设备。 htLine用于后续调用LINEEVENT回调过程以标识设备的行设备的TAPI句柄。 lphdLine指向HDRVLINE的指针,其中服务提供者为行设备填充其句柄。 dwTSPIVersion的TSPI版本。lpfnEventProc指向由TAPI提供的LINEEVENT回调过程的指针,服务提供者调用该过程来报告行上的后续事件。

如果这是正确的,请查看您在lParams结构中放置的字符串指针。那个范围对吗?我将创建一个静态字符串,并将变量指向如下所示

代码语言:javascript
复制
static WCHAR szUIDLLName[] = L"TSP_ATSPMod.tsp";
lParams->lpszUIDLLName = szUIDLLName;

第三,也是最后,我对如何调用回调函数感到困惑。根据CREATEDIALOGINSTANCE文档,你是正确的。但是,如果您查看事件回调函数,最后三个参数应该是DWORD_PTR,如果您想要编译64位,这是有意义的。

这些都是评论,而不是回答。请告诉我其中任何一件事是否有意义。对于用户和TSP的不同上下文过程,这个解决方案对我来说是新的,我想让它为您工作,因为我可能会想要使用它到某一天。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18621809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档