第一部分:
NTSTATUS
_IcaPushStack(
IN PICA_STACK pStack,
IN PICA_STACK_PUSH pStackPush
)
{
/*
* Load an instance of the requested stack driver
*/
Status = _IcaLoadSd( pStackPush->StackModuleName, &pSdLink );
if ( !NT_SUCCESS( Status ) )
goto done;
/*
* Call the SD open procedure
*/
Status = _IcaCallSd( pSdLink, SD$OPEN, pSdOpen );
第二部分:
0: kd> g
Breakpoint 0 hit
termsrv!WsxStackIoControl:
001b:7489fb4f 55 push ebp
1: kd> kc
#
00 termsrv!WsxStackIoControl
01 icaapi!_IcaStackIoControl
02 icaapi!IcaStackConnectionWait
03 termsrv!WinStationConnectThread
04 kernel32!BaseThreadStart
1: kd> g
Breakpoint 0 hit
termsrv!WsxStackIoControl:
001b:7489fb4f 55 push ebp
1: kd> kc
#
00 termsrv!WsxStackIoControl
01 icaapi!_IcaStackIoControl
02 icaapi!_IcaPushPd
03 icaapi!_IcaPushStack
04 icaapi!_IcaPushStackAndOpenEndpoint
05 icaapi!IcaStackConnectionAccept
06 termsrv!TransferConnectionToIdleWinStation
07 termsrv!WinStationTransferThread
08 kernel32!BaseThreadStart
1: kd> g
Breakpoint 3 hit
termdd!_IcaPushStack:
baa8e73c 55 push ebp
1: kd> kc
#
00 termdd!_IcaPushStack
01 termdd!IcaDeviceControlStack
02 termdd!IcaDeviceControl
03 termdd!IcaDispatch
04 nt!IofCallDriver
05 nt!IopSynchronousServiceTail
06 nt!IopXxxControlFile
07 nt!NtDeviceIoControlFile
08 nt!_KiSystemService
09 SharedUserData!SystemCallStub
0a ntdll!NtDeviceIoControlFile
0b icaapi!IcaIoControl
0c icaapi!_IcaStackIoControlWorker
0d icaapi!IcaStackIoControl
0e rdpwsx!WsxIcaStackIoControl
0f termsrv!WsxStackIoControl
10 icaapi!_IcaStackIoControl
11 icaapi!_IcaPushPd
12 icaapi!_IcaPushStack
13 icaapi!_IcaPushStackAndOpenEndpoint
14 icaapi!IcaStackConnectionAccept
15 termsrv!TransferConnectionToIdleWinStation
16 termsrv!WinStationTransferThread
17 kernel32!BaseThreadStart
1: kd> dv
pStack = 0x898b79e0
pStackPush = 0xba104738
pSdLink = 0x00000008
1: kd> dx -r1 ((termdd!_ICA_STACK_PUSH *)0xba104738)
((termdd!_ICA_STACK_PUSH *)0xba104738) : 0xba104738 [Type: _ICA_STACK_PUSH *]
[+0x000] StackModuleType : Stack_Module_Pd (0) [Type: _STACKMODULECLASS]
[+0x004] StackModuleName [Type: unsigned short [33]]
[+0x046] OEMId : "" [Type: char [4]]
[+0x04c] WdConfig [Type: _WDCONFIGW]
[+0x178] PdConfig [Type: _PDCONFIGW]
[+0x458] WinStationRegName [Type: unsigned short [33]]
1: kd> dx -r1 (*((termdd!unsigned short (*)[33])0xba104b90))
(*((termdd!unsigned short (*)[33])0xba104b90)) [Type: unsigned short [33]]
[0] : 0x52 [Type: unsigned short]
[1] : 0x44 [Type: unsigned short]
[2] : 0x50 [Type: unsigned short]
[3] : 0x2d [Type: unsigned short]
[4] : 0x54 [Type: unsigned short]
[5] : 0x63 [Type: unsigned short]
[6] : 0x70 [Type: unsigned short]
[7] : 0x0 [Type: unsigned short]
[8] : 0x0 [Type: unsigned short]
[9] : 0x0 [Type: unsigned short]
1: kd> db 0xba104b90
ba104b90 52 00 44 00 50 00 2d 00-54 00 63 00 70 00 00 00 R.D.P.-.T.c.p...
ba104ba0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ba104bb0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ba104bc0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ba104bd0 00 00 00 00 e2 9a f7 aa-c0 46 10 ba 44 6c a2 80 .........F..Dl..
ba104be0 e4 4c 10 ba b8 38 a9 ba-f0 42 a9 ba 00 00 00 00 .L...8...B......
ba104bf0 04 4c 10 ba 9c 99 a8 ba-e0 79 8b 89 b0 be 7d 89 .L.......y....}.
ba104c00 20 bf 7d 89 20 4c 10 ba-a3 a3 a8 ba b0 be 7d 89 .}. L........}.
1: kd> dx -r1 (*((termdd!unsigned short (*)[33])0xba10473c))
(*((termdd!unsigned short (*)[33])0xba10473c)) [Type: unsigned short [33]]
[0] : 0x74 [Type: unsigned short]
[1] : 0x64 [Type: unsigned short]
[2] : 0x74 [Type: unsigned short]
[3] : 0x63 [Type: unsigned short]
[4] : 0x70 [Type: unsigned short]
[5] : 0x0 [Type: unsigned short]
1: kd> db 0xba10473c
ba10473c 74 00 64 00 74 00 63 00-70 00 00 00 00 00 00 00 t.d.t.c.p.......
ba10474c 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ba10475c 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ba10476c 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ba10477c 00 00 00 00 00 00 00 00-4d 00 69 00 63 00 72 00 ........M.i.c.r.
ba10478c 6f 00 73 00 6f 00 66 00-74 00 20 00 52 00 44 00 o.s.o.f.t. .R.D.
ba10479c 50 00 20 00 35 00 2e 00-32 00 00 00 00 00 00 00 P. .5...2.......
ba1047ac 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
第三部分:
1: kd> x termdd!g_TermServProcessID
baa951a8 termdd!g_TermServProcessID = 0x8960d6a0
pSdOpen = ICA_ALLOCATE_POOL( NonPagedPool, sizeof(SD_OPEN) );
if ( pSdOpen == NULL ) {
Status = STATUS_NO_MEMORY;
goto done;
}
1: kd> p
termdd!_IcaPushStack+0x61:
baa8e79d e844c9ffff call termdd!IcaAllocatePool (baa8b0e6)
1: kd> p
termdd!_IcaPushStack+0x66:
baa8e7a2 8bd8 mov ebx,eax
1: kd> r
eax=897fdb80 ebx=00000000 ecx=baa8b1be edx=897fdb68 esi=898b79e0 edi=ba10473c
eip=baa8e7a2 esp=ba1046a0 ebp=ba1046b0 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
termdd!_IcaPushStack+0x66:
baa8e7a2 8bd8 mov ebx,eax
1: kd> dt SD_OPEN 897fdb80
termdd!SD_OPEN
+0x000 StackClass : 0xffffffff (No matching name)
+0x004 pStatus : 0xffffffff _PROTOCOLSTATUS
+0x008 pClient : 0xffffffff _CLIENTMODULES
+0x00c WdConfig : _WDCONFIGW
+0x138 PdConfig : _PDCONFIGW
+0x418 OEMId : [4] "???"
+0x41c WinStationRegName : [33] 0xffff
+0x460 DeviceObject : 0xffffffff _DEVICE_OBJECT
+0x464 OutBufHeader : 0xffffffff
+0x468 OutBufTrailer : 0xffffffff
+0x46c SdOutBufHeader : 0xffffffff
+0x470 SdOutBufTrailer : 0xffffffff
第四部分:
1: kd> dv
pStack = 0x898b79e0
pStackPush = 0xba104738
pSdLink = 0x00000000
1: kd> dx -r1 ((termdd!_ICA_STACK_PUSH *)0xba104738)
((termdd!_ICA_STACK_PUSH *)0xba104738) : 0xba104738 [Type: _ICA_STACK_PUSH *]
[+0x000] StackModuleType : Stack_Module_Pd (0) [Type: _STACKMODULECLASS]
[+0x004] StackModuleName [Type: unsigned short [33]]
[+0x046] OEMId : "" [Type: char [4]]
[+0x04c] WdConfig [Type: _WDCONFIGW]
[+0x178] PdConfig [Type: _PDCONFIGW]
[+0x458] WinStationRegName [Type: unsigned short [33]]
1: kd> dx -r1 (*((termdd!unsigned short (*)[33])0xba10473c))
(*((termdd!unsigned short (*)[33])0xba10473c)) [Type: unsigned short [33]]
[0] : 0x74 [Type: unsigned short]
[1] : 0x64 [Type: unsigned short]
[2] : 0x74 [Type: unsigned short]
[3] : 0x63 [Type: unsigned short]
[4] : 0x70 [Type: unsigned short]
[5] : 0x0 [Type: unsigned short]
1: kd> db 0xba10473c
ba10473c 74 00 64 00 74 00 63 00-70 00 00 00 00 00 00 00 t.d.t.c.p.......
第五部分:
1: kd> p
termdd!_IcaPushStack+0x7b:
baa8e7b7 e876f1ffff call termdd!_IcaLoadSd (baa8d932)
1: kd> t
termdd!_IcaLoadSd:
baa8d932 55 push ebp
1: kd> kc 6
#
00 termdd!_IcaLoadSd
01 termdd!_IcaPushStack
02 termdd!IcaDeviceControlStack
03 termdd!IcaDeviceControl
04 termdd!IcaDispatch
05 nt!IofCallDriver
1: kd> dv
SdName = 0xba10473c
ppSdLink = 0xba1046ac
pSdLoad = 0x00000008
Status = 0n-1173338308
1: kd> dx -r1 ((termdd!unsigned short *)0xba10473c)
((termdd!unsigned short *)0xba10473c) : 0xba10473c : 0x74 [Type: unsigned short *]
0x74 [Type: unsigned short]
1: kd> db 0xba10473c
ba10473c 74 00 64 00 74 00 63 00-70 00 00 00 00 00 00 00 t.d.t.c.p.......
1: kd> x termdd!IcaSdLoadListHead
baa952e8 termdd!IcaSdLoadListHead = struct _LIST_ENTRY [ 0x897e8fd8 - 0x8948bd40 ]
1: kd> dx -r1 (*((termdd!_LIST_ENTRY *)0xbaa952e8))
(*((termdd!_LIST_ENTRY *)0xbaa952e8)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x897e8fd8 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x8948bd40 [Type: _LIST_ENTRY *]
1: kd> dt SDLOAD 0x897e8fd8
termdd!SDLOAD
+0x000 SdName : [33] 0xbd40
+0x044 RefCount : 0n0
+0x048 Links : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x050 ImageHandle : (null)
+0x054 ImageBase : (null)
+0x058 DriverLoad : (null)
+0x05c FileObject : (null)
+0x060 pUnloadWorkItem : (null)
+0x064 DeviceObject : (null)
1: kd> dt SDLOAD 0x897e8fd8-48
termdd!SDLOAD
+0x000 SdName : [33] 0x72
+0x044 RefCount : 0n2
+0x048 Links : _LIST_ENTRY [ 0x8948bd40 - 0xbaa952e8 ]
+0x050 ImageHandle : (null)
+0x054 ImageBase : 0x00000001 Void
+0x058 DriverLoad : 0xb9ae4e10 long RDPWD!ModuleEntry+0
+0x05c FileObject : 0x89847c78 _FILE_OBJECT
+0x060 pUnloadWorkItem : (null)
+0x064 DeviceObject : 0x894768c8 _DEVICE_OBJECT
1: kd> dx -r1 ((termdd!_LIST_ENTRY *)0x897e8fd8)
((termdd!_LIST_ENTRY *)0x897e8fd8) : 0x897e8fd8 [Type: _LIST_ENTRY *]
[+0x000] Flink : 0x8948bd40 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0xbaa952e8 [Type: _LIST_ENTRY *]
1: kd> dt SDLOAD 0x8948bd40-48
termdd!SDLOAD
+0x000 SdName : [33] 0x74
+0x044 RefCount : 0n2 +0x044 RefCount : 0n2
+0x048 Links : _LIST_ENTRY [ 0xbaa952e8 - 0x897e8fd8 ]
+0x050 ImageHandle : (null)
+0x054 ImageBase : (null)
+0x058 DriverLoad : 0xb9c9da7e long TDTCP!ModuleEntry+0
+0x05c FileObject : 0x8974cf90 _FILE_OBJECT
+0x060 pUnloadWorkItem : (null)
+0x064 DeviceObject : 0x895e78c8 _DEVICE_OBJECT
1: kd> dv
SdName = 0xba10473c
ppSdLink = 0xba1046ac
pSdLoad = 0x00000008
Status = 0n-1173338308
1: kd> dx -r1 ((termdd!_SDLINK * *)0xba1046ac)
((termdd!_SDLINK * *)0xba1046ac) : 0xba1046ac [Type: _SDLINK * *]
0x0 [Type: _SDLINK *]
1: kd> dt SDLINK 0xba1046ac
termdd!SDLINK
+0x000 pStack : (null)
+0x004 pSdLoad : 0xba104bf0 _SDLOAD
+0x008 Links : _LIST_ENTRY [ 0xbaa8f087 - 0x898b79e0 ]
+0x010 RefCount : 0n-1173338312
+0x014 SdContext : _SDCONTEXT
+0x020 Resource : _ERESOURCE
1: kd> dx -id 0,0,8960d6a0 -r1 (*((termdd!_SDCONTEXT *)0xba1046c0))
(*((termdd!_SDCONTEXT *)0xba1046c0)) [Type: _SDCONTEXT]
[+0x000] pProcedures : 0x897dbf20 [Type: void *]
[+0x004] pCallup : 0x897dbeb0 [Type: _SDCALLUP *]
[+0x008] pContext : 0x804edc6c [Type: void *]
/*
* Allocate a SDLINK struct
*/
pSdLink = ICA_ALLOCATE_POOL( NonPagedPool, sizeof(*pSdLink) );
if ( pSdLink == NULL )
return( STATUS_INSUFFICIENT_RESOURCES );
RtlZeroMemory( pSdLink, sizeof(*pSdLink) );
/*
* Look for the requested SD. If found, increment the ref count for it.
*/
Head = &IcaSdLoadListHead;
for ( Next = Head->Flink; Next != Head; Next = Next->Flink ) {
pSdLoad = CONTAINING_RECORD( Next, SDLOAD, Links );
if ( !wcscmp( pSdLoad->SdName, SdName ) ) {
_IcaReferenceSdLoad( pSdLoad );
break;
}
}
1: kd> dv
SdName = 0xba10473c
ppSdLink = 0xba1046ac
pSdLoad = 0x8948bcf8
Status = 0n-1173338308
1: kd> dx -r1 ((termdd!_SDLOAD *)0x8948bcf8)
((termdd!_SDLOAD *)0x8948bcf8) : 0x8948bcf8 [Type: _SDLOAD *]
[+0x000] SdName [Type: unsigned short [33]]
[+0x044] RefCount : 3 [Type: long] //原来是2
[+0x048] Links [Type: _LIST_ENTRY]
[+0x050] ImageHandle : 0x0 [Type: void *]
[+0x054] ImageBase : 0x0 [Type: void *]
[+0x058] DriverLoad : 0xb9c9da7e [Type: long (*)(_SDCONTEXT *,unsigned char)]
[+0x05c] FileObject : 0x8974cf90 [Type: _FILE_OBJECT *]
[+0x060] pUnloadWorkItem : 0x0 [Type: void *]
[+0x064] DeviceObject : 0x895e78c8 : Device for "\Driver\TDTCP" [Type: _DEVICE_OBJECT *]
pSdLink->pSdLoad = pSdLoad;
1: kd> dt _SDLINK 0xba1046ac
termdd!_SDLINK
+0x000 pStack : (null)
+0x004 pSdLoad : 0xba104bf0 _SDLOAD
+0x008 Links : _LIST_ENTRY [ 0xbaa8f087 - 0x898b79e0 ]
+0x010 RefCount : 0n-1173338312
+0x014 SdContext : _SDCONTEXT
+0x020 Resource : _ERESOURCE
第六部分:
/*
* Call the driver load procedure.
* The driver will fill in the fields in the SDCONTEXT structure.
*/
Status = (pSdLoad->DriverLoad)( &pSdLink->SdContext, TRUE );
1: kd> p
termdd!_IcaLoadSd+0xea:
baa8da1c 50 push eax
1: kd> p
termdd!_IcaLoadSd+0xeb:
baa8da1d 8b45fc mov eax,dword ptr [ebp-4]
1: kd> p
termdd!_IcaLoadSd+0xee:
baa8da20 ff5058 call dword ptr [eax+58h]
1: kd> r
eax=8948bcf8 ebx=80a1aa6e ecx=00000000 edx=00000000 esi=895db978 edi=80aed4d0
eip=baa8da20 esp=ba104678 ebp=ba104690 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
termdd!_IcaLoadSd+0xee:
baa8da20 ff5058 call dword ptr [eax+58h] ds:0023:8948bd50={TDTCP!ModuleEntry (b9c9da7e)}
NTSTATUS ModuleEntry(PSDCONTEXT pContext, BOOLEAN fLoad)
{
if (fLoad)
return TdLoad(pContext);
else
return TdUnload(pContext);
}
NTSTATUS TdLoad(PSDCONTEXT pContext)
{
NTSTATUS Status;
PTD pTd;
/*
* Initialize td procedures
*/
pContext->pProcedures = G_pTdProcedures;
1: kd> x TDTCP!G_pTdProcedures
b9ca6010 TDTCP!G_pTdProcedures = <function> *[6]
1: kd> dx -r1 (*((TDTCP!long (*(*)[6])(void *,void *))0xb9ca6010))
(*((TDTCP!long (*(*)[6])(void *,void *))0xb9ca6010)) [Type: long (* [6])(void *,void *)]
[0] : 0xb9c9ca24 [Type: long (*)(void *,void *)]
[1] : 0xb9c9cca0 [Type: long (*)(void *,void *)]
[2] : 0xb9c9dcd6 [Type: long (*)(void *,void *)]
[3] : 0xb9c9cde2 [Type: long (*)(void *,void *)]
[4] : 0xb9c9ce16 [Type: long (*)(void *,void *)]
[5] : 0xb9c9cec2 [Type: long (*)(void *,void *)]
1: kd> u b9c9ca24
TDTCP!TdOpen [d:\srv03rtm\termsrv\drivers\td\common\tdapi.c @ 237]:
b9c9ca24 55 push ebp
b9c9ca25 8bec mov ebp,esp
b9c9ca27 51 push ecx
b9c9ca28 51 push ecx
b9c9ca29 53 push ebx
b9c9ca2a 56 push esi
b9c9ca2b 57 push edi
b9c9ca2c 8b5d08 mov ebx,dword ptr [ebp+8]
1: kd> u b9c9cca0
TDTCP!TdClose [d:\srv03rtm\termsrv\drivers\td\common\tdapi.c @ 299]:
b9c9cca0 55 push ebp
b9c9cca1 8bec mov ebp,esp
b9c9cca3 53 push ebx
b9c9cca4 56 push esi
b9c9cca5 8b7508 mov esi,dword ptr [ebp+8]
b9c9cca8 57 push edi
b9c9cca9 682ecbc9b9 push offset TDTCP!TdOpen+0x10a (b9c9cb2e)
b9c9ccae 6a01 push 1
1: kd> u b9c9dcd6
TDTCP!TdRawWrite [d:\srv03rtm\termsrv\drivers\td\common\tdapi.c @ 414]:
b9c9dcd6 55 push ebp
b9c9dcd7 8bec mov ebp,esp
b9c9dcd9 51 push ecx
b9c9dcda 8b450c mov eax,dword ptr [ebp+0Ch]
b9c9dcdd 8365fc00 and dword ptr [ebp-4],0
b9c9dce1 53 push ebx
b9c9dce2 56 push esi
b9c9dce3 57 push edi
1: kd> u b9c9ce16
TDTCP!TdSyncWrite [d:\srv03rtm\termsrv\drivers\td\common\tdapi.c @ 583]:
b9c9ce16 55 push ebp
b9c9ce17 8bec mov ebp,esp
b9c9ce19 53 push ebx
b9c9ce1a 56 push esi
b9c9ce1b 8b7508 mov esi,dword ptr [ebp+8]
b9c9ce1e 57 push edi
b9c9ce1f 68eacdc9b9 push offset TDTCP!TdChannelWrite+0x8 (b9c9cdea)
b9c9ce24 6a10 push 10h
1: kd> u b9c9cec2
TDTCP!TdIoctl [d:\srv03rtm\termsrv\drivers\td\common\tdapi.c @ 630]:
b9c9cec2 55 push ebp
b9c9cec3 8bec mov ebp,esp
b9c9cec5 53 push ebx
b9c9cec6 8b5d08 mov ebx,dword ptr [ebp+8]
b9c9cec9 56 push esi
b9c9ceca 57 push edi
b9c9cecb 8b7d0c mov edi,dword ptr [ebp+0Ch]
b9c9cece 8b07 mov eax,dword ptr [edi]
1: kd> dv
pContext = 0x895db98c
fLoad = 0x01 ''
1: kd> dx -r1 ((TDTCP!_SDCONTEXT *)0x895db98c)
((TDTCP!_SDCONTEXT *)0x895db98c) : 0x895db98c [Type: _SDCONTEXT *]
[+0x000] pProcedures : 0xb9ca6010 [Type: void *]
[+0x004] pCallup : 0x0 [Type: _SDCALLUP *]
[+0x008] pContext : 0x894e7388 [Type: void *]
1: kd> p
TDTCP!ModuleEntry+0x18:
b9c9da96 5d pop ebp
1: kd> p
TDTCP!ModuleEntry+0x19:
b9c9da97 c20800 ret 8
1: kd> p
termdd!_IcaLoadSd+0xf1:
baa8da23 85c0 test eax,eax
1: kd> p
返回到:termdd!_IcaLoadSd
NTSTATUS
_IcaLoadSd(
IN PDLLNAME SdName,
OUT PSDLINK *ppSdLink
)
{
*ppSdLink = pSdLink;
return( Status );
}
1: kd> dv
SdName = 0x00000000
ppSdLink = 0xba1046ac
pSdLoad = 0x8948bcf8
Status = 0n0
1: kd> dx -r1 ((termdd!_SDLINK * *)0xba1046ac)
((termdd!_SDLINK * *)0xba1046ac) : 0xba1046ac [Type: _SDLINK * *]
0x895db978 [Type: _SDLINK *]
1: kd> dx -r1 ((termdd!_SDLINK *)0x895db978)
((termdd!_SDLINK *)0x895db978) : 0x895db978 [Type: _SDLINK *]
[+0x000] pStack : 0x0 [Type: _ICA_STACK *]
[+0x004] pSdLoad : 0x8948bcf8 [Type: _SDLOAD *]
[+0x008] Links [Type: _LIST_ENTRY]
[+0x010] RefCount : 1 [Type: long]
[+0x014] SdContext [Type: _SDCONTEXT]
[+0x020] Resource [Type: _ERESOURCE]
1: kd> dx -r1 ((termdd!_SDLOAD *)0x8948bcf8)
((termdd!_SDLOAD *)0x8948bcf8) : 0x8948bcf8 [Type: _SDLOAD *]
[+0x000] SdName [Type: unsigned short [33]]
[+0x044] RefCount : 3 [Type: long]
[+0x048] Links [Type: _LIST_ENTRY]
[+0x050] ImageHandle : 0x0 [Type: void *]
[+0x054] ImageBase : 0x0 [Type: void *]
[+0x058] DriverLoad : 0xb9c9da7e [Type: long (*)(_SDCONTEXT *,unsigned char)]
[+0x05c] FileObject : 0x8974cf90 [Type: _FILE_OBJECT *]
[+0x060] pUnloadWorkItem : 0x0 [Type: void *]
[+0x064] DeviceObject : 0x895e78c8 : Device for "\Driver\TDTCP" [Type: _DEVICE_OBJECT *]
1: kd> p
termdd!_IcaLoadSd+0x13b:
baa8da6d c9 leave
1: kd> p
termdd!_IcaLoadSd+0x13c:
baa8da6e c20800 ret 8
1: kd> p
termdd!_IcaPushStack+0x80:
baa8e7bc 8bf8 mov edi,eax
1: kd> p
termdd!_IcaPushStack+0x82:
baa8e7be 85ff test edi,edi
返回到:termdd!_IcaPushStack
第七部分:
1: kd> dv
pStack = 0x898b79e0
pStackPush = 0xba104738
pSdLink = 0x895db978
1: kd> dx -r1 ((termdd!_SDLINK *)0x895db978)
((termdd!_SDLINK *)0x895db978) : 0x895db978 [Type: _SDLINK *]
[+0x000] pStack : 0x0 [Type: _ICA_STACK *]
[+0x004] pSdLoad : 0x8948bcf8 [Type: _SDLOAD *]
[+0x008] Links [Type: _LIST_ENTRY]
[+0x010] RefCount : 1 [Type: long]
[+0x014] SdContext [Type: _SDCONTEXT]
[+0x020] Resource [Type: _ERESOURCE]
1: kd> dx -r1 (*((termdd!_SDCONTEXT *)0x895db98c))
(*((termdd!_SDCONTEXT *)0x895db98c)) [Type: _SDCONTEXT]
[+0x000] pProcedures : 0xb9ca6010 [Type: void *]
[+0x004] pCallup : 0x0 [Type: _SDCALLUP *]
[+0x008] pContext : 0x894e7388 [Type: void *]
[+0x000] pProcedures : 0xb9ca6010 函数指针数组
1: kd> x TDTCP!G_pTdProcedures
b9ca6010 TDTCP!G_pTdProcedures = <function> *[6]
1: kd> dx -r1 (*((TDTCP!long (*(*)[6])(void *,void *))0xb9ca6010))
(*((TDTCP!long (*(*)[6])(void *,void *))0xb9ca6010)) [Type: long (* [6])(void *,void *)]
[0] : 0xb9c9ca24 [Type: long (*)(void *,void *)]
[1] : 0xb9c9cca0 [Type: long (*)(void *,void *)]
[2] : 0xb9c9dcd6 [Type: long (*)(void *,void *)]
[3] : 0xb9c9cde2 [Type: long (*)(void *,void *)]
[4] : 0xb9c9ce16 [Type: long (*)(void *,void *)]
[5] : 0xb9c9cec2 [Type: long (*)(void *,void *)]
函数指针数组
第八部分:
/*
* Increment the stack ref count for this SD,
* and push the new SD on the stack.
*/
IcaReferenceStack( pStack );
InsertHeadList( &pStack->SdLinkHead, &pSdLink->Links );
pSdLink->pStack = pStack;
pStack结构和pSdLink结构相互连接在了一起。
1: kd> dv
pStack = 0x898b79e0
pStackPush = 0xba104738
pSdLink = 0x895db978
1: kd> dx -r1 ((termdd!_SDLINK *)0x895db978)
((termdd!_SDLINK *)0x895db978) : 0x895db978 [Type: _SDLINK *]
[+0x000] pStack : 0x898b79e0 [Type: _ICA_STACK *]
[+0x004] pSdLoad : 0x8948bcf8 [Type: _SDLOAD *]
[+0x008] Links [Type: _LIST_ENTRY]
[+0x010] RefCount : 1 [Type: long]
[+0x014] SdContext [Type: _SDCONTEXT]
[+0x020] Resource [Type: _ERESOURCE]
1: kd> dx -r1 ((termdd!_ICA_STACK *)0x898b79e0)
((termdd!_ICA_STACK *)0x898b79e0) : 0x898b79e0 [Type: _ICA_STACK *]
[+0x000] Header [Type: _ICA_HEADER]
[+0x008] RefCount : 3 [Type: long]
[+0x00c] Resource [Type: _ERESOURCE]
[+0x044] StackClass : Stack_Primary (0) [Type: _STACKCLASS]
[+0x048] StackEntry [Type: _LIST_ENTRY]
[+0x050] SdLinkHead [Type: _LIST_ENTRY]
1: kd> dx -r1 (*((termdd!_LIST_ENTRY *)0x898b7a30))
(*((termdd!_LIST_ENTRY *)0x898b7a30)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x895db980 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x895db980 [Type: _LIST_ENTRY *]
0x895db980=0x895db978+[+0x008]
/*
* Initialize the SD open parameters
*/
pSdOpen->StackClass = pStack->StackClass;
pSdOpen->pStatus = &pStack->ProtocolStatus;
pSdOpen->pClient = &pStack->ClientModules;
pSdOpen->WdConfig = pStackPush->WdConfig;
pSdOpen->PdConfig = pStackPush->PdConfig;
pSdOpen->OutBufHeader = pStack->SdOutBufHeader;
pSdOpen->OutBufTrailer = pStack->SdOutBufTrailer;
pSdOpen->DeviceObject = pSdLink->pSdLoad->DeviceObject;
1: kd> p
termdd!_IcaPushStack+0xfb:
baa8e837 897308 mov dword ptr [ebx+8],esi
1: kd> r
eax=898b7be8 ebx=897fdb80 ecx=898b7a30 edx=895db978 esi=898b7a88
1: kd> dt SD_OPEN 897fdb80
RDPWD!SD_OPEN
+0x000 StackClass : 0 ( Stack_Primary )
+0x004 pStatus : 0x898b7be8 _PROTOCOLSTATUS
+0x008 pClient : 0x898b7a88 _CLIENTMODULES
+0x00c WdConfig : _WDCONFIGW
+0x138 PdConfig : _PDCONFIGW
+0x418 OEMId : [4] "???"
+0x41c WinStationRegName : [33] 0xffff
+0x460 DeviceObject : 0x895e78c8 _DEVICE_OBJECT
+0x464 OutBufHeader : 0
+0x468 OutBufTrailer : 0
+0x46c SdOutBufHeader : 0xffffffff
+0x470 SdOutBufTrailer : 0xffffffff
第九部分:
/*
* Call the SD open procedure
*/
Status = _IcaCallSd( pSdLink, SD$OPEN, pSdOpen );
/*=============================================================================
== Stack Driver interface
=============================================================================*/
/*
* Stack Driver (WD/PD/TD) APIs
*/
#define SD$OPEN 0
#define SD$CLOSE 1
#define SD$RAWWRITE 2
#define SD$CHANNELWRITE 3
#define SD$SYNCWRITE 4
#define SD$IOCTL 5
#define SD$COUNT 6
NTSTATUS
_IcaCallSd(
IN PSDLINK pSdLink,
IN ULONG ProcIndex,
IN PVOID pParms
)
{
PSDPROCEDURE pSdProcedure;
NTSTATUS Status;
/*
* If there is no procedure call table, return success.
* This should only happen during load/unload and should not be a problem.
*/
if ( pSdLink->SdContext.pProcedures == NULL )
return( STATUS_SUCCESS );
/*
* Get a pointer to the SD proc based on specified ProcIndex.
* If NULL, then this ProcIndex is not supported by this driver.
*/
pSdProcedure = ((PSDPROCEDURE *)pSdLink->SdContext.pProcedures)[ ProcIndex ];
if ( pSdProcedure == NULL )
return( STATUS_NOT_SUPPORTED );
IcaReferenceSdLink( pSdLink );
Status = (pSdProcedure)( pSdLink->SdContext.pContext, pParms );
IcaDereferenceSdLink( pSdLink );
return( Status );
}
1: kd> p
termdd!_IcaPushStack+0x16d:
baa8e8a9 e816f9ffff call termdd!_IcaCallSd (baa8e1c4)
1: kd> t
termdd!_IcaCallSd:
baa8e1c4 55 push ebp
1: kd> kc 7
#
00 termdd!_IcaCallSd
01 termdd!_IcaPushStack
02 termdd!IcaDeviceControlStack
03 termdd!IcaDeviceControl
04 termdd!IcaDispatch
05 nt!IofCallDriver
06 nt!IopSynchronousServiceTail
1: kd> p
termdd!_IcaCallSd+0x2c:
baa8e1f0 ffd7 call edi
1: kd> dv
pSdLink = 0x895db978
ProcIndex = 0
pParms = 0x897fdb80
1: kd> r
eax=00000002 ebx=897fdb80 ecx=00000000 edx=895db978 esi=895db978 edi=b9c9ca24
eip=baa8e1f0 esp=ba10467c ebp=ba10468c iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
termdd!_IcaCallSd+0x2c:
baa8e1f0 ffd7 call edi {TDTCP!TdOpen (b9c9ca24)}
第十部分:
1: kd> t
TDTCP!TdOpen:
b9c9ca24 55 push ebp
1: kd> kc 9
#
00 TDTCP!TdOpen
01 termdd!_IcaCallSd
02 termdd!_IcaPushStack
03 termdd!IcaDeviceControlStack
04 termdd!IcaDeviceControl
05 termdd!IcaDispatch
06 nt!IofCallDriver
07 nt!IopSynchronousServiceTail
08 nt!IopXxxControlFile
1: kd> dv
pTd = 0x894e7388
pSdOpen = 0x897fdb80
SdClose = struct _SD_CLOSE
1: kd> dx -r1 ((TDTCP!_TD *)0x894e7388)
((TDTCP!_TD *)0x894e7388) : 0x894e7388 [Type: _TD *]
[+0x000] pContext : 0x895db98c [Type: _SDCONTEXT *]
[+0x004] PdFlag : 0x0 [Type: unsigned long]
[+0x008] SdClass : SdNone (0) [Type: _SDCLASS]
[+0x00c] Params [Type: _PDPARAMSW]
[+0x244] pClient : 0x0 [Type: _CLIENTMODULES *]
[+0x248] pStatus : 0x0 [Type: _PROTOCOLSTATUS *]
[+0x24c] pFileObject : 0x0 [Type: _FILE_OBJECT *]
[+0x250] pDeviceObject : 0x0 [Type: _DEVICE_OBJECT *]
[+0x254] LastError : 0x0 [Type: unsigned long]
[+0x258] ReadErrorCount : 0x0 [Type: unsigned long]
[+0x25c] ReadErrorThreshold : 0x0 [Type: unsigned long]
[+0x260] WriteErrorCount : 0x0 [Type: unsigned long]
[+0x264] WriteErrorThreshold : 0x0 [Type: unsigned long]
[+0x268] ZeroByteReadCount : 0x0 [Type: unsigned long]
[+0x26c] PortNumber : 0x0 [Type: unsigned long]
[+0x270] OutBufHeader : 0x0 [Type: unsigned long]
[+0x274] OutBufTrailer : 0x0 [Type: unsigned long]
[+0x278] OutBufLength : 0x0 [Type: unsigned long]
[+0x27c] IoBusyOutBuf [Type: _LIST_ENTRY]
[+0x284] SyncWriteEvent [Type: _KEVENT]
[+0x294] pInputThread : 0x0 [Type: _KTHREAD *]
[+0x298] InBufCount : 0 [Type: long]
[+0x29c] InBufListLock : 0x0 [Type: unsigned long]
[+0x2a0] InBufBusyHead [Type: _LIST_ENTRY]
[+0x2a8] InBufDoneHead [Type: _LIST_ENTRY]
[+0x2b0] InBufHeader : 0x0 [Type: unsigned long]
[+0x2b4] InputEvent [Type: _KEVENT]
[+0x2c4 ( 0: 0)] fClosing : 0x0 [Type: unsigned long]
[+0x2c4 ( 1: 1)] fCallbackInProgress : 0x0 [Type: unsigned long]
[+0x2c4 ( 2: 2)] fSyncWriteWaiter : 0x0 [Type: unsigned long]
[+0x2c8] pPrivate : 0x0 [Type: void *]
[+0x2cc] pAfd : 0x0 [Type: void *]
[+0x2d0] WorkItemHead [Type: _LIST_ENTRY]
[+0x2d8] pSelfDeviceObject : 0x0 [Type: _DEVICE_OBJECT *]
[+0x2dc] UserBrokenReason : 0x0 [Type: unsigned long]
1: kd> dx -r1 ((TDTCP!_SD_OPEN *)0x897fdb80)
((TDTCP!_SD_OPEN *)0x897fdb80) : 0x897fdb80 [Type: _SD_OPEN *]
[+0x000] StackClass : Stack_Primary (0) [Type: _STACKCLASS]
[+0x004] pStatus : 0x898b7be8 [Type: _PROTOCOLSTATUS *]
[+0x008] pClient : 0x898b7a88 [Type: _CLIENTMODULES *]
[+0x00c] WdConfig [Type: _WDCONFIGW]
[+0x138] PdConfig [Type: _PDCONFIGW]
[+0x418] OEMId : "" [Type: char [4]]
[+0x41c] WinStationRegName [Type: unsigned short [33]]
[+0x460] DeviceObject : 0x895e78c8 : Device for "\Driver\TDTCP" [Type: _DEVICE_OBJECT *]
[+0x464] OutBufHeader : 0x0 [Type: unsigned long]
[+0x468] OutBufTrailer : 0x0 [Type: unsigned long]
[+0x46c] SdOutBufHeader : 0xffffffff [Type: unsigned long]
[+0x470] SdOutBufTrailer : 0xffffffff [Type: unsigned long]
pTd->pClient = pSdOpen->pClient;
pTd->pStatus = pSdOpen->pStatus;
pTd->PdFlag = pSdOpen->PdConfig.Create.PdFlag;
pTd->OutBufLength = pSdOpen->PdConfig.Create.OutBufLength;
pTd->PortNumber = pSdOpen->PdConfig.Create.PortNumber;
pTd->Params = pSdOpen->PdConfig.Params;
pTd->UserBrokenReason = TD_USER_BROKENREASON_UNEXPECTED;
1: kd> dv
pTd = 0x894e7388
pSdOpen = 0x897fdb80
SdClose = struct _SD_CLOSE
1: kd> dx -r1 ((TDTCP!_SD_OPEN *)0x897fdb80)
((TDTCP!_SD_OPEN *)0x897fdb80) : 0x897fdb80 [Type: _SD_OPEN *]
[+0x000] StackClass : Stack_Primary (0) [Type: _STACKCLASS]
[+0x004] pStatus : 0x898b7be8 [Type: _PROTOCOLSTATUS *]
[+0x008] pClient : 0x898b7a88 [Type: _CLIENTMODULES *]
[+0x00c] WdConfig [Type: _WDCONFIGW]
[+0x138] PdConfig [Type: _PDCONFIGW]
[+0x418] OEMId : "" [Type: char [4]]
[+0x41c] WinStationRegName [Type: unsigned short [33]]
[+0x460] DeviceObject : 0x895e78c8 : Device for "\Driver\TDTCP" [Type: _DEVICE_OBJECT *]
[+0x464] OutBufHeader : 0x0 [Type: unsigned long]
[+0x468] OutBufTrailer : 0x0 [Type: unsigned long]
[+0x46c] SdOutBufHeader : 0xffffffff [Type: unsigned long]
[+0x470] SdOutBufTrailer : 0xffffffff [Type: unsigned long]
1: kd> dx -r1 (*((TDTCP!_PDCONFIGW *)0x897fdcb8))
(*((TDTCP!_PDCONFIGW *)0x897fdcb8)) [Type: _PDCONFIGW]
[+0x000] Create [Type: _PDCONFIG2W]
[+0x0a8] Params [Type: _PDPARAMSW]
1: kd> dx -r1 (*((TDTCP!_PDCONFIG2W *)0x897fdcb8))
(*((TDTCP!_PDCONFIG2W *)0x897fdcb8)) [Type: _PDCONFIG2W]
[+0x000] PdName [Type: unsigned short [33]]
[+0x044] SdClass : SdNetwork (2) [Type: _SDCLASS]
[+0x048] PdDLL [Type: unsigned short [33]]
[+0x08c] PdFlag : 0x4e [Type: unsigned long]
[+0x090] OutBufLength : 0x212 [Type: unsigned long]
[+0x094] OutBufCount : 0x6 [Type: unsigned long]
[+0x098] OutBufDelay : 0x64 [Type: unsigned long]
[+0x09c] InteractiveDelay : 0x32 [Type: unsigned long]
[+0x0a0] PortNumber : 0xd3d [Type: unsigned long] 端口号为:3389!!!
[+0x0a4] KeepAliveTimeout : 0x0 [Type: unsigned long]
1: kd> dx -r1 (*((TDTCP!unsigned short (*)[33])0x897fdcb8))
(*((TDTCP!unsigned short (*)[33])0x897fdcb8)) [Type: unsigned short [33]]
[0] : 0x74 [Type: unsigned short]
[1] : 0x63 [Type: unsigned short]
[2] : 0x70 [Type: unsigned short]
[3] : 0x0 [Type: unsigned short]
1: kd> db 0x897fdcb8
897fdcb8 74 00 63 00 70 00 00 00-00 00 00 00 00 00 00 00 t.c.p...........
第十一部分:
1: kd> p
TDTCP!TdOpen+0x97:
b9c9cabb e8e62d0000 call TDTCP!DeviceOpen (b9c9f8a6)
1: kd> t
TDTCP!DeviceOpen:
b9c9f8a6 55 push ebp
1: kd> kc 11
#
00 TDTCP!DeviceOpen
01 TDTCP!TdOpen
02 termdd!_IcaCallSd
03 termdd!_IcaPushStack
04 termdd!IcaDeviceControlStack
05 termdd!IcaDeviceControl
06 termdd!IcaDispatch
07 nt!IofCallDriver
08 nt!IopSynchronousServiceTail
09 nt!IopXxxControlFile
0a nt!NtDeviceIoControlFile
0b nt!_KiSystemService
0c SharedUserData!SystemCallStub
0d ntdll!NtDeviceIoControlFile
0e icaapi!IcaIoControl
0f icaapi!_IcaStackIoControlWorker
10 icaapi!IcaStackIoControl
TDI(传输驱动接口)是Windows系统中用于网络通信的关键技术,其核心功能是提供网络协议的传输层支持。
在网络编程中,TCP/IP协议栈的初始化、连接建立和数据传输均依赖TDI的实现。
1: kd> p
TDTCP!TdOpen+0x105:
b9c9cb29 5b pop ebx
1: kd> p
TDTCP!TdOpen+0x106:
b9c9cb2a c9 leave
1: kd> p
TDTCP!TdOpen+0x107:
b9c9cb2b c20800 ret 8
1: kd> p
termdd!_IcaCallSd+0x2e:
baa8e1f2 56 push esi
1: kd> p
termdd!_IcaCallSd+0x2f:
baa8e1f3 8bf8 mov edi,eax
1: kd> p
termdd!_IcaCallSd+0x31:
baa8e1f5 e8b0faffff call termdd!IcaDereferenceSdLink (baa8dcaa)
1: kd> p
termdd!_IcaCallSd+0x36:
baa8e1fa 8bc7 mov eax,edi
1: kd> p
termdd!_IcaCallSd+0x38:
baa8e1fc 5f pop edi
1: kd> p
termdd!_IcaCallSd+0x39:
baa8e1fd 5e pop esi
1: kd> p
termdd!_IcaCallSd+0x3a:
baa8e1fe 5d pop ebp
1: kd> p
termdd!_IcaCallSd+0x3b:
baa8e1ff c20c00 ret 0Ch
1: kd> p
termdd!_IcaPushStack+0x172:
baa8e8ae 8bf8 mov edi,eax
1: kd> p
termdd!_IcaPushStack+0x174:
baa8e8b0 3bfe cmp edi,esi
1: kd> p
termdd!_IcaPushStack+0x176:
baa8e8b2 7d20 jge termdd!_IcaPushStack+0x198 (baa8e8d4)
1: kd> p
termdd!_IcaPushStack+0x198:
baa8e8d4 8b8b6c040000 mov ecx,dword ptr [ebx+46Ch]
1: kd> p
termdd!_IcaPushStack+0x19e:
baa8e8da 8b4508 mov eax,dword ptr [ebp+8]
1: kd> p
termdd!_IcaPushStack+0x1a1:
baa8e8dd 0188a0000000 add dword ptr [eax+0A0h],ecx
1: kd> p
termdd!_IcaPushStack+0x1a7:
baa8e8e3 8b8b70040000 mov ecx,dword ptr [ebx+470h]
1: kd> p
termdd!_IcaPushStack+0x1ad:
baa8e8e9 0188a4000000 add dword ptr [eax+0A4h],ecx
1: kd> p
termdd!_IcaPushStack+0x1b3:
baa8e8ef 8b7508 mov esi,dword ptr [ebp+8]
1: kd> p
termdd!_IcaPushStack+0x1b6:
baa8e8f2 85db test ebx,ebx
1: kd> p
termdd!_IcaPushStack+0x1b8:
baa8e8f4 7406 je termdd!_IcaPushStack+0x1c0 (baa8e8fc)
1: kd> p
termdd!_IcaPushStack+0x1ba:
baa8e8f6 53 push ebx
1: kd> p
termdd!_IcaPushStack+0x1bb:
baa8e8f7 e8bec9ffff call termdd!IcaFreePool (baa8b2ba)
1: kd> p
termdd!_IcaPushStack+0x1c0:
baa8e8fc 56 push esi
1: kd> p
termdd!_IcaPushStack+0x1c1:
baa8e8fd e8ccc5ffff call termdd!IcaUnlockStack (baa8aece)
1: kd> p
termdd!_IcaPushStack+0x1c6:
baa8e902 8bc7 mov eax,edi
1: kd> p
termdd!_IcaPushStack+0x1c8:
baa8e904 5f pop edi
1: kd> p
termdd!_IcaPushStack+0x1c9:
baa8e905 5e pop esi
1: kd> p
termdd!_IcaPushStack+0x1ca:
baa8e906 5b pop ebx
1: kd> p
termdd!_IcaPushStack+0x1cb:
baa8e907 c9 leave
1: kd> p
termdd!_IcaPushStack+0x1cc:
baa8e908 c20800 ret 8
1: kd> p
termdd!IcaDeviceControlStack+0x24f:
baa8f087 8b7508 mov esi,dword ptr [ebp+8]
memcpy(&StackPush, IrpSp->Parameters.DeviceIoControl.Type3InputBuffer,
sizeof(ICA_STACK_PUSH));
Status = _IcaPushStack( pStack, &StackPush );
break;
}