RPCRT4!OSF_CCALL::ActivateCall函数分析之RPCRT4!OSF_CCALL结构中的Bindings--RPC源代码分析
第一部分:
1: kd> t
RPCRT4!OSF_CCALL::ActivateCall:
001b:77bf5789 55 push ebp
1: kd> kc
#
00 RPCRT4!OSF_CCALL::ActivateCall
01 RPCRT4!OSF_CASSOCIATION::AllocateCCall
02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall
03 RPCRT4!OSF_BINDING_HANDLE::NegotiateTransferSyntax
04 RPCRT4!I_RpcGetBufferWithObject
05 RPCRT4!I_RpcGetBuffer
06 RPCRT4!NdrGetBuffer
07 RPCRT4!NdrClientCall2
08 ADVAPI32!LsarGetUserName
09 ADVAPI32!LsaGetUserName
0a ntdll!RtlpWaitOrTimerCallout
1: kd> dv
this = 00ce1b98
BindingHandle = 0x00ce1730
Binding = 0x00ce1fa8
AvailableBindingsList = 0x00000000
CallIdToUse = 1
InitialCallState = NeedOpenAndBind (0n0)
DispatchTable = 0x00000000
CConnection = 0x00ce1958
Status = 0n1
1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!OSF_CCALL *)0xce1b98)
((RPCRT4!OSF_CCALL *)0xce1b98) : 0xce1b98 [Type: OSF_CCALL *]
[+0x004] MagicLong : 0x89abcdef [Type: unsigned long]
[+0x008] ObjectType : 32 [Type: int]
[+0x00c] RefCount [Type: INTERLOCKED_INTEGER]
[+0x010] NestingCall : 0xbaadf00d [Type: CALL *]
[+0x014] pAsync : 0xbaadf00d [Type: _RPC_ASYNC_STATE *]
[+0x018] NotificationIssued : -1163005939 [Type: long]
[+0x01c] AsyncStatus : -1163005939 [Type: long]
[+0x020] CachedAPCInfo [Type: RPC_APC_INFO]
[+0x030] CachedAPCInfoAvailable : 1 [Type: int]
[+0x034] CallingThread : 0xbaadf00d [Type: THREAD *]
[+0x038] UuidSpecified : -1163005939 [Type: int]
[+0x03c] ObjectUuid : {BAADF00D-F00D-BAAD-0DF0-ADBA0DF0ADBA} [Type: _GUID]
[+0x04c] EEInfo : 0x0 [Type: tagExtendedErrorInfo *]
[+0x050] CurrentState : -1163005939 [Type: OSF_CCALL_STATE]
[+0x054] Connection : 0xbaadf00d [Type: OSF_CCONNECTION *]
[+0x058] BindingHandle : 0xbaadf00d [Type: OSF_BINDING_HANDLE *]
[+0x05c] CallbackLevel : 0 [Type: int]
[+0x060] Bindings [Type: OSF_CCALL::__unnamed]
[+0x068] CurrentBuffer : 0xbaadf00d [Type: void *]
[+0x06c] fDataLengthNegotiated : -1163005939 [Type: int]
[+0x070] CurrentOffset : -1163005939 [Type: int]
[+0x074] CurrentBufferLength : 0xbaadf00d [Type: unsigned long]
[+0x078] CallId : 0xbaadf00d [Type: unsigned long]
[+0x07c] RcvBufferLength : 0xbaadf00d [Type: unsigned int]
[+0x080] FirstSend : -1163005939 [Type: int]
[+0x084] DispatchTableCallback : 0xbaadf00d [Type: RPC_DISPATCH_TABLE *]
[+0x088] MaximumFragmentLength : 0xbaadf00d [Type: unsigned int]
[+0x08c] MaxSecuritySize : 0xbaadf00d [Type: unsigned int]
[+0x090] MaxDataLength : 0xbaadf00d [Type: unsigned int]
[+0x094] ProcNum : -1163005939 [Type: int]
[+0x098] ReservedForSecurity : 0x0 [Type: unsigned char *]
[+0x09c] SecBufferLength : 0x0 [Type: unsigned int]
[+0x0a0] HeaderSize : 0xbaadf00d [Type: unsigned int]
[+0x0a4] AdditionalSpaceForSecurity : 0xbaadf00d [Type: unsigned int]
[+0x0a8] SavedHeaderSize : 0x0 [Type: unsigned long]
[+0x0ac] SavedHeader : 0x0 [Type: void *]
[+0x0b0] LastBuffer : 0xbaadf00d [Type: void *]
[+0x0b4] SyncEvent [Type: EVENT]
[+0x0b8] ActualBufferLength : 0xbaadf00d [Type: unsigned int]
[+0x0bc] NeededLength : 0xbaadf00d [Type: unsigned int]
[+0x0c0] CallSendContext : 0xce1cd0 [Type: void *]
[+0x0c4] fAdvanceCallCount [Type: INTERLOCKED_INTEGER]
[+0x0c8] fPeerChoked : -1163005939 [Type: int]
[+0x0cc] Flags [Type: CompositeFlags]
[+0x0d0] fLastSendComplete : -1163005939 [Type: int]
[+0x0d4] CallMutex [Type: MUTEX]
[+0x0ec] RecursiveCallsKey : -1163005939 [Type: int]
[+0x0f0] AllocHint : 0xbaadf00d [Type: unsigned long]
[+0x0f4] CallStack : -1163005939 [Type: int]
[+0x0f8] fCallCancelled : -1163005939 [Type: int]
[+0x0fc] CancelState : -1163005939 [Type: CANCEL_STATE]
[+0x100] BufferQueue [Type: QUEUE]
[+0x12c] InReply : 0 [Type: int]
[+0x130] fChoked : -1163005939 [Type: int]
第二部分:
1: kd> dv
this = 00ce1b98
BindingHandle = 0x00ce1730
Connection = CConnection;
this->BindingHandle = BindingHandle;
第三部分:
1: kd> dv
this = 0x00ce18b4
BindingHandle = 0x00ce1730
Binding = 0x00ce1fa8
AvailableBindingsList = 0x00000000
CallIdToUse = 1
CallId = CallIdToUse;
1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!OSF_CASSOCIATION *)0xce1840)
((RPCRT4!OSF_CASSOCIATION *)0xce1840) : 0xce1840 [Type: OSF_CASSOCIATION *]
[+0x004] MagicLong : 0x89abcdef [Type: unsigned long]
[+0x008] ObjectType : 512 [Type: int]
[+0x070] CallIdCounter : 0x2 [Type: unsigned long]
第四部分:CallIdCounter是RPCRT4!OSF_CASSOCIATION结构成员
RPC_STATUS
OSF_CASSOCIATION::AllocateCCall (
IN OSF_BINDING_HANDLE *BindingHandle,
IN PRPC_MESSAGE Message,
IN CLIENT_AUTH_INFO * ClientAuthInfo,
OUT OSF_CCALL ** pCCall,
OUT BOOL *fBindingHandleReferenceRemoved
)
{
CallIdToUse = CallIdCounter++;
CurrentState = InitialCallState;
Status = Connection->AddActiveCall(
CallIdToUse,
this);
第五部分:RPCRT4!OSF_CCONNECTION结构中的ActiveCalls
1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!OSF_CCONNECTION *)0xce1958)
((RPCRT4!OSF_CCONNECTION *)0xce1958) : 0xce1958 [Type: OSF_CCONNECTION *]
[+0x004] MagicLong : 0x89abcdef [Type: unsigned long]
[+0x008] ObjectType : 128 [Type: int]
[+0x0b0] ActiveCalls [Type: OSF_CCALL_DICT2]
1: kd> dx -id 0,0,898d2250 -r1 (*((RPCRT4!OSF_CCALL_DICT2 *)0xce1a08))
(*((RPCRT4!OSF_CCALL_DICT2 *)0xce1a08)) [Type: OSF_CCALL_DICT2]
[+0x000] DictKeys : 0xce1a14 [Type: void * *]
[+0x004] DictItems : 0xce1a24 [Type: void * *]
[+0x008] cDictSlots : 0x4 [Type: unsigned int]
[+0x00c] InitialDictKeys [Type: void * [4]]
[+0x01c] InitialDictItems [Type: void * [4]]
1: kd> dx -id 0,0,898d2250 -r1 (*((RPCRT4!void * (*)[4])0xce1a14))
(*((RPCRT4!void * (*)[4])0xce1a14)) [Type: void * [4]]
[0] : 0x0 [Type: void *]
[1] : 0x0 [Type: void *]
[2] : 0x0 [Type: void *]
[3] : 0x0 [Type: void *]
1: kd> dx -id 0,0,898d2250 -r1 (*((RPCRT4!void * (*)[4])0xce1a24))
(*((RPCRT4!void * (*)[4])0xce1a24)) [Type: void * [4]]
[0] : 0x0 [Type: void *]
[1] : 0x0 [Type: void *]
[2] : 0x0 [Type: void *]
[3] : 0x0 [Type: void *]
第六部分:
Bindings.SelectedBinding = Binding;
Bindings.AvailableBindingsList = AvailableBindingsList;
1: kd> dv
this = 0x00ce18b4
BindingHandle = 0x00ce1730
Binding = 0x00ce1fa8 这里有Binding
AvailableBindingsList = 0x00000000
1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!OSF_BINDING *)0xce1fa8)
((RPCRT4!OSF_BINDING *)0xce1fa8) : 0xce1fa8 [Type: OSF_BINDING *]
[+0x000] InterfaceId [Type: _RPC_SYNTAX_IDENTIFIER]
[+0x014] TransferSyntaxInfo [Type: TRANSFER_SYNTAX_INFO_ATOM]
[+0x030] NextBinding : 0x0 [Type: MTSyntaxBinding *]
[+0x034] PresentationContext : 0 [Type: int]
[+0x038] CapabilitiesBitmap : 1 [Type: int]
[+0x03c] RefCount [Type: INTERLOCKED_INTEGER]
[+0x040] Flags [Type: CompositeFlags]
第七部分:参考
inline OSF_BINDING *
GetListOfAvaialbleBindings (
OUT BOOL *fMultipleBindingsAvailable
)
{
if (Bindings.AvailableBindingsList)
{
*fMultipleBindingsAvailable = TRUE;
return Bindings.AvailableBindingsList;
}
else
{
*fMultipleBindingsAvailable = FALSE;
return Bindings.SelectedBinding;
}
}
第八部分:
1: kd> dt osf_ccall 00ce1b98
RPCRT4!OSF_CCALL
+0x000 __VFN_table : 0x77bd3278
+0x004 MagicLong : 0x89abcdef
+0x008 ObjectType : 0n32
+0x060 Bindings : OSF_CCALL::__unnamed
1: kd> dx -id 0,0,898d2250 -r1 (*((RPCRT4!OSF_CCALL::__unnamed *)0xce1bf8))
(*((RPCRT4!OSF_CCALL::__unnamed *)0xce1bf8)) [Type: OSF_CCALL::__unnamed]
[+0x000] SelectedBinding : 0xce1fa8 [Type: OSF_BINDING *]
[+0x004] AvailableBindingsList : 0x0 [Type: OSF_BINDING *]
1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!OSF_BINDING *)0xce1fa8)
((RPCRT4!OSF_BINDING *)0xce1fa8) : 0xce1fa8 [Type: OSF_BINDING *]
[+0x000] InterfaceId [Type: _RPC_SYNTAX_IDENTIFIER]
[+0x014] TransferSyntaxInfo [Type: TRANSFER_SYNTAX_INFO_ATOM]
[+0x030] NextBinding : 0x0 [Type: MTSyntaxBinding *]
[+0x034] PresentationContext : 0 [Type: int]
[+0x038] CapabilitiesBitmap : 1 [Type: int]
[+0x03c] RefCount [Type: INTERLOCKED_INTEGER]
[+0x040] Flags [Type: CompositeFlags]
第九部分:
1: kd> dx -id 0,0,898d2250 -r1 ((RPCRT4!OSF_CCONNECTION *)0xce1958)
((RPCRT4!OSF_CCONNECTION *)0xce1958) : 0xce1958 [Type: OSF_CCONNECTION *]
[+0x004] MagicLong : 0x89abcdef [Type: unsigned long]
[+0x008] ObjectType : 128 [Type: int]
[+0x054] fExclusive : 1 [Type: int]
if (Connection->fExclusive == 0) //不成立
{
//
第十部分:最终结果
1: kd> dt osf_ccall 00ce1b98
RPCRT4!OSF_CCALL
+0x000 __VFN_table : 0x77bd3278
+0x004 MagicLong : 0x89abcdef
+0x008 ObjectType : 0n32
+0x00c RefCount : INTERLOCKED_INTEGER
+0x010 NestingCall : 0xbaadf00d CALL
+0x014 pAsync : (null)
+0x018 NotificationIssued : 0n-1163005939
+0x01c AsyncStatus : 0n-1163005939
+0x020 CachedAPCInfo : RPC_APC_INFO
+0x030 CachedAPCInfoAvailable : 0n1
+0x034 CallingThread : (null)
+0x038 UuidSpecified : 0n-1163005939
+0x03c ObjectUuid : _GUID {baadf00d-f00d-baad-0df0-adba0df0adba}
+0x04c EEInfo : (null)
+0x050 CurrentState : 0 ( NeedOpenAndBind )
+0x054 Connection : 0x00ce1958 OSF_CCONNECTION
+0x058 BindingHandle : 0x00ce1730 OSF_BINDING_HANDLE
+0x05c CallbackLevel : 0n0
+0x060 Bindings : OSF_CCALL::__unnamed
+0x068 CurrentBuffer : (null)
+0x06c fDataLengthNegotiated : 0n0
+0x070 CurrentOffset : 0n0
+0x074 CurrentBufferLength : 0xbaadf00d
+0x078 CallId : 1
+0x07c RcvBufferLength : 0
+0x080 FirstSend : 0n-1163005939
+0x084 DispatchTableCallback : (null)
+0x088 MaximumFragmentLength : 0
+0x08c MaxSecuritySize : 0
+0x090 MaxDataLength : 0
+0x094 ProcNum : 0n-1163005939
+0x098 ReservedForSecurity : (null)
+0x09c SecBufferLength : 0
+0x0a0 HeaderSize : 0
+0x0a4 AdditionalSpaceForSecurity : 0
+0x0a8 SavedHeaderSize : 0
+0x0ac SavedHeader : (null)
+0x0b0 LastBuffer : (null)
+0x0b4 SyncEvent : EVENT
+0x0b8 ActualBufferLength : 0xbaadf00d
+0x0bc NeededLength : 0
+0x0c0 CallSendContext : 0x00ce1cd0 Void
+0x0c4 fAdvanceCallCount : INTERLOCKED_INTEGER
+0x0c8 fPeerChoked : 0n0
+0x0cc Flags : CompositeFlags
+0x0d0 fLastSendComplete : 0n-1163005939
+0x0d4 CallMutex : MUTEX
+0x0ec RecursiveCallsKey : 0n-1
+0x0f0 AllocHint : 0
+0x0f4 CallStack : 0n0
+0x0f8 fCallCancelled : 0n0
+0x0fc CancelState : 0 ( CANCEL_NOTREGISTERED )
+0x100 BufferQueue : QUEUE
+0x12c InReply : 0n0
+0x130 fChoked : 0n-1163005939