Disclaimer: opisywane czynności nie są informacjami stricté technicznymi! jest to opis dokonany po własnoręcznych doświadczeniach „zabawy” z systemem. nieumiejętne korzystanie z edytora rejestru może spowodować, że uszkodzisz swój system!

Services

Kiedy zajrzy się do listy procesów systemowych okaże się, że usługi systemowe w w2k+ nie są uruchamiane jako oddzielne procesy. W zamian można zobaczyć, że działa kilka procesów o nazwie svchost. Osobom, które tego jeszcze nie zrobiły, polecam ściągnąć niezastąpione narzędzie, jakim jest Process Explorer. Można co prawda posłużyć się poleceniem 'tasklist /svc', aby uzyskać informacje o tym, który svchost przetrzymuje którą usługę… tylko po co?
Oto widok usług, obsługiwanych przez najbardziej przeciążonego svchosta – netsvcs:

svchost.jpg
Jak widać jest ich całkiem sporo. Kilkukrotnie szukałem dobrego wyjaśnienia, czemu procesy rozłożone są tak a nie inaczej, czy na prawdę wpływa to na wydajność lub chroni zasoby – i nie udało mi się póki co odpowiedzi na to pytanie znaleść. Generalnie svchost jest głównym procesem, uruchmiającym usługi w postaci DLL, co można porównać do programu master i pluginów. Tylko czemu są one rozłożone tak a nie inaczej?

Po co izolować?

