RPCRT4!OsfCreateRpcAddress函数分析之AssociationBucketMutexMemory数组的填充

news2025/4/16 14:40:59

第一部分:
1: kd> p
RPCRT4!OsfCreateRpcAddress+0x28:
001b:77c0f4f5 e888e5ffff      call    RPCRT4!OSF_ADDRESS::OSF_ADDRESS (77c0da82)
1: kd> t
RPCRT4!OSF_ADDRESS::OSF_ADDRESS:
001b:77c0da82 ??              ???
1: kd> kc
 #
00 RPCRT4!OSF_ADDRESS::OSF_ADDRESS
01 RPCRT4!OsfCreateRpcAddress
02 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
03 RPCRT4!I_RpcServerUseProtseqEp2W
04 RPCRT4!RpcServerUseProtseqEpExW
05 RPCRT4!RpcServerUseProtseqEpW
06 LSASRV!RpcpAddInterface
07 LSASRV!LsapRPCInit
08 LSASRV!LsapInitLsa
09 lsass!main
0a lsass!mainNoCRTStartup
0b kernel32!BaseProcessStart

OSF_ADDRESS::OSF_ADDRESS (
    IN TRANS_INFO  * RpcTransInfo,
    IN OUT RPC_STATUS  * Status
    ) : RPC_ADDRESS(Status)
/*++

Routine Description:

--*/
{
    RPC_CONNECTION_TRANSPORT *RpcServerInfo =
        (RPC_CONNECTION_TRANSPORT *) RpcTransInfo->InqTransInfo();
    int i;

1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!RPC_TRANSPORT_INTERFACE_HEADER *)0x77bece00)
((RPCRT4!RPC_TRANSPORT_INTERFACE_HEADER *)0x77bece00)                 : 0x77bece00 [Type: RPC_TRANSPORT_INTERFACE_HEADER *]
    [+0x000] TransInterfaceVersion : 0x2004 [Type: unsigned int]
    [+0x004] TransId          : 0xf [Type: unsigned short]
    [+0x006] TransAddrId      : 0x11 [Type: unsigned short]
    [+0x008] ProtocolSequence : 0x77bd2264 : 0x6e [Type: unsigned short *]
    [+0x00c] WellKnownEndpoint : 0x77becea8 : "\pipe\epmapper" [Type: char *]
    [+0x010] ProcessCalls     : 0x77c66ea4 [Type: long (*)(int,unsigned int *,long *,void * *,unsigned int *,void * *,void * *)]
    [+0x014] PnpNotify        : 0x77c66e6f [Type: void (*)()]
    [+0x018] PnpListen        : 0x77c66d26 [Type: void (*)()]
    [+0x01c] TowerConstruct   : 0x77c6b290 [Type: long (*)(char *,char *,char *,unsigned short *,unsigned long *,unsigned char * *)]
    [+0x020] TowerExplode     : 0x77c6b5c7 [Type: long (*)(unsigned char *,unsigned char *,unsigned long,char * *,char * *,char * *)]
    [+0x024] PostEvent        : 0x77c66be8 [Type: long (*)(unsigned long,void *)]
    [+0x028] fDatagram        : 0 [Type: int]
    [+0x02c] GetNetworkAddressVector : 0x77c71869 [Type: NETWORK_ADDRESS_VECTOR * (*)(void *)]

