1

私はtspを構築しようとしていました。問題は、誰がリクエストを行っているかについての情報を (ユーザー構成が配置されている HKCU から) 取得する必要があることです。

TSP はテレフォニー サービスのコンテキストで実行されるため、直接アクセスすることはできません。私の計画は、 の機能を使用して、ここここでLINE_CREATEDIALOGINSTANCE説明されている情報とまったく同じようにこの情報を読み取ることでした。

問題は無関係ですが、これも似ています。テレフォニー サービス + ダイヤラがクラッシュし、次のスタック トレースが表示されます。

(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 を使用しています。

4

2 に答える 2

0

進展はありましたか?あなたが何をしようとしているのか、今わかったと思います。どのユーザーが makecall を要求しているかを調べるために、TSPI_lineMakeCall コマンドに応答して LINE_CREATEDIALOGINSTANCE を送信したいと考えています。あれは正しいですか?

もしそうなら、一度に 1 つの問題を処理する必要があると思います。ユーザー情報を一時的に想定して makecall リクエストを処理できる場合でも、最初に無効な型キャストを解決する必要があります。これを解決するには、TSPI_lineOpen コードで linehandle に何を使用するかを調べます。MakeCall 関数では、 TSPI_lineOpenの 3 番目のパラメーターでテレフォニー サービスに提供したものだけが返されます。

パラメーター

dwDeviceIDオープンする回線デバイスを識別します。

htLine 後続の LINEEVENT コールバック プロシージャの呼び出しでデバイスを識別するために使用される、回線デバイスの TAPI ハンドル。

lhdLine サービス プロバイダーが回線デバイスのハンドルを入力する HDRVLINE へのポインター。

dwTSPIVersion TSPI バージョン。 lpfnEventProc TAPI によって提供される LINEEVENT コールバック プロシージャへのポインター。サービス プロバイダーは、回線上の後続のイベントを報告するために呼び出します。

それが正しく機能する場合は、lParams 構造体に配置した文字列ポインターを見てください。その範囲は正しいですか?静的文字列を作成し、変数を次のようにポイントします

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

最後に、コールバック関数の呼び出し方法について混乱しています。LINE_CREATEDIALOGINSTANCE のドキュメントによると、あなたは正しいです。ただし、Line_Event コールバック関数を見ると、最後の 3 つのパラメーターは実際には DWORD_PTR である必要があります。これは、64 ビット用にコンパイルする場合に意味があります。

これはすべて、答えよりもコメントです。意味のあるものがあれば教えてください。ユーザーと TSP の異なるコンテキスト プロセスに対するこのソリューションは、私にとっては初めてのことであり、いつか使用したいと思うので、うまく機能させたいと思っています。

于 2013-09-06T08:56:29.977 に答える
0

最後に MSDN の助けを借りて: MSDN によると、このイベントの LINEEVENT 呼び出しの最初のパラメーターは HPROVIDER である必要があります。しかし、よく見ると、MSDN は次のように述べています。

hProvider TSPI_providerEnumDevicesのパラメーターとしてサービス プロバイダーに提供されるProviderHandle 。

したがって、HPROVIDER hProvider渡されたものをTSPI_providerEnumDevices最初に保存して、ここで使用する必要があります。

作業コードは、

PDRVLINE pLine = (PDRVLINE) ghProvider;    
...
(pDI->lpfnEventProc)((HTAPILINE)ghProvider, 0, LINE_CREATEDIALOGINSTANCE, (DWORD)lParams, 0, 0);

また、メソッドTUISPI_providerGenericDialogが正しくエクスポートされていることを確認してください。

于 2013-09-07T11:01:30.477 に答える