mstscax!CMCS==MCSSendConnectInitial函数分析之mstsc.exe源代码分析第二次交互
EXPOSE_CD_SIMPLE_NOTIFICATION_FN(CMCS, MCSSendConnectInitial);
1: kd> kc
00 WS2_32!send
01 WS2_32!DTHOOK_send
02 mstscax!CTD::TDFlushSendQueue
03 mstscax!CTD::TD_SendBuffer
04 mstscax!CXT::XTSendCR
05 mstscax!CXT::MACROGENERATED_Static_XTSendCR
06 mstscax!CCD::CDWndProc
07 mstscax!CCD::CDStaticWndProc
08 USER32!InternalCallWinProc
09 USER32!UserCallWinProcCheckWow
0a USER32!DispatchMessageWorker
0b USER32!DispatchMessageW
0c mstscax!CSND::SND_Main
0d mstscax!CSND::SND_StaticMain
0e mstscax!CUT::UTStaticThreadEntry
0f mstscax!_threadstartex
10 kernel32!BaseThreadStart
1: kd> x mstscax!CMCS::MCSSendConnectInitial
5d03a770 mstscax!CMCS::MCSSendConnectInitial (unsigned long)
1: kd> bp mstscax!CMCS::MCSSendConnectInitial
1: kd> g
Breakpoint 18 hit
mstscax!CMCS::MCSSendConnectInitial:
001b:5d03a770 55 push ebp
1: kd> kc
00 mstscax!CMCS::MCSSendConnectInitial
01 mstscax!CMCS::MACROGENERATED_Static_MCSSendConnectInitial
02 mstscax!CCD::CDWndProc
03 mstscax!CCD::CDStaticWndProc
04 USER32!InternalCallWinProc
05 USER32!UserCallWinProcCheckWow
06 USER32!DispatchMessageWorker
07 USER32!DispatchMessageW
08 mstscax!CSND::SND_Main
09 mstscax!CSND::SND_StaticMain
0a mstscax!CUT::UTStaticThreadEntry
0b mstscax!_threadstartex
0c kernel32!BaseThreadStart
1: kd> kv
ChildEBP RetAddr Args to Child
00 00d3fd60 5cfe1480 00a49e80 00000000 00d3fdd8 mstscax!CMCS::MCSSendConnectInitial (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\mcsint.cpp @ 31]
01 00d3fd70 5cfe4c64 00a49e80 00000000 77e67495 mstscax!CMCS::MACROGENERATED_Static_MCSSendConnectInitial+0x10 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\mcs.h @
884]
02 00d3fdd8 5cfe47f6 00a474a8 000300de 0000800b mstscax!CCD::CDWndProc+0x234 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\cdint.cpp @ 267]
03 00d3fdfc 77ce7ee3 000300de 0000800b 00000000 mstscax!CCD::CDStaticWndProc+0x56 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\cdint.cpp @ 181]
04 00d3fe28 77cf2bff 5cfe47a0 000300de 0000800b USER32!InternalCallWinProc+0x1b [d:\srv03rtm\windows\core\ntuser\client\i386\callproc.asm @ 102]
05 00d3fea0 77cbe3db 00000000 5cfe47a0 000300de USER32!UserCallWinProcCheckWow+0x151 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\client\clmsg.c @ 165]
06 00d3ff08 77cc4014 00d3ff40 00000000 00d3ff5c USER32!DispatchMessageWorker+0x3e3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\client\clmsg.c @ 2497]
07 00d3ff18 5cfceda0 00d3ff40 00000000 804edc60 USER32!DispatchMessageW+0xd (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\client\cltxt.h @ 1046]
08 00d3ff5c 5cf7ad3c 00a49558 00d3ff84 5d04ca97 mstscax!CSND::SND_Main+0x1d0 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\sndapi.cpp @ 83]
09 00d3ff68 5d04ca97 00a49558 5cf31068 5cf30ff0 mstscax!CSND::SND_StaticMain+0xc (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\core\snd.h @ 40]
0a 00d3ff84 5d0d43ea 00000000 00000000 00000000 mstscax!CUT::UTStaticThreadEntry+0x77 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\termsrv\newclient\util\nutint.cpp @ 209]
0b 00d3ffb8 77e41be7 00ab1ba0 00000000 00000000 mstscax!_threadstartex+0x6f (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\crts\crtw32\startup\threadex.c @ 268]
0c 00d3ffec 00000000 5d0d437b 00ab1ba0 00000000 kernel32!BaseThreadStart+0x34 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\win32\client\support.c @ 533]
windbg> .open -a 5cfe1480
/****************************************************************************/
/* Name: MCSSendConnectInitial */
/* */
/* Purpose: This function generates and sends a MCS connect-initial PDU. */
/****************************************************************************/
DCVOID DCINTERNAL CMCS::MCSSendConnectInitial(ULONG_PTR unused)
{
XT_BUFHND bufHandle;
PDCUINT8 pData = NULL;
DCUINT pduLength;
DCUINT dataLength;
DCBOOL intRC;
MCS_PDU_CONNECTINITIAL ciPDU = MCS_DATA_CONNECTINITIAL;
DC_BEGIN_FN("MCSSendConnectInitial");
DC_IGNORE_PARAMETER(unused);
/************************************************************************/
/* Calculate the size of the data to send. The pdu length is the size */
/* of the Connect-Initial header plus the user data. The data length */
/* is the length transmitted in the length field of the PDU, which */
/* doesn't include the PDU type (2 bytes) or the length field (3 */
/* bytes). Thus we need to subtract 5 bytes. */
/************************************************************************/
计算要发送的数据大小。PDU长度即为该大小
连接初始报头加上用户数据。数据长度是PDU长度字段中传输的长度,即
不包含PDU类型(2个字节)或长度字段(3个字节)(以字节为单位)。
因此,我们需要减去5个字节。
pduLength = sizeof(ciPDU) + _MCS.userDataLength;
dataLength = pduLength - 5;
TRC_NRM((TB, _T("CI total length:%u (data:%u) (hc:%u user-data:%u)"),
pduLength,
dataLength,
sizeof(ciPDU),
_MCS.userDataLength));
/************************************************************************/
/* Assume that the total CI length is less than the maximum MCS send */
/* packet size. */
/************************************************************************/
TRC_ASSERT((dataLength <= MCS_MAX_SNDPKT_LENGTH),
(TB, _T("Datalength out of range: %u"), dataLength));
TRC_ASSERT((_MCS.pReceivedPacket != NULL), (TB, _T("Null rcv packet buffer")));
/************************************************************************/
/* Update the MCS CI header with the data size. */
/************************************************************************/
ciPDU.length = MCSLocalToWire16((DCUINT16)dataLength);
/************************************************************************/
/* Update the MCS user-data octet string length. */
/************************************************************************/
ciPDU.udLength = MCSLocalToWire16((DCUINT16)_MCS.userDataLength);
/************************************************************************/
/* Get a private buffer from XT. */
/************************************************************************/
intRC = _pXt->XT_GetPrivateBuffer(pduLength, &pData, &bufHandle);
if (!intRC)
{
/********************************************************************/
/* We've failed to get a private buffer. This ONLY happens when TD */
/* has disconnected while the layers above are still trying to */
/* connect. Since TD has now disconnected and is refusing to give */
/* us a buffer we might as well just give up trying to get a */
/* buffer. */
/********************************************************************/
TRC_NRM((TB, _T("Failed to get a private buffer - just quit")));
DC_QUIT;
}
/************************************************************************/
/* Now fill in the buffer that we've just got. */
/************************************************************************/
DC_MEMCPY(pData, &ciPDU, sizeof(ciPDU));
DC_MEMCPY((pData + sizeof(ciPDU)),
_MCS.pReceivedPacket,
_MCS.userDataLength);
/************************************************************************/
/* Trace out the PDU. */
/************************************************************************/
TRC_DATA_NRM("Connect-Initial PDU", pData, pduLength);
/************************************************************************/
/* Send the buffer. If everything has worked OK, we should receive a */
/* Connect-Response PDU shortly. */
/************************************************************************/
_pXt->XT_SendBuffer(pData, pduLength, bufHandle);
DC_EXIT_POINT:
DC_END_FN();
} /* MCSSendConnectInitial */
1: kd> p
mstscax!CMCS::MCSSendConnectInitial+0x1b6:
001b:5d03a926 c74580e801f35c mov dword ptr [ebp-80h],offset mstscax!__filename (5cf301e8)
1: kd> p
mstscax!CMCS::MCSSendConnectInitial+0x1bd:
001b:5d03a92d e84e5e0900 call mstscax!TRC_ProfileTraceEnabled (5d0d0780)
1: kd> t
mstscax!TRC_ProfileTraceEnabled:
001b:5d0d0780 55 push ebp
1: kd> x mstscax!trcpConfig
5d0f4070 mstscax!trcpConfig = 0x00a50000
1: kd> dx -r1 ((mstscax!tagTRC_CONFIG *)0xa50000)
((mstscax!tagTRC_CONFIG *)0xa50000) : 0xa50000 [Type: tagTRC_CONFIG *]
+0x000\] traceLevel : 0x3 \[Type: unsigned long
+0x004\] dataTruncSize : 0x40 \[Type: unsigned long
+0x008\] funcNameLength : 0xc \[Type: unsigned long
+0x00c\] components : 0xfffffc1f \[Type: unsigned long
+0x010\] maxFileSize : 0x186a0 \[Type: unsigned long
+0x014\] flags : 0x388 \[Type: unsigned long
+0x018\] prefixList \[Type: unsigned short \[100\]
+0x0e0\] fileNames \[Type: unsigned short \[2\]\[260\]
1: kd> x mstscax!trcpConfig
5d0f4070 mstscax!trcpConfig = 0x00a50000
1: kd> dx -r1 ((mstscax!tagTRC_CONFIG *)0xa50000)
((mstscax!tagTRC_CONFIG *)0xa50000) : 0xa50000 [Type: tagTRC_CONFIG *]
+0x000\] traceLevel : 0x3 \[Type: unsigned long
+0x004\] dataTruncSize : 0x40 \[Type: unsigned long
+0x008\] funcNameLength : 0xc \[Type: unsigned long
+0x00c\] components : 0xfffffc1f \[Type: unsigned long
+0x010\] maxFileSize : 0x186a0 \[Type: unsigned long
+0x014\] flags : 0x388 \[Type: unsigned long
+0x018\] prefixList \[Type: unsigned short \[100\]
+0x0e0\] fileNames \[Type: unsigned short \[2\]\[260\]
1: kd> ed 0xa50000 1
1: kd> ed 0xa50000+14 3a8
1: kd> dx -r1 ((mstscax!tagTRC_CONFIG *)0xa50000)
((mstscax!tagTRC_CONFIG *)0xa50000) : 0xa50000 [Type: tagTRC_CONFIG *]
+0x000\] traceLevel : 0x1 \[Type: unsigned long
+0x004\] dataTruncSize : 0x40 \[Type: unsigned long
+0x008\] funcNameLength : 0xc \[Type: unsigned long
+0x00c\] components : 0xfffffc1f \[Type: unsigned long
+0x010\] maxFileSize : 0x186a0 \[Type: unsigned long
+0x014\] flags : 0x3a8 \[Type: unsigned long
+0x018\] prefixList \[Type: unsigned short \[100\]
+0x0e0\] fileNames \[Type: unsigned short \[2\]\[260\]
0: kd> g
18:41:29.35 079c:01e4 MCSSendConne 0039 Enter {
18:41:29.37 079c:01e4 MCSSendConne 0057 CI total length:405 (data:400) (hc:102 user-data:303)
18:41:29.37 079c:01e4 TD_GetPrivat 0454 Enter {
18:41:29.37 079c:01e4 TD_GetPrivat 0514 Exit }
18:41:29.37 079c:01e4 MCSSendConne 0106 Connect-Initial PDU
18:41:29.37 079c:01e4 XT_SendBuffe 0087 Enter {
18:41:29.37 079c:01e4 TD_SendBuffe 0537 Enter {
18:41:29.37 079c:01e4 TDFlushSendQ 1181 Enter {
Breakpoint 16 hit
WS2_32!send:
001b:7056b0f0 55 push ebp
1: kd> kc
00 WS2_32!send
01 WS2_32!DTHOOK_send
02 mstscax!CTD::TDFlushSendQueue
03 mstscax!CTD::TD_SendBuffer
04 mstscax!CXT::XT_SendBuffer
05 mstscax!CMCS::MCSSendConnectInitial
06 mstscax!CMCS::MACROGENERATED_Static_MCSSendConnectInitial
07 mstscax!CCD::CDWndProc
08 mstscax!CCD::CDStaticWndProc
09 USER32!InternalCallWinProc
0a USER32!UserCallWinProcCheckWow
0b USER32!DispatchMessageWorker
0c USER32!DispatchMessageW
0d mstscax!CSND::SND_Main
0e mstscax!CSND::SND_StaticMain
0f mstscax!CUT::UTStaticThreadEntry
10 mstscax!_threadstartex
11 kernel32!BaseThreadStart
1: kd> !handle 0000030c
PROCESS 8969a8e8 SessionId: 0 Cid: 079c Peb: 7ffdf000 ParentCid: 07e4
DirBase: 77609000 ObjectTable: e1260120 HandleCount: 115.
Image: mstsc.exe
Handle table at e1260120 with 115 entries in use
030c: Object: 89271140 GrantedAccess: 0016019f (Inherit) Entry: e1130618
Object: 89271140 Type: (89df9710) File
ObjectHeader: 89271128 (old version)
HandleCount: 1 PointerCount: 2
Directory Object: 00000000 Name: \Endpoint {Afd}
1: kd> db 000a5400
000a5400 03 00 01 9c 02 f0 80 7f-65 82 01 90 04 01 01 04 ........e.......
000a5410 01 01 01 01 ff 30 19 02-01 22 02 01 02 02 01 00 .....0..."......
000a5420 02 01 01 02 01 00 02 01-01 02 02 ff ff 02 01 02 ................
000a5430 30 19 02 01 01 02 01 01-02 01 01 02 01 01 02 01 0...............
000a5440 00 02 01 01 02 02 04 20-02 01 02 30 1c 02 02 ff ....... ...0....
000a5450 ff 02 02 fc 17 02 02 ff-ff 02 01 01 02 01 00 02 ................
000a5460 01 01 02 02 ff ff 02 01-02 04 82 01 2f 00 05 00 ............/...
000a5470 14 7c 00 01 81 26 00 08-00 10 00 01 c0 00 44 75 .|...&........Du