Windows jaki jest, każdy widzi. Są osoby, które mając problem z windą – reinstalują ją. To najgorszy z możliwych sposobów, bo problemy są jak bumerangi. Nie dywagując nad sensownością tego rodzaju rozwiązywania problemu – jak pokazuje google svchost potrafi zdenerwować (ja miałem ponad 75o.ooo wyników), i często odpowiedzią jest – „trzeba najpierw sprawdzić, który konkretnie serwis jest przyczyną”.
W moim przypadku, do izolacji procesów pchnął mnie problem z zawieszającym się modemem GPRS. Po zawieszeniu się modemu, zwisały również procesy TapiSrv oraz RasMan. Oba te procesy znajdują się w obrębie przedstawionego powyżej svchosta, więc skillowanie czy restart wiązały się w restartem maszyny. O ile wyizolowanie nie rozwiązało ostatecznie mojej sytuacji [nawet po restarcie procesów nie mogłem się połączyć], o tyle bez restartu mogłem przywrócić serwisy do działania… nie wspominając o zabawie, jaką jest zawsze grzebanie w rejestrze i adrenalinka „rozleci sie ta winda, czy sie nie rozleci?” (;.

Izolacja – jak

Jeśli z jakiegoś powodu chciałbyś, drogi czytelniku, wyizolować którąś z usług systemowych, zapoznaj się najpierw z tym artem ze strony Microsoftu. Wyjaśni on kilka podstawowych kwestii dotyczących bohatera niniejszego textu, i ujawni dwie bardzo ważne informacje, które są clue do izolacji procesu systemowego do oddzielnego mastera. Informacje te, to dwa klucze rejestru, które pokazują gdzie będzie należało dokonać zmian:

HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionSvchost
HKEY_LOCAL_MACHINESystemCurrentControlSetServices%ServiceName%

A zmian należy dokonać w obu kluczach. Ale zanim się do tego przystąpi, proponuję oba wymienione klucze zbackupować – wystarczy je wyexportować do rega za pomocą regedita.

Po pierwsze trzeba stworzyć nowego svchosta, modyfikując pierwszy klucz:

SvcHost:
  (Default)       REG_MULTI_SZ (value not set)
  DcomLaunch      REG_MULTI_SZ  HttpFilter
  imgsvc          REG_MULTI_SZ  StiSvc
  LocalService    REG_MULTI_SZ  Alerter WebClient LmHosts RemoteRegistry upnphost SSDPSRV
  netsvcs         REG_MULTI_SZ  6to4 AppMgmt AudioSrv Browser CryptSvc DMServer 
                   DHCP ERSvc EventSystem FastUserSwitchingCompatibility HidServ Ias Iprip 
                   Irmon LanmanServer LanmanWorkstation Messenger Netman Nla Ntmssvc NWCWorkstation 
                   Nwsapagent Remoteaccess Schedule Seclogon SENS Sharedaccess SRService Themes 
                   TrkWks W32Time WZCSVC Wmi WmdmPmSp winmgmt TermService wuauserv BITS ShellHWDetection 
                   helpsvc xmlprov wscsvc WmdmPmSN Rasauto Rasman Tapisrv
  NetworkService  REG_MULTI_SZ  DnsCache
  rpcss           REG_MULTI_SZ  RpcSs
  termsvcs        REG_MULTI_SZ  TermService

Oczywistym jest, że jest to informacja jak są poprzydzielane procesy, i że niemal wszystkie usługi sieciowe zostały pchnięte do jednego procesu master, o nazwie netsvcs. Dodajmy swój własny klucz:

  Telephony       REG_MULTI_SZ  Rasauto Rasman Tapisrv Netman

Następnie wszystkie 4 wartości wymienone w nowym kluczu, należy usunąć z netsvcs.

Należy się tu chwilka wyjaśnienia – czemu akurat cztery procesy a nie jeden? Otóż jak się okazło, niektóre procesy będące w obszarze innego mastera, nie potrafiły się wzajemnie komunikować [nie wiem jak bardzo to stwierdzenie odzwierciedla rzeczywisty mechanizm, ale fakt jest iż] – jeśli wyizolowało się tylko serwis TapiSrv (telephony), to Netman, który jest odpowiedzialny m.in. za wyświetlanie dostępnych połączeń seciowych (lamersko – ikonek w „network connections”), nie wyświetlał połączeń modemowych. Trzeba zatem zatem urzyć intuicji co do powiązania między procesami, lub poszukać jakiegoś stricté technicznego dokumentu opisującego te zależności. Osobiście wątpie, aby takowy istniał [jeśli znajdziesz – sprawisz mi olbrzymią radość, podsyłając linka! (:]. Z tego też powodu, niestety, nigdy nie będzie się miało pewności, czy dokonanie izolacji nie wpłynie w jakimś stopniu na funkcjonalność systemu.

Następnie trzeba dodać gałąź o nazwie stworzonego klucza, i wpisać tam dwa klucze, dokładnie tak, jak jest to w netsvc:

  SvcHost
    netsvcs
      AuthenticationCapabilities  REG_DWORD 0x00003020 (12320)
      CoInitializeSecurityParam   REG_DWORD 0x00000001 (1)
    Telephony
      AuthenticationCapabilities  REG_DWORD 0x00003020 (12320)
      CoInitializeSecurityParam   REG_DWORD 0x00000001 (1)

… tak na prawde bardziej poprawnym, byłoby stwierdzenie „wydaje mi się, iż trzeba”. Klucz o wartości 1 (ten co-cośtam) definiuje, iż ma być brany pod uwagę ten pierwszy (auth-cośtam). Ten z kolei, jest maskowym zapisem uprawnień, jakie mają procesy z niego korzystające. Szczegółów można szukać w SDK, w kodzie bibliotek. Myślę, że nawet developerzy korzystają z API, żeby niewiedzieć takich szczegółów – i ja także nie dociekałem. Czynność wykonałem „na intuicję”.

To, co pozostało do zrobienia, to zdefiniowanie w odpowiednich kluczach, odpowiedzialnych za wymienione 4 procesy, iż powinny uruchamiać się w oddzielnym svchoście. W każdej z gałęzi:


HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRasMan
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesRasauto
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTapiSrv
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetman

znajduje się klucz o wartości:

ImagePath REG_EXPAND_SZ %SystemRoot%System32svchost.exe -k netsvcs

Nie cięzko się domyśleć, iż „netsvcs” należy zmienić na własną wartość – w opisywanym przypadku – „telephony”.

Teraz już tylko restart systemu – i voilá
svchost2.jpg

Refs

-o((:: sprEad the l0ve ::))o-