smss源代码分析之smss!SmpLoadSubSystemsForMuSession函数分析加载csrss.exe
第一部分:
    Next = SmpSubSystemsToLoad.Flink;
     while ( Next != &SmpSubSystemsToLoad ) {
         p = CONTAINING_RECORD( Next,
                                SMP_REGISTRY_VALUE,
                                Entry
                              );
 #if SMP_SHOW_REGISTRY_DATA
         DbgPrint( "SMSS: Loaded SubSystem( %wZ = %wZ )\n", &p->Name, &p->Value );
 #endif
         if (!_wcsicmp( p->Name.Buffer, L"debug" )) {
             Status = SmpExecuteCommand( &p->Value, *pMuSessionId, pWindowsSubSysProcessId, SMP_SUBSYSTEM_FLAG | SMP_DEBUG_FLAG );
         }
         else {
             Status = SmpExecuteCommand( &p->Value, *pMuSessionId, pWindowsSubSysProcessId, SMP_SUBSYSTEM_FLAG );
         }
 第二部分:
 0: kd> dt _SMP_REGISTRY_VALUE 00163fd0
 smss!_SMP_REGISTRY_VALUE
    +0x000 Entry            : _LIST_ENTRY [ 0x164168 - 0x4858f618 ]
    +0x008 Name             : _UNICODE_STRING "Debug"
    +0x010 Value            : _UNICODE_STRING ""
    +0x018 AnsiValue        : 0x00164018  ""
 0: kd> x smss!SmpSubSystemsToLoad
 4858f618          smss!SmpSubSystemsToLoad = struct _LIST_ENTRY [ 0x163fd0 - 0x164168 ]
 0: kd> dx -r1 (*((smss!_LIST_ENTRY *)0x4858f618))
 (*((smss!_LIST_ENTRY *)0x4858f618))                 [Type: _LIST_ENTRY]
     [+0x000] Flink            : 0x163fd0 [Type: _LIST_ENTRY *]
     [+0x004] Blink            : 0x164168 [Type: _LIST_ENTRY *]
 0: kd> dx -r1 ((smss!_LIST_ENTRY *)0x163fd0)
 ((smss!_LIST_ENTRY *)0x163fd0)                 : 0x163fd0 [Type: _LIST_ENTRY *]
     [+0x000] Flink            : 0x164168 [Type: _LIST_ENTRY *]
     [+0x004] Blink            : 0x4858f618 [Type: _LIST_ENTRY *]
0: kd> dt _SMP_REGISTRY_VALUE 0x164168
 smss!_SMP_REGISTRY_VALUE
    +0x000 Entry            : _LIST_ENTRY [ 0x4858f618 - 0x163fd0 ]
    +0x008 Name             : _UNICODE_STRING "Windows"
    +0x010 Value            : _UNICODE_STRING "C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
    +0x018 AnsiValue        : 0x001641a0  "C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
 0: kd> x smss!SmpSubSystemsToLoad
 4858f618          smss!SmpSubSystemsToLoad = struct _LIST_ENTRY [ 0x163fd0 - 0x164168 ]
        if (!_wcsicmp( p->Name.Buffer, L"debug" )) {
             Status = SmpExecuteCommand( &p->Value, *pMuSessionId, pWindowsSubSysProcessId, SMP_SUBSYSTEM_FLAG | SMP_DEBUG_FLAG );
         }
第三部分:
0: kd> t
 Breakpoint 3 hit
 smss!SmpExecuteCommand:
 001b:4858a860 55              push    ebp
 0: kd> kc
  #
 00 smss!SmpExecuteCommand
 01 smss!SmpLoadSubSystemsForMuSession
 02 smss!SmpLoadDataFromRegistry
 03 smss!SmpInit
 04 smss!main
 05 smss!NtProcessStartup
 0: kd> dv
             CommandLine = 0x00163fe0 ""
             MuSessionId = 0
 pWindowsSubSysProcessId = 0x4858f614
                   Flags = 9
           ImageFileName = ""
        CurrentDirectory = 394 ''
               Arguments = 3266
    if (Flags & SMP_DEBUG_FLAG) {
         return( STATUS_SUCCESS );
     }
第四部分:
 0: kd> t
 Breakpoint 3 hit
 smss!SmpExecuteCommand:
 001b:4858a860 55              push    ebp
 0: kd> kc
  #
 00 smss!SmpExecuteCommand
 01 smss!SmpLoadSubSystemsForMuSession
 02 smss!SmpLoadDataFromRegistry
 03 smss!SmpInit
 04 smss!main
 05 smss!NtProcessStartup
 0: kd> dv
             CommandLine = 0x00164178 "C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
             MuSessionId = 0
 pWindowsSubSysProcessId = 0x4858f614
                   Flags = 8
           ImageFileName = ""
        CurrentDirectory = 394 ''
               Arguments = 3266
