Есть такая проблема - какой-то процесс через RPC дергает функцию SetPrinterData в spoolsv.exe. Как определить что это за процесс? Пробовал поймать в WinDbg вызов этой функции в spoolsv.exe и воспользоваться командой !rpcexts.getcallinfo как написано в help-е для WinDbg (тема Identifying the Caller From the Server Thread), но почему-то ни одного активного вызова эта команда мне не выдает. Вот стек вызова: Код (Text): 0:016> k k Child-SP RetAddr Call Site 00000000`0484e908 00000000`ff593c7c spoolsv!SetPrinterDataExW 00000000`0484e910 00000000`ff58e7c3 spoolsv!YSetPrinterDataEx+0x58 00000000`0484e950 000007fe`fee1c7f5 spoolsv!RpcSetPrinterDataEx+0x7b 00000000`0484e9b0 000007fe`feecb62e RPCRT4!Invoke+0x65 00000000`0484ea20 000007fe`fee14070 RPCRT4!Ndr64StubWorker+0x61b 00000000`0484efe0 000007fe`fee19c24 RPCRT4!NdrServerCallAll+0x40 00000000`0484f030 000007fe`fee19d86 RPCRT4!DispatchToStubInCNoAvrf+0x14 00000000`0484f060 000007fe`fee1a479 RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x146 00000000`0484f180 000007fe`fee1a11d RPCRT4!LRPC_SCALL::DispatchRequest+0x149 00000000`0484f260 000007fe`fee27ddf RPCRT4!LRPC_SCALL::HandleRequest+0x20d 00000000`0484f390 000007fe`fee27995 RPCRT4!LRPC_ADDRESS::ProcessIO+0x3bf 00000000`0484f4d0 00000000`772bb43b RPCRT4!LrpcIoComplete+0xa5 00000000`0484f560 00000000`772b923f ntdll!TppAlpcpExecuteCallback+0x26b 00000000`0484f5f0 00000000`7709f56d ntdll!TppWorkerThread+0x3f8 00000000`0484f8f0 00000000`772d3281 kernel32!BaseThreadInitThunk+0xd 00000000`0484f920 00000000`00000000 ntdll!RtlUserThreadStart+0x1d А это результат команды !rpcexts.getcallinfo: Код (Text): 0:016> !rpcexts.getcallinfo 0 0 FFFF 638 !rpcexts.getcallinfo 0 0 FFFF 638 Searching for call info ... PID CELL ID ST PNO IFSTART THRDCELL CALLFLAG CALLID LASTTIME CONN/CLN ---------------------------------------------------------------------------- 0638 0000.0003 00 000 00000000 0000.0000 0000000a 00000000 0000ae7f 0000.0000 0638 0000.0004 00 000 00000000 0000.0000 0000000a 00000000 0000ae7f 0000.0000 0638 0000.0005 00 000 00000000 0000.0000 00000008 00000000 00016656 0000.0000 0638 0000.0006 00 000 00000000 0000.0000 0000000a 00000000 0005a252 0000.0000 0638 0000.0007 00 000 00000000 0000.0000 0000000a 00000000 0005a31d 0000.0000 0638 0000.0008 00 000 00000000 0000.0000 0000000a 00000000 0005a9c4 0000.0000 0638 0000.000a 00 000 00000000 0000.0000 0000000a 00000000 0005bf6f 0000.0000 0:016> Как видно ни одного активного call-а почему-то нет (ST должен быть 02 или 01) и соответственно !rpcexts.getdbgcell для соединения 0.0 выдает ошибку: Код (Text): 0:016> !rpcexts.getdbgcell 638 0.0 !rpcexts.getdbgcell 638 0.0 Getting cell info ... Getting cell info failed with error 2 0:016> Пробовал !rpcexts.getdbgcell для вызовов, но для всех выдает нулевые Caller PID/TID: Код (Text): 0:016> !rpcexts.getdbgcell 638 0.a !rpcexts.getdbgcell 638 0.a Getting cell info ... Call Status: Allocated Procedure Number: 0 Interface UUID start (first DWORD only): 0 Call ID: 0x0 (0) Servicing thread identifier: 0x0.0 Call Flags:async, LRPC Last update time (in seconds since boot):376.687 (0x178.2AF) Caller (PID/TID) is: 0.0 (0.0)
http://msdn.microsoft.com/en-us/library/windows/desktop/aa373831%28v=vs.85%29.aspx Думаю как действовать очевидно ...
Мне что-то не очень очевидно... По этой ссылке описаны макросы, которые используются в RPC для обработки исключений. Каким образом это может помочь в определении PID процесса сделавшего RPC вызов?
Спасибо за толчок в правильном направлении. Но как этот CID найти? Нашел я один способ через поиск глазами пары 16-битных значений в стеке - http://www.dumpanalysis.org/blog/index.php/2011/02/19/crash-dump-analysis-patterns-part-130a/ - даже стек там на мой похож, но к сожалению в моем случае ничего похожего на реальный CID таким способом найти не могу Код (Text): 0: kd> !thread fffffa8002b54510 ff THREAD fffffa8002b54510 Cid 063c.057c Teb: 000007fffff9e000 Win32Thread: fffff900c1c2fc30 WAIT: (Executive) KernelMode Non-Alertable SuspendCount 1 fffff8800cd3a090 SynchronizationEvent Impersonation token: fffff8a006deb060 (Level Impersonation) DeviceMap fffff8a006dcd8d0 Owning Process fffffa8002170b30 Image: spoolsv.exe Attached Process N/A Image: N/A Wait Start TickCount 87171 Ticks: 26 (0:00:00:00.406) Context Switch Count 3417 LargeStack UserTime 00:00:00.156 KernelTime 00:00:00.375 Win32 Start Address ntdll!TppWorkerThread (0x0000000076e98f00) Stack Init fffff8800cd3adb0 Current fffff8800cd39da0 Base fffff8800cd3b000 Limit fffff8800cd32000 Call 0 Priority 10 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 Child-SP RetAddr Call Site fffff880`0cd39de0 fffff800`016d6052 nt!KiSwapContext+0x7a fffff880`0cd39f20 fffff800`016d81af nt!KiCommitThreadWait+0x1d2 fffff880`0cd39fb0 fffff800`01a71c38 nt!KeWaitForSingleObject+0x19f fffff880`0cd3a050 fffff800`01a71fbc nt!DbgkpQueueMessage+0x2a8 fffff880`0cd3a220 fffff800`01a153b6 nt!DbgkpSendApiMessage+0x5c fffff880`0cd3a260 fffff800`017092f3 nt! ?? ::NNGAKEGL::`string'+0x3547d fffff880`0cd3a3a0 fffff800`016ce542 nt!KiDispatchException+0x273 fffff880`0cd3aa40 fffff800`016cc374 nt!KiExceptionDispatch+0xc2 fffff880`0cd3ac20 00000000`ff47ab7d nt!KiBreakpointTrap+0xf4 (TrapFrame @ fffff880`0cd3ac20) 00000000`04a7ede8 00000000`ff463c7c spoolsv!SetPrinterDataExW+0x1 00000000`04a7edf0 00000000`ff45e7c3 spoolsv!YSetPrinterDataEx+0x58 00000000`04a7ee30 000007fe`fee2c7f5 spoolsv!RpcSetPrinterDataEx+0x7b 00000000`04a7ee90 000007fe`feedb62e RPCRT4!Invoke+0x65 00000000`04a7ef00 000007fe`fee24070 RPCRT4!Ndr64StubWorker+0x61b 00000000`04a7f4c0 000007fe`fee29c24 RPCRT4!NdrServerCallAll+0x40 00000000`04a7f510 000007fe`fee29d86 RPCRT4!DispatchToStubInCNoAvrf+0x14 00000000`04a7f540 000007fe`fee2a479 RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x146 00000000`04a7f660 000007fe`fee2a11d RPCRT4!LRPC_SCALL::DispatchRequest+0x149 00000000`04a7f740 000007fe`fee37ddf RPCRT4!LRPC_SCALL::HandleRequest+0x20d 00000000`04a7f870 000007fe`fee37995 RPCRT4!LRPC_ADDRESS::ProcessIO+0x3bf 00000000`04a7f9b0 00000000`76e9b43b RPCRT4!LrpcIoComplete+0xa5 00000000`04a7fa40 00000000`76e9923f ntdll!TppAlpcpExecuteCallback+0x26b 00000000`04a7fad0 00000000`76c7f56d ntdll!TppWorkerThread+0x3f8 00000000`04a7fdd0 00000000`76eb3281 kernel32!BaseThreadInitThunk+0xd 00000000`04a7fe00 00000000`00000000 ntdll!RtlUserThreadStart+0x1d Код (Text): 0: kd> dpp /p 00000000`04a7f740 l40 00000000`04a7f740 00230031`0076002f 00000000`04a7f748 00760067`00650052 00000000`04a7f750 00710045`006c0061 00000000`04a7f758 0073006c`00610075 00000000`04a7f760 00000000`00000000 00000000`04a7f768 006c0070`00700061 00000000`04a7f770 00740061`00630069 00000000`04a7f778 0073006e`006f0069 00000000`04a7f780 00000000`00000000 00000000`04a7f788 006c0070`00700061 00000000`04a7f790 00740061`00630069 00000000`04a7f798 0000006e`006f0069 00000000`04a7f7a0 006b0073`00610074 00000000`04a7f7a8 00000000`00000000 00000000`04a7f7b0 00650074`00610063 00000000`04a7f7b8 00790072`006f0067 00000000`04a7f7c0 00000000`00000000 00000000`04a7f7c8 00650072`00640069 00000000`04a7f7d0 00000000`00000066 00000000`04a7f7d8 000007fe`fe0297f8 00000000`04a7f7e0 00000000`00000000 00000000`04a7f7e8 00000000`00000000 00000000`04a7f7f0 00000000`00000000 00000000`04a7f7f8 404b45f6`e998ed4d 00000000`04a7f800 c8ed4639`9a7f708c 00000000`04a7f808 000007fe`fe029828 00000000`04a7f810 00000000`00000010 00000000`04a7f818 00000000`00000000 00000000`04a7f820 00000000`00000000
mitek Если клиент сделал вызов на сервер(RPC), сервер в данной процедуре генерит исключения кто его будет обрабатвать? (если сервер хендлер не поставил)...