1: kd> dt RPC_CONNECTION_TRANSPORT 0x77bece00
RPCRT4!RPC_CONNECTION_TRANSPORT
   +0x000 TransInterfaceVersion : 0x2004
   +0x004 TransId          : 0xf
   +0x006 TransAddrId      : 0x11
   +0x008 ProtocolSequence : 0x77bd2264  -> 0x6e
   +0x00c WellKnownEndpoint : 0x77becea8  "\pipe\epmapper"
   +0x010 ProcessCalls     : 0x77c66ea4     long  RPCRT4!COMMON_ProcessCalls+0
   +0x014 PnpNotify        : 0x77c66e6f     void  RPCRT4!COMMON_StartPnpNotifications+0
   +0x018 PnpListen        : 0x77c66d26     void  RPCRT4!COMMON_ListenForPNPNotifications+0
   +0x01c TowerConstruct   : 0x77c6b290     long  RPCRT4!COMMON_TowerConstruct+0
   +0x020 TowerExplode     : 0x77c6b5c7     long  RPCRT4!COMMON_TowerExplode+0
   +0x024 PostEvent        : 0x77c66be8     long  RPCRT4!COMMON_PostRuntimeEvent+0
   +0x028 fDatagram        : 0n0
   +0x02c GetNetworkAddressVector : 0x77c71869     NETWORK_ADDRESS_VECTOR*  RPCRT4!NMP_GetNetworkAddressVector+0
   +0x030 AddressSize      : 0x70
   +0x034 ClientConnectionSize : 0x54
   +0x038 ServerConnectionSize : 0x54
   +0x03c SendContextSize  : 0x24
   +0x040 ResolverHintSize : 0
   +0x044 MaximumFragmentSize : 0x10b8
   +0x048 Initialize       : 0x77c72b3f     long  RPCRT4!NMP_Initialize+0
   +0x04c InitComplete     : (null)
   +0x050 Open             : 0x77c71fa4     long  RPCRT4!NMP_Open+0
   +0x054 SyncSendRecv     : 0x77c72703     long  RPCRT4!NMP_SyncSendRecv+0
   +0x058 SyncRecv         : 0x77c6de5b     long  RPCRT4!CO_SyncRecv+0
   +0x05c Abort            : 0x77c72a5f     long  RPCRT4!NMP_Abort+0
   +0x060 Close            : 0x77c71cb0     long  RPCRT4!NMP_Close+0
   +0x064 Send             : 0x77c6d738     long  RPCRT4!CO_Send+0
   +0x068 Recv             : 0x77c6d96a     long  RPCRT4!CO_Recv+0
   +0x06c SyncSend         : 0x77c72589     long  RPCRT4!NMP_SyncSend+0
   +0x070 TurnOnOffKeepAlives : (null)
   +0x074 Listen           : 0x77c72beb     long  RPCRT4!NMP_ServerListen+0
   +0x078 AbortListen      : 0x77c7153b     void  RPCRT4!NMP_ServerAbortListen+0
   +0x07c CompleteListen   : 0x77c66e46     void  RPCRT4!COMMON_ServerCompleteListen+0
   +0x080 QueryClientAddress : 0x77c71d52     long  RPCRT4!NMP_ConnectionQueryClientAddress+0
   +0x084 QueryLocalAddress : (null)
   +0x088 QueryClientId    : 0x77c71eb3     long  RPCRT4!NMP_ConnectionQueryClientId+0
   +0x08c QueryClientIpAddress : (null)
   +0x090 ImpersonateClient : 0x77c71cf1     long  RPCRT4!NMP_ConnectionImpersonateClient+0
   +0x094 RevertToSelf     : 0x77c7181e     long  RPCRT4!NMP_ConnectionRevertToSelf+0
   +0x098 FreeResolverHint : (null)
   +0x09c CopyResolverHint : (null)
   +0x0a0 CompareResolverHint : (null)
   +0x0a4 SetLastBufferToFree : (null)

    ObjectType = OSF_ADDRESS_TYPE;
    ActiveCallCount = 0;
    ServerListeningFlag = 0;
    ServerInfo = RpcServerInfo;
    TransInfo = RpcTransInfo;
    SetupAddressOccurred = 0;

1: kd> dt rpcrt4!OSF_ADDRESS 00b00070
   +0x000 __VFN_table : 0x77bd77cc
   +0x004 MagicLong        : 0x89abcdef
   +0x008 ObjectType       : 0n2048
   +0x00c TransInfo        : 0x00943d70 TRANS_INFO
   +0x010 Endpoint         : (null)
   +0x014 RpcProtocolSequence : (null)
   +0x018 NetworkAddress   : (null)
   +0x01c StaticEndpointFlag : 0xbaadf00d
   +0x020 ActiveCallCount  : 0n0
   +0x024 PendingQueueSize : 0xbaadf00d
   +0x028 SecurityDescriptor : 0xbaadf00d Void
   +0x02c NICFlags         : 0xbaadf00d
   +0x030 EndpointFlags    : 0xbaadf00d
   +0x034 Server           : 0xbaadf00d RPC_SERVER
   +0x038 AddressMutex     : MUTEX
   +0x050 DictKey          : 0n-1163005939
   +0x054 Associations     : [8] OSF_ASSOCIATION_DICT
   +0x134 AssociationBucketMutexMemory : [192]  ".???"
   +0x1f4 ServerInfo       : 0x77bece00 RPC_CONNECTION_TRANSPORT
   +0x1f8 SetupAddressOccurred : 0
   +0x1fc ServerListeningFlag : 0n0
   +0x200 DebugCell        : 0xbaadf00d tagDebugEndpointInfo
   +0x204 DebugCellTag     : 0n-1163005939

