从TAPI服务提供商(TSP)访问HKCU的用户信息

时间:2013-09-04 19:05:43

标签: windows-7-x64 tapi

我正在尝试构建一个tsp。现在的问题是,我需要获取一些信息(来自用户配置所在的HKCU),了解谁在发出请求。

由于TSP在Telephony服务的上下文中运行,我无法直接访问。我的计划是使用LINE_CREATEDIALOGINSTANCE的功能来读取此信息,与herehere描述的信息完全相同。

问题再次类似于无关,Telephony服务+拨号器正在崩溃以下堆栈跟踪。

(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

并且,崩溃时的寄存器,

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

并且,代码片段:

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上使用Windows 7 x64。

2 个答案:

答案 0 :(得分:0)

你有进步吗?我想我现在看到你想要做什么。您希望发送LINE_CREATEDIALOGINSTANCE以响应TSPI_lineMakeCall命令,以便找出请求makecall的用户。那是对的吗?

如果是这样,我认为你当时还应该处理一个问题。如果您可以暂时假设用户信息并处理makecall请求,您仍然必须首先解决无效的类型转换。为了解决这个问题,请查看TSPI_lineOpen代码中的线条处理内容。在MakeCall功能中,您只能在TSPI_lineOpen

的第三个参数中找回您提供的电话服务内容
  

<强>参数

     

dwDeviceID 标识要打开的线路设备。

     

htLine 线路设备的TAPI句柄,用于后续调用LINEEVENT回调程序以识别设备。

     

lphdLine 指向HDRVLINE的指针,其中服务提供商填写其线路设备的句柄。

     

dwTSPIVersion TSPI版本。    lpfnEventProc 指向TAPI提供的LINEEVENT回调过程的指针,服务提供者调用该过程来报告该行上的后续事件。

如果这样可以正常工作,请查看放在lParams结构中的字符串指针。这个范围是否正确?我会创建一个静态字符串并将变量指向像这样的

static WCHAR szUIDLLName[] = L"TSP_ATSPMod.tsp";
lParams->lpszUIDLLName = szUIDLLName;

第三,最后,我对你如何调用回调函数感到困惑。根据{{​​3}}你是对的。但是,如果你看一下LINE_CREATEDIALOGINSTANCE documentation,那么最后三个参数应该是DWORD_PTR,如果你想编译为64位,这是有意义的。

这一切都是评论而不是答案。如果有任何意义,请告诉我。对于用户和TSP的不同上下文过程的这种解决方案对我来说是新的,我希望能让它适合你,因为我可能希望有一天能够使用它。

答案 1 :(得分:0)

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

  

hProvider       ProviderHandle 作为 TSPI_providerEnumDevices 的参数提供给服务提供商。

因此,您必须首先将传递给HPROVIDER hProvider的{​​{1}}保存并在此处使用。

工作代码是,

TSPI_providerEnumDevices

还要确保正确导出方法PDRVLINE pLine = (PDRVLINE) ghProvider; ... (pDI->lpfnEventProc)((HTAPILINE)ghProvider, 0, LINE_CREATEDIALOGINSTANCE, (DWORD)lParams, 0, 0);