Доступ к информации о пользователе в HKCU от поставщика услуг TAPI (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: использование Windows 7 x64 на VMWare.
2 ответа
Наконец, MSDN для спасения: Согласно MSDN, первым параметром вызова LINEEVENT для этого события должен быть HPROVIDER. Но если вы посмотрите внимательно, MSDN говорит,
hProvider ProviderHandle, предоставляемый поставщику услуг в качестве параметра для TSPI_providerEnumDevices.
Итак, вы должны сохранить HPROVIDER hProvider
перешел к TSPI_providerEnumDevices
сначала и используйте это здесь.
Рабочий код есть,
PDRVLINE pLine = (PDRVLINE) ghProvider;
...
(pDI->lpfnEventProc)((HTAPILINE)ghProvider, 0, LINE_CREATEDIALOGINSTANCE, (DWORD)lParams, 0, 0);
Также убедитесь, что метод TUISPI_providerGenericDialog
экспортируется правильно.
Был ли у вас прогресс? Я думаю, что теперь я вижу, что вы пытаетесь сделать. Вы хотите отправить LINE_CREATEDIALOGINSTANCE в ответ на команду TSPI_lineMakeCall, чтобы выяснить, какой пользователь запрашивает вызов makecall. Это верно?
Если это так, я думаю, что вы все равно должны решить одну проблему в то время. Если бы вы могли на мгновение получить информацию о пользователе и обработать запрос makecall, вам все равно пришлось бы сначала решить недопустимый тип. Чтобы решить эту проблему, взгляните на то, с чем вы будете работать в коде TSPI_lineOpen. В функции MakeCall вы получаете только то, что предоставили службе телефонии в третьем параметре TSPI_lineOpen.
параметры
dwDeviceID Идентифицирует линейное устройство, которое будет открыто.
htLine Дескриптор TAPI для линейного устройства, который будет использоваться в последующих вызовах процедуры обратного вызова LINEEVENT для идентификации устройства.
lphdLine Указатель на HDRVLINE, где поставщик услуг заполняет свой дескриптор для линейного устройства.
dwTSPIVersion Версия TSPI. lpfnEventProc Указатель на процедуру обратного вызова LINEEVENT, предоставляемую TAPI, которую поставщик услуг вызывает, чтобы сообщить о последующих событиях на линии.
Если это работает правильно, посмотрите на указатель строки, который вы поместили в структуру lParams. Это правильно? Я хотел бы создать статическую строку и указать переменную на это, как это
static WCHAR szUIDLLName[] = L"TSP_ATSPMod.tsp";
lParams->lpszUIDLLName = szUIDLLName;
В-третьих, и наконец, я не совсем понимаю, как вы вызываете функцию обратного вызова. Согласно документации LINE_CREATEDIALOGINSTANCE вы правы. Однако, если вы посмотрите на функцию обратного вызова Line_Event, последние три параметра действительно должны быть DWORD_PTR, которые имеют смысл, если вы хотите компилировать для 64-битной версии.
Это все действительно больше комментарий, чем ответ. Пожалуйста, дайте мне знать, если это имеет смысл. Это решение для различного контекстного процесса пользователя и TSP является новым для меня, и я хотел бы, чтобы оно работало для вас, потому что я, вероятно, захочу использовать его когда-нибудь.