1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0x56:
001b:77c0dad8 8d8604020000    lea     eax,[esi+204h]
1: kd> r
eax=00943d70 ebx=00000000 ecx=00b00188 edx=77fba380 esi=00b00070 edi=77bece00
eip=77c0dad8 esp=0006fe10 ebp=0006fe1c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0x56:
001b:77c0dad8 8d8604020000    lea     eax,[esi+204h]
1: kd> dt rpcrt4!OSF_ADDRESS 00b00070
   +0x000 __VFN_table : 0x77bd77cc
   +0x004 MagicLong        : 0x89abcdef
   +0x008 ObjectType       : 0n2048
   +0x00c TransInfo        : 0x00943d70 TRANS_INFO
   +0x010 Endpoint         : (null)
   +0x014 RpcProtocolSequence : (null)
   +0x018 NetworkAddress   : (null)
   +0x01c StaticEndpointFlag : 0xbaadf00d
   +0x020 ActiveCallCount  : 0n0
   +0x024 PendingQueueSize : 0xbaadf00d
   +0x028 SecurityDescriptor : 0xbaadf00d Void
   +0x02c NICFlags         : 0xbaadf00d
   +0x030 EndpointFlags    : 0xbaadf00d
   +0x034 Server           : 0xbaadf00d RPC_SERVER
   +0x038 AddressMutex     : MUTEX
   +0x050 DictKey          : 0n-1163005939
   +0x054 Associations     : [8] OSF_ASSOCIATION_DICT
   +0x134 AssociationBucketMutexMemory : [192]  ".???"
   +0x1f4 ServerInfo       : 0x77bece00 RPC_CONNECTION_TRANSPORT
   +0x1f8 SetupAddressOccurred : 0
   +0x1fc ServerListeningFlag : 0n0
   +0x200 DebugCell        : 0xbaadf00d tagDebugEndpointInfo
   +0x204 DebugCellTag     : 0n-1163005939

第二部分:

1: kd> dt rpcrt4!NumberOfAssociationsDictionaries
NumberOfAssociationsDictionaries = 0n8


    inline MUTEX *GetAssociationBucketMutex(IN int HashIndex)
    {
        MUTEX *pMutex;
        pMutex = (MUTEX *)(&AssociationBucketMutexMemory[MutexAllocationSize * HashIndex]);
        ASSERT((((ULONG_PTR)pMutex) % 4) == 0);
        return pMutex;
    }


const int NumberOfAssociationsDictionaries = 8;
const int MutexAllocationSize = ( ((unsigned long)(sizeof(MUTEX)) + ((4)-1)) & ~(4 - 1) );

        new (GetAssociationBucketMutex(i)) MUTEX (Status,
                                                  TRUE      // pre-allocate semaphores
                                                  );

        // if there is a failure, remember it, so that subsequent successes
        // don't overwrite the failure
        if ((*Status != RPC_S_OK) && (OriginalFailureStatus == RPC_S_OK))
            {
            OriginalFailureStatus = *Status;
            }

1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xce:
001b:77c0db50 e8e73b0100      call    RPCRT4!MUTEX::CommonConstructor (77c2173c)
1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xd3:
001b:77c0db55 8b07            mov     eax,dword ptr [edi]
1: kd> r
eax=00000000 ebx=00000000 ecx=7ffde000 edx=77fba380 esi=00b00070

1: kd> dd 0xb001a4
00b001a4  000bd128 ffffffff

1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xce:
001b:77c0db50 e8e73b0100      call    RPCRT4!MUTEX::CommonConstructor (77c2173c)
1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xd3:
001b:77c0db55 8b07            mov     eax,dword ptr [edi]
1: kd> r
eax=00000000 ebx=00000000 ecx=7ffde000 edx=77fba380 esi=00b00070 edi=0006fe30


1: kd> dd 0xb001a4
00b001a4  000bd128 ffffffff 00000000 00000000
00b001b4  00000000 00000000 000bd198 ffffffff
00b001c4  00000000 00000000 00000000 00000000

    inline MUTEX *GetAssociationBucketMutex(IN int HashIndex)
    {
        MUTEX *pMutex;
        pMutex = (MUTEX *)(&AssociationBucketMutexMemory[MutexAllocationSize * HashIndex]);
        ASSERT((((ULONG_PTR)pMutex) % 4) == 0);
        return pMutex;
    }

1: kd> dd 0xb001a4
00b001a4  000bd128 ffffffff 00000000 00000000
00b001b4  00000000 00000000 000bd198 ffffffff
00b001c4  00000000 00000000 00000000 00000000
00b001d4  baadf00d baadf00d baadf00d baadf00d
00b001e4  baadf00d baadf00d baadf00d baadf00d
00b001f4  baadf00d baadf00d baadf00d baadf00d


