RDPWD!ShareClass::UPSendOrders函数中的RDPWD!ShareClass::SC_FlushAndAllocPackage函数分析
RDPWD!ShareClass::UPSendOrders函数中的RDPWD!ShareClass::SC_FlushAndAllocPackage函数分析
1: kd> kc
#
00 RDPWD!ShareClass::SC_FlushAndAllocPackage
01 RDPWD!ShareClass::UPSendOrders
02 RDPWD!ShareClass::UP_SendUpdates
03 RDPWD!ShareClass::DCS_TimeToDoStuff
04 RDPWD!WD_Ioctl
05 termdd!_IcaCallSd
06 termdd!_IcaCallStack
07 termdd!IcaCallDriver
08 termdd!IcaDeviceControlVirtual
09 termdd!IcaDeviceControlChannel
0a termdd!IcaDeviceControl
0b termdd!IcaDispatch
0c nt!IofCallDriver
0d win32k!CtxDeviceIoControlFile
0e win32k!EngFileIoControl
0f RDPDD!SCH_DDOutputAvailable
10 RDPDD!DrvSetPointerShape
11 win32k!vSetPointer
12 win32k!GreSetPointer
13 win32k!zzzUpdateCursorImage
14 win32k!zzzSetCursor
15 win32k!xxxDWP_SetCursor
16 win32k!xxxRealDefWindowProc
17 win32k!xxxDefWindowProc
18 win32k!xxxDesktopWndProc
19 win32k!xxxSendMessageTimeout
1a win32k!xxxSendMessage
1b win32k!xxxMouseActivate
1c win32k!xxxScanSysQueue
1d win32k!xxxRealInternalGetMessage
1e win32k!xxxDesktopThread
1f win32k!xxxCreateSystemThreads
20 win32k!NtUserCallOneParam
21 nt!_KiSystemService
22 SharedUserData!SystemCallStub
23 winsrv!NtUserCallOneParam
1: kd> dv
this = 0xe16de018
pPkgInfo = 0xb9f43b14
trc_fn = 0xb9eac483 "???"
trc_file = 0x00000008 "--- memory read error at address 0x00000008 ---"
status = 0n774
__fnname = char [24] "SC_FlushAndAllocPackage"
1: kd> dx -r1 ((RDPWD!_tagPDU_PACKAGE_INFO *)0xb9f43b14)
((RDPWD!_tagPDU_PACKAGE_INFO *)0xb9f43b14) : 0xb9f43b14 [Type: _tagPDU_PACKAGE_INFO *]
[+0x000] cbLen : 0x1e58 [Type: unsigned int]
[+0x004] cbInUse : 0x37d [Type: unsigned int]
[+0x008] pBuffer : 0xee027020 : 0x83 [Type: unsigned char *]
[+0x00c] pOutBuf : 0x898d31b0 [Type: void *]
NTSTATUS __fastcall ShareClass::SC_FlushAndAllocPackage(PPDU_PACKAGE_INFO pPkgInfo)
{
NTSTATUS status = STATUS_SUCCESS;
DC_BEGIN_FN("SC_FlushAndAllocPackage");
if (pPkgInfo->cbLen) {
if (pPkgInfo->cbInUse) {
// Send the package contents.
if (scUseFastPathOutput)
// Send with fast-path flag.
SM_SendData(scPSMHandle, (PVOID)pPkgInfo->pOutBuf,
pPkgInfo->cbInUse, TS_HIGHPRIORITY, 0, TRUE, RNS_SEC_ENCRYPT, FALSE);
else
1: kd> t
RDPWD!SM_SendData:
b9e78370 55 push ebp
1: kd> kc 9
#
00 RDPWD!SM_SendData
01 RDPWD!ShareClass::SC_FlushAndAllocPackage
02 RDPWD!ShareClass::UPSendOrders
03 RDPWD!ShareClass::UP_SendUpdates
04 RDPWD!ShareClass::DCS_TimeToDoStuff
05 RDPWD!WD_Ioctl
06 termdd!_IcaCallSd
07 termdd!_IcaCallStack
08 termdd!IcaCallDriver
1: kd> dv
pSMHandle = 0xffffffff
pData = 0xb9f43b14
dataLen = 0x37d
priority = 1
else {
if (pRealSMHandle->encryptDisplayData) {
// S->C is encrypted
encryptHeaderLen = pRealSMHandle->encryptHeaderLen;
}
else {
sendLen = dataLen + encryptHeaderLen; 0x389 =0x37d+
}
1: kd> ?0x389-0x37d
Evaluate expression: 12 = 0000000c
1: kd> dv
pSMHandle = 0xe1a3f7c8
pData = 0x898d31b0
dataLen = 0x37d
priority = 1
channelID = 0
bFastPathOutput = 0n1
flags = 8
fForceEncrypt = 0x00 ''
pRealSMHandle = 0xe1a3f7c8
trc_fn = 0xb9ec137c "SM_SendData"
trc_file = 0xb9ec12e0 "asmapi"
pSecHeader2 = 0x897985d0
fUseSafeChecksum = 0n0
pSecHeader = 0x00000000
sendLen = 0x389
pSecHeader = (PRNS_SECURITY_HEADER)((PBYTE)pData - encryptHeaderLen);
1: kd> dt tagRNS_SECURITY_HEADER 0x898d31b0-c
RDPWD!tagRNS_SECURITY_HEADER
+0x000 flags : 0xc008
+0x002 flagsHi : 0xbd81
TRC_DATA_DBG("Data buffer before encryption", pData, dataLen);
if (pRealSMHandle->encryptionMethodSelected == SM_FIPS_ENCRYPTION_FLAG) {
rc = TSFIPS_EncryptData(
&(pRealSMHandle->FIPSData),
pData,
dataLen + pSecHeader2->padlen,
pSecHeader2->padlen,
pSecHeader2->dataSignature,
pRealSMHandle->totalEncryptCount);
}
else {
rc = EncryptData(
pRealSMHandle->encryptionLevel,
pRealSMHandle->currentEncryptKey,
&pRealSMHandle->rc4EncryptKey,
pRealSMHandle->keyLength,
pData,
dataLen,
pRealSMHandle->macSaltKey,
((PRNS_SECURITY_HEADER1)pSecHeader)->dataSignature,
fUseSafeChecksum,
pRealSMHandle->totalEncryptCount
1: kd> dt tagSM_HANDLE_DATA 0xe1a3f7c8
RDPWD!tagSM_HANDLE_DATA
+0x000 encryptionLevel : 2 +0x000 encryptionLevel : 2
+0x004 encryptionMethodsSupported : 0x1b
+0x008 encryptionMethodSelected : 2 +0x008 encryptionMethodSelected : 2
+0x00c frenchClient : 0 ''
+0x00d encryptAfterLogon : 0 ''
+0x00e encrypting : 0x1 ''
+0x00f encryptDisplayData : 0x1 ''
+0x010 encryptingLicToClient : 0x1 ''
+0x011 useSafeChecksumMethod : 0x1 ''
+0x012 bDisconnectWorkerSent : 0 ''
+0x013 dead : 0 ''
+0x014 state : 6
+0x018 nDiscardVCDataWhenDead : 0
+0x01c nDiscardPDUBadState : 0
+0x020 nDiscardNonVCPDUWhenDead : 0
+0x024 pUserData : (null)
+0x028 pWDHandle : 0xe1a3f010 tagTSHARE_WD
+0x02c pLicenseHandle : 0xee320738 Void
+0x030 userID : 0x3ea
+0x034 channelID : 0x3eb
+0x038 maxPDUSize : 0xffef
+0x03c CertType : 1 ( CERT_TYPE_PROPRIETORY )
+0x040 pEncClientRandom : (null)
+0x044 encClientRandomLen : 0
+0x048 recvdClientRandom : 0x1 ''
+0x049 bForwardDataToSC : 0x1 ''
+0x04a bSessionKeysMade : 0x1 ''
+0x04c keyLength : 0x10
+0x050 encryptCount : 0xa
+0x054 totalEncryptCount : 0xa
+0x058 encryptHeaderLen : 0xc
+0x05c encryptHeaderLenIfForceEncrypt : 0
+0x060 startEncryptKey : [16] "???" +0x060 startEncryptKey : [16] "???"
+0x070 currentEncryptKey : [16] "???"
+0x080 rc4EncryptKey : RC4_KEYSTRUCT
+0x184 decryptCount : 0xe
+0x188 totalDecryptCount : 0xe
+0x18c startDecryptKey : [16] "G???"
+0x19c currentDecryptKey : [16] "G???"
+0x1ac rc4DecryptKey : RC4_KEYSTRUCT
+0x2ae macSaltKey : [16] "???"
+0x2c0 consoleBufferList : _LIST_ENTRY [ 0xe1a3fa88 - 0xe1a3fa88 ]
+0x2c8 consoleBufferCount : 0
+0x2cc FIPSData : _SM_FIPS_Data
+0x060 startEncryptKey : [16] "???"
+0x080 rc4EncryptKey : RC4_KEYSTRUCT
1: kd> dx -id 0,0,89082020 -r1 (*((RDPWD!unsigned char (*)[16])0xe1a3f838))
(*((RDPWD!unsigned char (*)[16])0xe1a3f838)) [Type: unsigned char [16]]
[0] : 0xb9 [Type: unsigned char]
[1] : 0xa7 [Type: unsigned char]
[2] : 0x13 [Type: unsigned char]
[3] : 0xf2 [Type: unsigned char]
[4] : 0x0 [Type: unsigned char]
[5] : 0xb2 [Type: unsigned char]
[6] : 0xb0 [Type: unsigned char]
[7] : 0xeb [Type: unsigned char]
[8] : 0x64 [Type: unsigned char]
[9] : 0x88 [Type: unsigned char]
[10] : 0xdd [Type: unsigned char]
[11] : 0x5b [Type: unsigned char]
[12] : 0x89 [Type: unsigned char]
[13] : 0x34 [Type: unsigned char]
[14] : 0x51 [Type: unsigned char]
[15] : 0x19 [Type: unsigned char]
1: kd> dx -id 0,0,89082020 -r1 (*((RDPWD!RC4_KEYSTRUCT *)0xe1a3f848))
(*((RDPWD!RC4_KEYSTRUCT *)0xe1a3f848)) [Type: RC4_KEYSTRUCT]
[+0x000] S [Type: unsigned char [256]]
[+0x100] i : 0x3d [Type: unsigned char]
[+0x101] j : 0x3d [Type: unsigned char]
1: kd> dx -id 0,0,89082020 -r1 (*((RDPWD!unsigned char (*)[256])0xe1a3f848))
(*((RDPWD!unsigned char (*)[256])0xe1a3f848)) [Type: unsigned char [256]]
[0] : 0xe4 [Type: unsigned char]
[1] : 0x6a [Type: unsigned char]
[2] : 0xea [Type: unsigned char]
[3] : 0xd3 [Type: unsigned char]
[4] : 0x6e [Type: unsigned char]
[5] : 0xdb [Type: unsigned char]
[6] : 0x85 [Type: unsigned char]
[7] : 0x19 [Type: unsigned char]
[8] : 0x53 [Type: unsigned char]
/****************************************************************************/
/* Encryption levels - bit field. */
/****************************************************************************/
#define SM_40BIT_ENCRYPTION_FLAG 0x01
#define SM_128BIT_ENCRYPTION_FLAG 0x02
#define SM_56BIT_ENCRYPTION_FLAG 0x08
#define SM_FIPS_ENCRYPTION_FLAG 0x10
if (rc) {
TRC_DBG((TB, "Data encrypted"));
1: kd> p
22:27:18.890 89076524.00000000 RDP E1A3F010 SM_SendData 1199 Data encrypted
// Send it!
rc = NM_SendData(pRealSMHandle->pWDHandle->pNMInfo, (BYTE *)pSecHeader,
sendLen, priority, channelID, bFastPathOutput);
}
1: kd> t
RDPWD!NM_SendData:
b9e71540 55 push ebp
1: kd> kc 9
#
00 RDPWD!NM_SendData
01 RDPWD!SM_SendData
02 RDPWD!ShareClass::SC_FlushAndAllocPackage
03 RDPWD!ShareClass::UPSendOrders
04 RDPWD!ShareClass::UP_SendUpdates
05 RDPWD!ShareClass::DCS_TimeToDoStuff
06 RDPWD!WD_Ioctl
07 termdd!_IcaCallSd
08 termdd!_IcaCallStack
1: kd> dv
pNMHandle = 0x00000023
pData = 0x00000000 ""
dataSize = 0x389
priority = 1
userID = 0 //channelID
FastPathOutputFlags = 0xc1
trc_fn = 0x8966dfa0 " p???"
trc_file = 0x897985d0 "hp???"
pRealNMHandle = 0xb9f43a2c
__fnname = char [12] "NM_SendData"
pOutBuf = 0x00000000
MCSErr = 0n-1176038080 (No matching enumerant)
rc = 0n8
else {
// 2-byte form of length, first byte has high bit 1 and 7
// most significant bits.
dataSize += 3;
pData -= 3;
*(pData + 1) = (BYTE)(0x80 | ((dataSize & 0x7F00) >> 8));
*(pData + 2) = (BYTE)(dataSize & 0xFF);
}
1: kd> dv
Status = 0n-1175175672
SdWrite = struct _SD_RAWWRITE
pNMHandle = 0xe1a3fe30
pData = 0x898d31a5 "???"
dataSize = 0x388
priority = 1
userID = 0
FastPathOutputFlags = 0xc1
trc_fn = 0xb9ec1224 "NM_SendData"
trc_file = 0xb9ec11c0 "anmapi"
pRealNMHandle = 0xe1a3fe30
__fnname = char [12] "NM_SendData"
pOutBuf = 0x898d3018
MCSErr = MCS_NO_SUCH_CONNECTION (0n8)
rc = 0n1
1: kd> db 0x898d31a5
898d31a5 08 83 88 eb e9 ea 4a a9-fb 6a 4f 17 d7 b7 eb 24 ......J..jO....$
898d31b5 96 cf 24 ab 9b 93 e0 e2-1c b7 bd 84 ae b5 4b 43 ..$...........KC
898d31c5 e2 51 37 0f 1a 5b a5 dd-fb ed 02 23 cb fe 5c bf .Q7..[.....#..\.
898d31d5 86 75 6d 71 56 71 aa 0e-c0 2e d1 03 9f 66 bf 34 .umqVq.......f.4
898d31e5 90 fb a0 46 f7 80 5c 95-bd c9 f9 0c 97 38 dd d0 ...F..\......8..
898d31f5 47 0b 12 e2 df ea 7b f6-18 80 a2 5b f8 6e 2d 81 G.....{....[.n-.
898d3205 f0 c2 c8 9a 5c fe 22 46-30 84 46 45 44 9e 43 9c ....\."F0.FED.C.
898d3215 ff b2 d1 29 09 ee 1d a2-fa 20 9a b3 fe 06 39 52 ...)..... ....9R
dataSize = 0x388
83 88
pOutBuf = 0x898d3018
1: kd> dx -r1 ((RDPWD!_OUTBUF *)0x898d3018)
((RDPWD!_OUTBUF *)0x898d3018) : 0x898d3018 [Type: _OUTBUF *]
[+0x000] OutBufLength : 0x1e88 [Type: unsigned long]
[+0x004] PoolIndex : 4 [Type: int]
[+0x008] Links [Type: _LIST_ENTRY]
[+0x010] pBuffer : 0x898d31a4 : 0x8 [Type: unsigned char *]
[+0x014] ByteCount : 0x389 [Type: unsigned long]
[+0x018] MaxByteCount : 0x1e88 [Type: unsigned long]
[+0x01c] ThreadId : 0x0 [Type: _ETHREAD *]
[+0x020] pIrp : 0x898d3050 [Type: _IRP *]
[+0x024] pMdl : 0x898d3158 [Type: _MDL *]
[+0x028] pPrivate : 0x89076d20 [Type: void *]
[+0x02c] StartTime : 0x0 [Type: unsigned long]
[+0x030] Sequence : 0x0 [Type: unsigned char]
[+0x031] Fragment : 0x0 [Type: unsigned char]
[+0x034 ( 0: 0)] fWait : 0x1 [Type: unsigned long]
[+0x034 ( 1: 1)] fControl : 0x0 [Type: unsigned long]
[+0x034 ( 2: 2)] fRetransmit : 0x0 [Type: unsigned long]
[+0x034 ( 3: 3)] fCompress : 0x1 [Type: unsigned long]
[+0x034 ( 4: 4)] fIrpCompleted : 0x0 [Type: unsigned long]
// Set up the OutBuf with its final contents.
pOutBuf->pBuffer = pData;
pOutBuf->ByteCount = dataSize;
1: kd> dx -r1 ((RDPWD!_OUTBUF *)0x898d3018)
((RDPWD!_OUTBUF *)0x898d3018) : 0x898d3018 [Type: _OUTBUF *]
[+0x000] OutBufLength : 0x1e88 [Type: unsigned long]
[+0x004] PoolIndex : 4 [Type: int]
[+0x008] Links [Type: _LIST_ENTRY]
[+0x010] pBuffer : 0x898d31a5 : 0xc0 [Type: unsigned char *]
[+0x014] ByteCount : 0x388 [Type: unsigned long]
1: kd> db 0x898d31a5
898d31a5 c0 83 88 eb e9 ea 4a a9-fb 6a 4f 17 d7 b7 eb 24 ......J..jO....$
898d31b5 96 cf 24 ab 9b 93 e0 e2-1c b7 bd 84 ae b5 4b 43 ..$...........KC
898d31c5 e2 51 37 0f 1a 5b a5 dd-fb ed 02 23 cb fe 5c bf .Q7..[.....#..\.
898d31d5 86 75 6d 71 56 71 aa 0e-c0 2e d1 03 9f 66 bf 34 .umqVq.......f.4
898d31e5 90 fb a0 46 f7 80 5c 95-bd c9 f9 0c 97 38 dd d0 ...F..\......8..
898d31f5 47 0b 12 e2 df ea 7b f6-18 80 a2 5b f8 6e 2d 81 G.....{....[.n-.
898d3205 f0 c2 c8 9a 5c fe 22 46-30 84 46 45 44 9e 43 9c ....\."F0.FED.C.
898d3215 ff b2 d1 29 09 ee 1d a2-fa 20 9a b3 fe 06 39 52 ...)..... ....9R
dv
SdWrite = struct _SD_RAWWRITE
1: kd> dx -r1 (*((RDPWD!_SD_RAWWRITE *)0xb9f439c0))
(*((RDPWD!_SD_RAWWRITE *)0xb9f439c0)) [Type: _SD_RAWWRITE]
[+0x000] pOutBuf : 0x30 [Type: _OUTBUF *]
[+0x004] pBuffer : 0xb9e626b0 : 0x55 [Type: unsigned char *]
[+0x008] ByteCount : 0x8966dfa0 [Type: unsigned long]
// Send downward.
SdWrite.pBuffer = NULL;
SdWrite.ByteCount = 0;
SdWrite.pOutBuf = pOutBuf;
dv
SdWrite = struct _SD_RAWWRITE
1: kd> dx -r1 (*((RDPWD!_SD_RAWWRITE *)0xb9f439c0))
(*((RDPWD!_SD_RAWWRITE *)0xb9f439c0)) [Type: _SD_RAWWRITE]
[+0x000] pOutBuf : 0x898d3018 [Type: _OUTBUF *]
[+0x004] pBuffer : 0x0 [Type: unsigned char *]
[+0x008] ByteCount : 0x0 [Type: unsigned long]
Status = IcaCallNextDriver(pRealNMHandle->pWDHandle->pContext,
SD$RAWWRITE, &SdWrite);
NTSTATUS
IcaCallNextDriver(
IN PSDCONTEXT pContext,
IN ULONG ProcIndex,
IN PVOID pParms
)
{
1: kd> kc 9
#
00 termdd!_IcaCallSd
01 termdd!IcaCallNextDriver
02 RDPWD!NM_SendData
03 RDPWD!SM_SendData
04 RDPWD!ShareClass::SC_FlushAndAllocPackage
05 RDPWD!ShareClass::UPSendOrders
06 RDPWD!ShareClass::UP_SendUpdates
07 RDPWD!ShareClass::DCS_TimeToDoStuff
08 RDPWD!WD_Ioctl
1: kd> dv
pSdLink = 0x89080a00
ProcIndex = 2
pParms = 0xb9f439c0
1: kd> p
termdd!_IcaCallSd+0x26:
bac481ea ff7510 push dword ptr [ebp+10h]
1: kd> t
TDTCP!TdRawWrite:
ba0c9cd6 55 push ebp
1: kd> kc 9
#
00 TDTCP!TdRawWrite
01 termdd!_IcaCallSd
02 termdd!IcaCallNextDriver
03 RDPWD!NM_SendData
04 RDPWD!SM_SendData
05 RDPWD!ShareClass::SC_FlushAndAllocPackage
06 RDPWD!ShareClass::UPSendOrders
07 RDPWD!ShareClass::UP_SendUpdates
08 RDPWD!ShareClass::DCS_TimeToDoStuff
1: kd> dv
pTd = 0x894c7868
pSdRawWrite = 0xb9f439c0
Status = 0n-1175176768
oldIrql = 0xb9 ''
pWorkItem = 0x00000008
dv
pSdRawWrite = 0xb9f439c0
1: kd> dx -r1 ((TDTCP!_SD_RAWWRITE *)0xb9f439c0)
((TDTCP!_SD_RAWWRITE *)0xb9f439c0) : 0xb9f439c0 [Type: _SD_RAWWRITE *]
[+0x000] pOutBuf : 0x898d3018 [Type: _OUTBUF *]
[+0x004] pBuffer : 0x0 [Type: unsigned char *]
[+0x008] ByteCount : 0x0 [Type: unsigned long]
NTSTATUS TdRawWrite(PTD pTd, PSD_RAWWRITE pSdRawWrite)
{
// Call the device driver
// From this point on we must NOT free the outbuf.
// It will be free'd by the write complete routine.
Status = IoCallDriver(pTd->pDeviceObject, pOutBuf->pIrp);
if (NT_SUCCESS(Status)) {
// Update output counters
pTd->pStatus->Output.Bytes += pOutBuf->ByteCount;
pTd->pStatus->Output.Frames++;
// Insert outbuf on busy list
InsertTailList(&pTd->IoBusyOutBuf, &pOutBuf->Links);
1: kd> dx -r1 ((TDTCP!_TD *)0x894c7868)
((TDTCP!_TD *)0x894c7868) : 0x894c7868 [Type: _TD *]
[+0x000] pContext : 0x89080a14 [Type: _SDCONTEXT *]
[+0x004] PdFlag : 0x4e [Type: unsigned long]
[+0x008] SdClass : SdNetwork (2) [Type: _SDCLASS]
[+0x00c] Params [Type: _PDPARAMSW]
[+0x244] pClient : 0x890770c8 [Type: _CLIENTMODULES *]
[+0x248] pStatus : 0x89077228 [Type: _PROTOCOLSTATUS *]
[+0x24c] pFileObject : 0x89095ec8 [Type: _FILE_OBJECT *]
[+0x250] pDeviceObject : 0x894368b0 : Device for "\Driver\Tcpip" [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 : 0xd3d [Type: unsigned long]
[+0x270] OutBufHeader : 0x0 [Type: unsigned long]
[+0x274] OutBufTrailer : 0x0 [Type: unsigned long]
[+0x278] OutBufLength : 0x212 [Type: unsigned long]
[+0x27c] IoBusyOutBuf [Type: _LIST_ENTRY]
1: kd> dx -r1 (*((TDTCP!_LIST_ENTRY *)0x894c7ae4))
(*((TDTCP!_LIST_ENTRY *)0x894c7ae4)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x898d3020 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x898d3020 [Type: _LIST_ENTRY *]
1: kd> dx -r1 ((TDTCP!_SD_RAWWRITE *)0xb9f439c0)
((TDTCP!_SD_RAWWRITE *)0xb9f439c0) : 0xb9f439c0 [Type: _SD_RAWWRITE *]
[+0x000] pOutBuf : 0x898d3018 [Type: _OUTBUF *]
[+0x004] pBuffer : 0x0 [Type: unsigned char *]
[+0x008] ByteCount : 0x0 [Type: unsigned long]
1: kd> dx -r1 ((TDTCP!_OUTBUF *)0x898d3018)
((TDTCP!_OUTBUF *)0x898d3018) : 0x898d3018 [Type: _OUTBUF *]
[+0x000] OutBufLength : 0x1e88 [Type: unsigned long]
[+0x004] PoolIndex : 4 [Type: int]
[+0x008] Links [Type: _LIST_ENTRY]
[+0x010] pBuffer : 0x898d31a5 : 0xc0 [Type: unsigned char *]
[+0x014] ByteCount : 0x388 [Type: unsigned long]
[+0x018] MaxByteCount : 0x1e88 [Type: unsigned long]
[+0x01c] ThreadId : 0x0 [Type: _ETHREAD *]
[+0x020] pIrp : 0x898d3050 [Type: _IRP *]
[+0x024] pMdl : 0x898d3158 [Type: _MDL *]
[+0x028] pPrivate : 0x894c7868 [Type: void *]
[+0x02c] StartTime : 0x0 [Type: unsigned long]
[+0x030] Sequence : 0x0 [Type: unsigned char]
[+0x031] Fragment : 0x0 [Type: unsigned char]
[+0x034 ( 0: 0)] fWait : 0x1 [Type: unsigned long]
[+0x034 ( 1: 1)] fControl : 0x0 [Type: unsigned long]
[+0x034 ( 2: 2)] fRetransmit : 0x0 [Type: unsigned long]
[+0x034 ( 3: 3)] fCompress : 0x1 [Type: unsigned long]
[+0x034 ( 4: 4)] fIrpCompleted : 0x0 [Type: unsigned long]
1: kd> dx -r1 (*((TDTCP!_LIST_ENTRY *)0x898d3020))
(*((TDTCP!_LIST_ENTRY *)0x898d3020)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x894c7ae4 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x894c7ae4 [Type: _LIST_ENTRY *]
// Preallocate a completion workitem now and chain it to list of workitems.
Status = IcaAllocateWorkItem(&pWorkItem);
InsertTailList( &pTd->WorkItemHead, pWorkItem );
1: kd> dv
pTd = 0x894c7868
pSdRawWrite = 0x00000000
Status = 0n0
oldIrql = 0x00 ''
pWorkItem = 0x896a0e58 [ 0x894c7b38 - 0x894c7b38 ]
1: kd> dx -r1 ((TDTCP!_LIST_ENTRY *)0x896a0e58)
((TDTCP!_LIST_ENTRY *)0x896a0e58) : 0x896a0e58 [Type: _LIST_ENTRY *]
[+0x000] Flink : 0x894c7b38 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x894c7b38 [Type: _LIST_ENTRY *]
1: kd> dx -r1 ((TDTCP!_TD *)0x894c7868)
((TDTCP!_TD *)0x894c7868) : 0x894c7868 [Type: _TD *]
[+0x000] pContext : 0x89080a14 [Type: _SDCONTEXT *]
[+0x004] PdFlag : 0x4e [Type: unsigned long]
[+0x008] SdClass : SdNetwork (2) [Type: _SDCLASS]
[+0x00c] Params [Type: _PDPARAMSW]
[+0x244] pClient : 0x890770c8 [Type: _CLIENTMODULES *]
[+0x248] pStatus : 0x89077228 [Type: _PROTOCOLSTATUS *]
[+0x24c] pFileObject : 0x89095ec8 [Type: _FILE_OBJECT *]
[+0x250] pDeviceObject : 0x894368b0 : Device for "\Driver\Tcpip" [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 : 0xd3d [Type: unsigned long]
[+0x270] OutBufHeader : 0x0 [Type: unsigned long]
[+0x274] OutBufTrailer : 0x0 [Type: unsigned long]
[+0x278] OutBufLength : 0x212 [Type: unsigned long]
[+0x27c] IoBusyOutBuf [Type: _LIST_ENTRY]
[+0x284] SyncWriteEvent [Type: _KEVENT]
[+0x294] pInputThread : 0x896c6b20 [Type: _KTHREAD *]
[+0x298] InBufCount : 1 [Type: long]
[+0x29c] InBufListLock : 0x89076349 [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 : 0x89754e28 [Type: void *]
[+0x2d0] WorkItemHead [Type: _LIST_ENTRY] [+0x2d0] WorkItemHead [Type: _LIST_ENTRY]
[+0x2d8] pSelfDeviceObject : 0x0 [Type: _DEVICE_OBJECT *]
[+0x2dc] UserBrokenReason : 0x0 [Type: unsigned long]
1: kd> dx -r1 (*((TDTCP!_LIST_ENTRY *)0x894c7b38))
(*((TDTCP!_LIST_ENTRY *)0x894c7b38)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x896a0e58 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x896a0e58 [Type: _LIST_ENTRY *]
// Register I/O completion routine
if ( pTd->pSelfDeviceObject == NULL ) {
IoSetCompletionRoutine(pOutBuf->pIrp,
_TdWriteCompleteRoutine, pOutBuf, TRUE, TRUE,
TRUE);
1: kd> t
nt!IofCallDriver:
80a266fa 55 push ebp
1: kd> kc 9
#
00 nt!IofCallDriver
01 TDTCP!TdRawWrite
02 termdd!_IcaCallSd
03 termdd!IcaCallNextDriver
04 RDPWD!NM_SendData
05 RDPWD!SM_SendData
06 RDPWD!ShareClass::SC_FlushAndAllocPackage
07 RDPWD!ShareClass::UPSendOrders
08 RDPWD!ShareClass::UP_SendUpdates
NTSTATUS
FASTCALL
IofCallDriver(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
)
{
if (pIofCallDriver != NULL) {
//
// This routine will either jump immediately to IovCallDriver or
// IoPerfCallDriver.
//
return pIofCallDriver(DeviceObject, Irp, _ReturnAddress());
}
return IopfCallDriver(DeviceObject, Irp);
}
1: kd> r
eax=0000000f ebx=00000000 ecx=89475e90 edx=898d3050 esi=898d3050 edi=894368b0
eip=80a26758 esp=b9f43928 ebp=b9f4393c iopl=0 nv up ei ng nz ac po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000292
nt!IofCallDriver+0x5e:
80a26758 ff548138 call dword ptr [ecx+eax*4+38h] ds:0023:89475f04={tcpip!TCPDispatchInternalDeviceControl (baa030ec)}
1: kd> t
tcpip!TCPDispatchInternalDeviceControl:
baa030ec 55 push ebp
1: kd> kc 9
#
00 tcpip!TCPDispatchInternalDeviceControl
01 nt!IofCallDriver
02 TDTCP!TdRawWrite
03 termdd!_IcaCallSd
04 termdd!IcaCallNextDriver
05 RDPWD!NM_SendData
06 RDPWD!SM_SendData
07 RDPWD!ShareClass::SC_FlushAndAllocPackage
08 RDPWD!ShareClass::UPSendOrders
1: kd> dv
DeviceObject = 0x894368b0 Device for "\Driver\Tcpip"
Irp = 0x898d3050
if (PtrToUlong(irpSp->FileObject->FsContext2) == TDI_CONNECTION_FILE) {
//
// Send and receive are the performance path, so check for them
// right away.
//
if (irpSp->MinorFunction == TDI_SEND) {
return (TCPSendData(Irp, irpSp));
}
1: kd> kc 1
#
00 tcpip!TCPSendData
1: kd> kc 10
#
00 tcpip!TCPSendData
01 tcpip!TCPDispatchInternalDeviceControl
02 nt!IofCallDriver
03 TDTCP!TdRawWrite
04 termdd!_IcaCallSd
05 termdd!IcaCallNextDriver
06 RDPWD!NM_SendData
07 RDPWD!SM_SendData
08 RDPWD!ShareClass::SC_FlushAndAllocPackage
09 RDPWD!ShareClass::UPSendOrders
0a RDPWD!ShareClass::UP_SendUpdates
0b RDPWD!ShareClass::DCS_TimeToDoStuff
0c RDPWD!WD_Ioctl
0d termdd!_IcaCallSd
0e termdd!_IcaCallStack
0f termdd!IcaCallDriver
