我正在尝试构建一个tsp。现在的问题是,我需要获取一些信息(来自用户配置所在的HKCU),了解谁在发出请求。
由于TSP在Telephony服务的上下文中运行,我无法直接访问。我的计划是使用LINE_CREATEDIALOGINSTANCE
的功能来读取此信息,与here和here描述的信息完全相同。
问题再次类似于无关,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。
答案 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);
。