1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xc2:
001b:77c0db44 3bc3            cmp     eax,ebx
1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xc4:
001b:77c0db46 740d            je      RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xd3 (77c0db55)
1: kd> r
eax=00b001d4 ebx=00000000 ecx=00b00070 edx=77fba380 esi=00b00070 edi=0006fe30
eip=77c0db46 esp=0006fe10 ebp=0006fe1c iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xc4:
001b:77c0db46 740d            je      RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xd3 (77c0db55) [br=0]


1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xce:
001b:77c0db50 e8e73b0100      call    RPCRT4!MUTEX::CommonConstructor (77c2173c)
1: kd> t
RPCRT4!MUTEX::CommonConstructor:
001b:77c2173c 55              push    ebp
1: kd> kc
 #
00 RPCRT4!MUTEX::CommonConstructor
01 RPCRT4!OSF_ADDRESS::OSF_ADDRESS
02 RPCRT4!OsfCreateRpcAddress
03 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
04 RPCRT4!I_RpcServerUseProtseqEp2W
05 RPCRT4!RpcServerUseProtseqEpExW
06 RPCRT4!RpcServerUseProtseqEpW
07 LSASRV!RpcpAddInterface
08 LSASRV!LsapRPCInit
09 LSASRV!LsapInitLsa
0a lsass!main
0b lsass!mainNoCRTStartup
0c kernel32!BaseProcessStart


NTSTATUS
RtlInitializeCriticalSectionAndSpinCount (
    IN PRTL_CRITICAL_SECTION CriticalSection,
    ULONG SpinCount
    )
{
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

 

    CriticalSection->LockCount = -1;
    CriticalSection->RecursionCount = 0;
    CriticalSection->OwningThread = 0;
    CriticalSection->LockSemaphore = 0;
    if ( NtCurrentPeb()->NumberOfProcessors > 1 ) {
        CriticalSection->SpinCount = SpinCount & MAX_SPIN_COUNT;
    } else {
        CriticalSection->SpinCount = 0;
    }

    ASSERT (GlobalKeyedEventHandle != NULL);

    //
    // Initialize debugging information.
    //

    DebugInfo = (PRTL_CRITICAL_SECTION_DEBUG) RtlpAllocateDebugInfo ();

    if (DebugInfo == NULL) {
        return STATUS_NO_MEMORY;
    }

    DebugInfo->Type = RTL_CRITSECT_TYPE;
    DebugInfo->ContentionCount = 0;
    DebugInfo->EntryCount = 0;

    //
    // It is important to set critical section pointers and potential
    // stack trace before we insert the resource in the process'
    // resource list because the list can be randomly traversed from
    // other threads that check for orphaned resources.
    //

    DebugInfo->CriticalSection = CriticalSection;
    CriticalSection->DebugInfo = DebugInfo;

1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!_RTL_CRITICAL_SECTION *)0xb001d4))
(*((RPCRT4!_RTL_CRITICAL_SECTION *)0xb001d4))                 [Type: _RTL_CRITICAL_SECTION]
    [+0x000] DebugInfo        : 0xbd1c0 [Type: _RTL_CRITICAL_SECTION_DEBUG *]
    [+0x004] LockCount        : -1 [Type: long]
    [+0x008] RecursionCount   : 0 [Type: long]
    [+0x00c] OwningThread     : 0x0 [Type: void *]
    [+0x010] LockSemaphore    : 0x0 [Type: void *]
    [+0x014] SpinCount        : 0x0 [Type: unsigned long]
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!_RTL_CRITICAL_SECTION_DEBUG *)0xbd1c0)
((RPCRT4!_RTL_CRITICAL_SECTION_DEBUG *)0xbd1c0)                 : 0xbd1c0 [Type: _RTL_CRITICAL_SECTION_DEBUG *]
    [+0x000] Type             : 0x0 [Type: unsigned short]
    [+0x002] CreatorBackTraceIndex : 0x0 [Type: unsigned short]
    [+0x004] CriticalSection  : 0xb001d4 [Type: _RTL_CRITICAL_SECTION *]
    [+0x008] ProcessLocksList [Type: _LIST_ENTRY]
    [+0x010] EntryCount       : 0x0 [Type: unsigned long]
    [+0x014] ContentionCount  : 0x0 [Type: unsigned long]
    [+0x018] Spare            [Type: unsigned long [2]]
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!_LIST_ENTRY *)0xbd1c8))
(*((RPCRT4!_LIST_ENTRY *)0xbd1c8))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x77fba3f8 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0xbd1a0 [Type: _LIST_ENTRY *]


1: kd> dd 0xb001a4
00b001a4  000bd128 ffffffff 00000000 00000000
00b001b4  00000000 00000000 000bd198 ffffffff
00b001c4  00000000 00000000 00000000 00000000
00b001d4  000bd1c0 ffffffff

第三部分:RPCRT4!OSF_ADDRESS::GetAssociationBucketMutex函数的作用

1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xbd:
001b:77c0db3f e861ebffff      call    RPCRT4!OSF_ADDRESS::GetAssociationBucketMutex (77c0c6a5)
1: kd> p
RPCRT4!OSF_ADDRESS::OSF_ADDRESS+0xc2:
001b:77c0db44 3bc3            cmp     eax,ebx
1: kd> r
eax=00b001ec


第四部分:ntdll!RtlInitializeCriticalSectionAndSpinCount初始化临界区和自旋锁
1: kd> t
ntdll!RtlInitializeCriticalSectionAndSpinCount:
001b:77f415d2 55              push    ebp
1: kd> kc
 #
00 ntdll!RtlInitializeCriticalSectionAndSpinCount
01 RPCRT4!MUTEX::CommonConstructor
02 RPCRT4!OSF_ADDRESS::OSF_ADDRESS
03 RPCRT4!OsfCreateRpcAddress
04 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
05 RPCRT4!I_RpcServerUseProtseqEp2W
06 RPCRT4!RpcServerUseProtseqEpExW
07 RPCRT4!RpcServerUseProtseqEpW
08 LSASRV!RpcpAddInterface
09 LSASRV!LsapRPCInit
0a LSASRV!LsapInitLsa
0b lsass!main
0c lsass!mainNoCRTStartup
0d kernel32!BaseProcessStart
1: kd> dv
 CriticalSection = 0x00b001ec
       SpinCount = 0x80000000
         ReqSize = 0x1d4
pThreadLocalData = 0x80000000
    pEventHeader = 0x00b001ec


    DebugInfo->Type = RTL_CRITSECT_TYPE;
    DebugInfo->ContentionCount = 0;
    DebugInfo->EntryCount = 0;


1: kd> p
ntdll!RtlInitializeCriticalSectionAndSpinCount+0x70:
001b:77f41642 895e10          mov     dword ptr [esi+10h],ebx
1: kd> p
ntdll!RtlInitializeCriticalSectionAndSpinCount+0x73:
001b:77f41645 897e04          mov     dword ptr [esi+4],edi
1: kd> r
eax=000bd1e8 ebx=00000000 ecx=77f2b57e edx=00080c14 esi=000bd1e8 edi=00b001ec

esi=000bd1e8


#define RTL_CRITSECT_TYPE 0
#define RTL_RESOURCE_TYPE 1

1: kd> dt RTL_CRITICAL_SECTION_DEBUG 000bd1e8
MPR!RTL_CRITICAL_SECTION_DEBUG
   +0x000 Type             : 0
   +0x002 CreatorBackTraceIndex : 8
   +0x004 CriticalSection  : 0x00080178 _RTL_CRITICAL_SECTION
   +0x008 ProcessLocksList : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x010 EntryCount       : 0
   +0x014 ContentionCount  : 0
   +0x018 Spare            : [2] 0

1: kd> dt RTL_CRITICAL_SECTION_DEBUG 000bd1e8
MPR!RTL_CRITICAL_SECTION_DEBUG
   +0x000 Type             : 0
   +0x002 CreatorBackTraceIndex : 8
   +0x004 CriticalSection  : 0x00b001ec _RTL_CRITICAL_SECTION
   +0x008 ProcessLocksList : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x010 EntryCount       : 0
   +0x014 ContentionCount  : 0
   +0x018 Spare            : [2] 0

1: kd> dt RtlCriticalSectionList
ntdll!RtlCriticalSectionList
 [ 0x77fb9a08 - 0xbd1c8 ]
   +0x000 Flink            : 0x77fb9a08 _LIST_ENTRY [ 0x77fb9a28 - 0x77fba3f8 ]
   +0x004 Blink            : 0x000bd1c8 _LIST_ENTRY [ 0x77fba3f8 - 0xbd1a0 ]

    if (CriticalSection != &RtlCriticalSectionLock) {

        RtlEnterCriticalSection(&RtlCriticalSectionLock);
        InsertTailList(&RtlCriticalSectionList, &DebugInfo->ProcessLocksList);
        RtlLeaveCriticalSection(&RtlCriticalSectionLock );

1: kd> dt RtlCriticalSectionList
ntdll!RtlCriticalSectionList
 [ 0x77fb9a08 - 0xbd1f0 ]
   +0x000 Flink            : 0x77fb9a08 _LIST_ENTRY [ 0x77fb9a28 - 0x77fba3f8 ]
   +0x004 Blink            : 0x000bd1f0 _LIST_ENTRY [ 0x77fba3f8 - 0xbd1c8 ]


1: kd> dt RTL_CRITICAL_SECTION_DEBUG 0x000bd1f0-8
MPR!RTL_CRITICAL_SECTION_DEBUG
   +0x000 Type             : 0
   +0x002 CreatorBackTraceIndex : 0
   +0x004 CriticalSection  : 0x00b001ec _RTL_CRITICAL_SECTION
   +0x008 ProcessLocksList : _LIST_ENTRY [ 0x77fba3f8 - 0xbd1c8 ]
   +0x010 EntryCount       : 0
   +0x014 ContentionCount  : 0
   +0x018 Spare            : [2] 0

1: kd> dd 0xb001a4
00b001a4  000bd128 ffffffff 00000000 00000000
00b001b4  00000000 00000000 000bd198 ffffffff
00b001c4  00000000 00000000 00000000 00000000
00b001d4  000bd1c0 ffffffff 00000000 00000000
00b001e4  00000000 00000000 000bd1e8 ffffffff
00b001f4  00000000 00000000 00000000 00000000


1: kd> dd 0xb001a4
00b001a4  000bd128 ffffffff 00000000 00000000
00b001b4  00000000 00000000 000bd198 ffffffff
00b001c4  00000000 00000000 00000000 00000000
00b001d4  000bd1c0 ffffffff 00000000 00000000
00b001e4  00000000 00000000 000bd1e8 ffffffff
00b001f4  00000000 00000000 00000000 00000000
00b00204  000bd210 ffffffff 00000000 00000000
00b00214  00000000 00000000 000bd238 ffffffff
1: kd> dd 0xb00224
00b00224  00000000 00000000 00000000 00000000
00b00234  000bd260 ffffffff 00000000 00000000
00b00244  00000000 00000000 000bd288 ffffffff
00b00254  00000000 00000000 00000000 00000000


第五部分:例子8和最终结果。

1: kd> dt MUTEX 0xb00244+8
RPCRT4!MUTEX
   +0x000 CriticalSection  : _RTL_CRITICAL_SECTION
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!_RTL_CRITICAL_SECTION *)0xb0024c))
(*((RPCRT4!_RTL_CRITICAL_SECTION *)0xb0024c))                 [Type: _RTL_CRITICAL_SECTION]
    [+0x000] DebugInfo        : 0xbd288 [Type: _RTL_CRITICAL_SECTION_DEBUG *]
    [+0x004] LockCount        : -1 [Type: long]
    [+0x008] RecursionCount   : 0 [Type: long]
    [+0x00c] OwningThread     : 0x0 [Type: void *]
    [+0x010] LockSemaphore    : 0x0 [Type: void *]
    [+0x014] SpinCount        : 0x0 [Type: unsigned long]
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!_RTL_CRITICAL_SECTION_DEBUG *)0xbd288)
((RPCRT4!_RTL_CRITICAL_SECTION_DEBUG *)0xbd288)                 : 0xbd288 [Type: _RTL_CRITICAL_SECTION_DEBUG *]
    [+0x000] Type             : 0x0 [Type: unsigned short]
    [+0x002] CreatorBackTraceIndex : 0x0 [Type: unsigned short]
    [+0x004] CriticalSection  : 0xb0024c [Type: _RTL_CRITICAL_SECTION *]
    [+0x008] ProcessLocksList [Type: _LIST_ENTRY]
    [+0x010] EntryCount       : 0x0 [Type: unsigned long]
    [+0x014] ContentionCount  : 0x0 [Type: unsigned long]
    [+0x018] Spare            [Type: unsigned long [2]]
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!_LIST_ENTRY *)0xbd290))
(*((RPCRT4!_LIST_ENTRY *)0xbd290))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x77fba3f8 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0xbd268 [Type: _LIST_ENTRY *]

1: kd> x  ntdll!RtlCriticalSectionList
77fba3f8          ntdll!RtlCriticalSectionList = struct _LIST_ENTRY [ 0x77fb9a08 - 0xbd290 ]
1: kd> dx -id 0,0,897f4020 -r1 (*((ntdll!_LIST_ENTRY *)0x77fba3f8))
(*((ntdll!_LIST_ENTRY *)0x77fba3f8))                 [Type: _LIST_ENTRY]
    [+0x000] Flink            : 0x77fb9a08 [Type: _LIST_ENTRY *]
    [+0x004] Blink            : 0xbd290 [Type: _LIST_ENTRY *]


1: kd> dt rpcrt4!OSF_ADDRESS 00b00070
   +0x000 __VFN_table : 0x77bd77cc
   +0x004 MagicLong        : 0x89abcdef
   +0x008 ObjectType       : 0n2048
   +0x00c TransInfo        : 0x00943d70 TRANS_INFO
   +0x010 Endpoint         : (null)
   +0x014 RpcProtocolSequence : (null)
   +0x018 NetworkAddress   : (null)
   +0x01c StaticEndpointFlag : 0xbaadf00d
   +0x020 ActiveCallCount  : 0n0
   +0x024 PendingQueueSize : 0xbaadf00d
   +0x028 SecurityDescriptor : 0xbaadf00d Void
   +0x02c NICFlags         : 0xbaadf00d
   +0x030 EndpointFlags    : 0xbaadf00d
   +0x034 Server           : 0xbaadf00d RPC_SERVER
   +0x038 AddressMutex     : MUTEX
   +0x050 DictKey          : 0n-1163005939
   +0x054 Associations     : [8] OSF_ASSOCIATION_DICT
   +0x134 AssociationBucketMutexMemory : [192]  "(???"
   +0x1f4 ServerInfo       : 0x77bece00 RPC_CONNECTION_TRANSPORT
   +0x1f8 SetupAddressOccurred : 0
   +0x1fc ServerListeningFlag : 0n0
   +0x200 DebugCell        : 0x00af0020 tagDebugEndpointInfo
   +0x204 DebugCellTag     : 0n0

1: kd> r
eax=00b00070 ebx=73304bd0 ecx=7ffde000 edx=77fba380 esi=00000000 edi=20000500
eip=77c0f514 esp=0006fe30 ebp=0006fe34 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
RPCRT4!OsfCreateRpcAddress+0x47:
001b:77c0f514 c9              leave
1: kd> p
RPCRT4!OsfCreateRpcAddress+0x48:
001b:77c0f515 c20400          ret     4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【BUG】Redis RDB快照持久化及写操作禁止问题排查与解决

1 问题描述 在使用Redis 的过程中,遇到如下报错,错误信息是 “MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk...”,记录下问题排查过程。 2 问题排查与解决 该错误提示表明&#…

java分页实例

引言 在现代Web应用和移动应用中,面对大量数据的展示,分页技术成为了提升用户体验和优化数据加载效率的关键手段。尤其是在MySQL数据库环境中,合理运用分页查询不仅能显著减少服务器负载,还能提升数据访问速度,为用户提…

【Linux篇】ELF文件及其加载与动态链接机制

ELF文件及其加载与动态链接机制 一. EFL文件1.1 ELF文件结构二. ELF文件形成与加载2.1 ELF形成可执行2.2 ELF控制性文件的加载2.2.1总结 三. ELF加载与进程地址空间3.1 动态链接与动态库加载3.1.1 进程如何看到动态库 3.2 全局偏移量表GOT(global offset table)3.2.…

经典算法 判断一个图中是否有环

判断一个图中是否有环 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES,不存在输出NO。 输入样例1 6 8 5 3 …

AI与深度伪造技术:如何识别和防范AI生成的假视频和假音频?

引言:深度伪造的崛起 近年来,人工智能技术迅猛发展,其中深度伪造(Deepfake) 技术尤为引人注目。这项技术利用深度学习和神经网络,可以轻松生成高度逼真的假视频和假音频,使人物的面部表情、语音…

ESP32驱动读取ADXL345三轴加速度传感器实时数据

ESP32读取ADXL345三轴加速度传感器实时数据 ADXL345三轴加速度传感器简介ADXL345模块原理图与引脚说明ESP32读取ADXL345程序实验结果 ADXL345三轴加速度传感器简介 ADXL345是一款由Analog Devices公司推出的三轴数字加速度计,分辨率高(13位),测量范围达…

【Linux】系统入门

【Linux】系统初识 起源开源 闭源版本内核内核编号 Linux的安装双系统(不推荐)WindowsLinuxvmware虚拟机vitualbox操作系统的镜像centos 7/ubuntu云服务器租用 Linux的操作lsmkdir 文件名pwdadduser userdel -rrm文件名cat /proc/cpuinfolinux支持编程vim code.c./a.out 运行程…

github配置ssh,全程CV

1)随便找一个文件夹右键进入git bash 2)验证是否已有公私钥文件 cd ~/.ssh ls如果不存在则生成然后获取 生成时一直回车 ssh-keygen -t rsa -C "xxxxxx.com" cd ~/.ssh cat id_rsa.pub如果存在则直接获取 cd ~/.ssh cat id_rsa.pub3)复制 4&#xf…

Dify简介:从架构到部署与应用解析

Dify 是一个开源的生成式 AI 应用开发平台,融合了后端即服务(Backend as a Service, BaaS)和 LLMOps 的理念,旨在帮助开发者快速搭建生产级的生成式 AI 应用。本文将详细解析 Dify 的技术架构、部署流程以及实际应用场景&#xff…

碳化硅(SiC)功率模块方案对工商业储能变流器PCS市场格局的重构

碳化硅(SiC)模块方案(如BMF240R12E2G3)对工商业储能变流器PCS市场格局产生颠覆性的重构: 2025年,SiC模块方案(如BMF240R12E2G3)凭借效率、成本和政策支持的三重优势,将重…

Redis入门(Java中操作Redis)

目录 一 基础概念 1. Redis 核心特点 2. Redis 与 MySQL 的对比 3. Redis的开启与使用 二 Redis的常用数据类型 1 基础概念 2 数据结构的特点 三 Redis基础操作命令 1 字符串操作命令 2 哈希操作命令 3 列表操作命令 4 集合操作命令 5 有序集合操作命令 6 通用命令…

算法思想之位运算(一)

欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之位运算(一) 发布时间:2025.4.12 隶属专栏:算法 目录 算法介绍六大基础位运算符常用模板总结 例题位1的个数题目链接题目描述算法思路代码实现 比特位计数题目链接题目描述算法思路…

【基于Servlet技术处理表单】

文章目录 一、实验背景与目的二、实验设计与实现思路1. 功能架构2. 核心代码实现3. 测试用例 总结 一、实验背景与目的 本次实验旨在深入理解Servlet工作原理,掌握JSP与Servlet的协同开发,实现前端表单与后端数据处理的交互。具体目标包括:设…

[OS] mmap | fd是什么 | inode机制 | vfs封装

Linux 下一切皆文件 * 统统抽象为文件,系统封装一层结构体之后,通过指针来访问 * 文章后面的 几个思考题都挺好的 * 后面涉及到的inode 机制,去年暑假的这篇文章,有详细的记录到过 【Linux】(26) 详解磁盘与文件系统:从…

STL详解 - vector的模拟实现

目录 一、整体设计 1.1 核心结构 1.2 迭代器实现 二、核心接口实现 2.1 构造函数系列 🌴默认构造 🌴迭代器范围构造 🌴元素填充构造 2.2 拷贝控制 🌵拷贝构造函数 🌵赋值运算符(现代写法&#xf…

C++第三方库【JSON】nlohman/json

文章目录 优势使用API从文件中读取json从json文本创建json对象直接创建并操作json对象字符串 <> json对象文件流 <> json对象从迭代器读取像使用STL一样的访问STL容器转化为 json数组STL容器 转 json对象自定义类型转化为 json对象 限制 优势 直观的语法&#xff…

超细的ollama下载以及本地部署deepseek项目

Ollama 是一个开源的本地化大语言模型&#xff08;LLM&#xff09;运行和部署工具&#xff0c;专注于让开发者能够快速、高效地在本地运行和管理各种开源大语言模型&#xff08;如 LLaMA、Mistral、GPT 系列等&#xff09;。它提供了一个统一的接口&#xff0c;简化了模型下载、…

【Sequelize】关联模型和孤儿记录

一、关联模型的核心机制 1. 关联类型与组合规则 • 基础四类型&#xff1a; • hasOne&#xff1a;外键存储于目标模型&#xff08;如用户档案表存储用户ID&#xff09; • belongsTo&#xff1a;外键存储于源模型&#xff08;如订单表存储用户ID&#xff09; • hasMany&…

Sentinel实战教程:流量控制与Spring Boot集成

Sentinel实战教程:流量控制与Spring Boot集成 1. Sentinel简介与核心概念 1.1 什么是Sentinel? Sentinel是阿里巴巴开源的流量控制组件,主要用于微服务架构中的流量防护。它通过限流、熔断、热点防护等机制,帮助系统在高并发场景下保持稳定运行。 1.2 核心功能与术语 流…

循环神经网络 - 扩展到图结构之递归神经网络

本文我们来学习递归神经网络(Recursive Neural Network&#xff0c;RecNN)&#xff0c;其是循环神经网络在有向无循环图上的扩展 。 递归神经网络是一类专门设计来处理具有层次结构或树形结构的数据的神经网络模型。它与更常见的循环神经网络&#xff08;Recurrent Neural Net…