You are on page 1of 40

Programowanie

w systemie Windows.
Wydanie IV
Autor: Johnson M. Hart
Tumaczenie: Tomasz Walczak
ISBN: 978-83-246-2780-6
Tytu oryginau: Windows System
Programming (4th Edition)
Format: 168x237, stron: 752

Wykorzystaj paralelizm i maksymalizuj wydajno w systemach


wielordzeniowych
Zapewnij przenono midzy rodowiskami 64- i 32-bitowymi
Popraw skalowalno za pomoc wtkw, pul wtkw i mechanizmu IOCP
Wybierajc system Windows jako docelow platform rozwijanych aplikacji,
programici na caym wiecie sugeruj si najczciej jego du funkcjonalnoci
i wymogami biznesowymi. System ten jest bowiem zgodny z wieloma kluczowymi
standardami. Obsuguje midzy innymi biblioteki standardowe jzykw C i C+ oraz
uwzgldnia wiele otwartych standardw wspdziaania. Dlatego gniazda systemu
Windows s standardowym interfejsem programowania rozwiza sieciowych
z dostpem do TCP/IP i innych protokow sieciowych. W dodatku kada nowa wersja
tego systemu jest coraz bardziej zintegrowana z dodatkowymi technologiami z obszaru
multimediw, sieci bezprzewodowych, usug Web Service, platformy .NET i usugi
plug-and-play. Niewtpliwym atutem Windows jest take zawsze uwaany za stabilny,
a jednak cigle wzbogacany o wane dodatki interfejs API.
Jeli zatem szukasz kompletnego, rzetelnego i aktualnego podrcznika do nauki
programowania za pomoc interfejsu Windows API, wanie go znalaze! Ksika ta
w praktyczny sposb przedstawia wszystkie mechanizmy systemu Windows potrzebne
programistom, pokazujc, w jaki sposb dziaaj funkcje tego systemu i jak wchodz
w interakcje z aplikacjami. Skoncentrowano si tu na podstawowych usugach systemu,
w tym na systemie plikw, zarzdzaniu procesami i wtkami, komunikacji midzy
procesami, programowaniu sieciowym i synchronizacji. Autor tej ksiki nie zamierza
jednak obcia Ci zbdn teori i nieistotnymi szczegami. Podaje Ci wiedz opart
na prawdziwych przykadach, dziki czemu szybko i sprawnie opanujesz poruszane tu
zagadnienia. Wiadomoci, ktre tu znajdziesz, pozwol Ci zrozumie interfejs Windows
API w takim stopniu, by zdoby solidne podstawy do rozwijania programw
na platform .NET Microsoftu.
Oto kompletny, aktualny przewodnik po programowaniu
przy uyciu interfejsu Windows API!

SPIS TRECI

Rysunki .................................................................................13
Tabele ...................................................................................15
Listingi ..................................................................................17
Przebiegi programw ...........................................................21
Wstp ....................................................................................23
O autorze ..............................................................................33
Rozdzia 1. Wprowadzenie do systemu Windows ...................................35
Podstawy systemw operacyjnych ......................................................................... 36
Ewolucja systemu Windows ...................................................................................... 37
Wersje systemu Windows .......................................................................................... 37
Pozycja systemu Windows na rynku ...................................................................... 40
System Windows, standardy i systemy o otwartym dostpie
do kodu rdowego ................................................................................................ 41
Podstawy systemu Windows .................................................................................... 43
Przenono 32- i 64-bitowego kodu rdowego ............................................ 46
Biblioteka standardowa jzyka C kiedy korzysta z niej
do przetwarzania plikw? ....................................................................................... 47
Co jest potrzebne do korzystania z tej ksiki? ................................................... 48
Przykad proste sekwencyjne kopiowanie pliku ........................................... 50
Podsumowanie .............................................................................................................. 58
wiczenia ......................................................................................................................... 61

Rozdzia 2. Korzystanie z systemu plikw i znakowych operacji


wejcia-wyjcia w systemie Windows ...................................63
Systemy plikw w systemie Windows ................................................................... 64
Reguy tworzenia nazw plikw ................................................................................. 65
Otwieranie, wczytywanie, zapisywanie i zamykanie plikw .......................... 66

SPIS

TRECI

Przerywnik Unicode i znaki oglne ................................................................... 74


Strategie zwizane z kodowaniem Unicode ........................................................ 77
Przykad przetwarzanie bdw ......................................................................... 78
Urzdzenia standardowe ............................................................................................ 81
Przykad kopiowanie wielu plikw do standardowego wyjcia .............. 82
Przykad proste szyfrowanie pliku ..................................................................... 85
Zarzdzanie plikami i katalogami ............................................................................ 88
Operacje wejcia-wyjcia konsoli ............................................................................ 94
Przykad wywietlanie danych i instrukcji ....................................................... 96
Przykad wywietlanie biecego katalogu .................................................... 99
Podsumowanie ............................................................................................................100
wiczenia .......................................................................................................................101

Rozdzia 3. Zaawansowane przetwarzanie plikw i katalogw


oraz rejestr ..........................................................................103
64-bitowy system plikw .........................................................................................104
Wskaniki do plikw ...................................................................................................104
Pobieranie rozmiaru plikw ....................................................................................109
Przykad bezporednie aktualizowanie rekordw .....................................111
Atrybuty plikw i przetwarzanie katalogw ......................................................115
Przykad wywietlanie atrybutw plikw .....................................................121
Przykad ustawianie znacznikw czasu dla plikw ....................................125
Strategie przetwarzania plikw ..............................................................................126
Blokowanie dostpu do plikw ..............................................................................128
Rejestr .............................................................................................................................134
Zarzdzanie rejestrem ...............................................................................................137
Przykad wywietlanie kluczy i zawartoci rejestru ....................................141
Podsumowanie ............................................................................................................145
wiczenia .......................................................................................................................146

Rozdzia 4. Obsuga wyjtkw ..............................................................149


Wyjtki i procedury do ich obsugi ........................................................................150
Wyjtki zmiennoprzecinkowe ................................................................................157
Bdy i wyjtki ...............................................................................................................159
Przykad traktowanie bdw jak wyjtkw .................................................161
Procedury obsugi zakoczenia .............................................................................163
Przykad stosowanie procedur obsugi zakoczenia
do poprawy jakoci programw .........................................................................167
Przykad stosowanie funkcji filtrujcej ...........................................................170
Procedury sterujce konsoli ....................................................................................175
Przykad procedura sterujca konsoli .............................................................176
Wektorowa obsuga wyjtkw ...............................................................................178
Podsumowanie ............................................................................................................180
wiczenia .......................................................................................................................181

SPIS

TRECI

Rozdzia 5. Zarzdzanie pamici, pliki odwzorowane w pamici


i biblioteki DLL ....................................................................183
Architektura zarzdzania pamici w systemie Windows ............................184
Sterty ...............................................................................................................................187
Zarzdzanie pamici na stercie ............................................................................191
Przykad sortowanie plikw
za pomoc binarnego drzewa wyszukiwa ....................................................198
Pliki odwzorowane w pamici ................................................................................203
Przykad sekwencyjne przetwarzanie pliku
za pomoc plikw odwzorowanych .................................................................212
Przykad sortowanie pliku odwzorowanego w pamici ..........................215
Przykad stosowanie wskanikw z baz ......................................................218
Biblioteki DLL ................................................................................................................224
Przykad doczanie w czasie wykonywania programu funkcji
do konwersji plikw ................................................................................................231
Punkt wejcia do biblioteki DLL .............................................................................232
Zarzdzanie wersjami bibliotek DLL .....................................................................234
Podsumowanie ............................................................................................................236
wiczenia .......................................................................................................................237

Rozdzia 6. Zarzdzanie procesem ........................................................241


Procesy i wtki w systemie Windows ...................................................................241
Tworzenie procesu .....................................................................................................244
Dane identyfikacyjne procesw .............................................................................251
Powielanie uchwytw ...............................................................................................252
Wychodzenie z procesu i koczenie jego dziaania ........................................254
Oczekiwanie na zakoczenie dziaania procesu ...............................................256
Bloki i acuchy znakw rodowiska ....................................................................258
Przykad rwnolege wyszukiwanie wzorca .................................................260
Procesy w rodowisku wieloprocesorowym ......................................................264
Czas wykonywania procesu .....................................................................................265
Przykad czas wykonywania procesu ..............................................................265
Generowanie zdarze sterujcych konsoli .........................................................267
Przykad proste zarzdzanie zadaniem ..........................................................268
Przykad korzystanie z obiektw zada .........................................................279
Podsumowanie ............................................................................................................283
wiczenia .......................................................................................................................284

Rozdzia 7. Wtki i szeregowanie ..........................................................287


Wprowadzenie do wtkw ......................................................................................287
Podstawowe informacje o wtkach ......................................................................290
Zarzdzanie wtkami .................................................................................................291
Stosowanie biblioteki jzyka C w wtkach .........................................................296
Przykad wielowtkowe wyszukiwanie wzorca ...........................................298

SPIS

TRECI

Wpyw na wydajno .................................................................................................301


Wtki gwne i robocze oraz inne modele dziaania wtkw ......................303
Przykad sortowanie przez scalanie
z wykorzystaniem wielu procesorw ................................................................304
Wprowadzenie do paralelizmu w programach ................................................311
Pami TLS ....................................................................................................................312
Priorytety oraz szeregowanie procesw i wtkw ..........................................314
Stany wtkw ...............................................................................................................317
Puapki i czsto popeniane bdy .........................................................................319
Oczekiwanie z pomiarem czasu .............................................................................321
Wkna ............................................................................................................................322
Podsumowanie ............................................................................................................325
wiczenia .......................................................................................................................326

Rozdzia 8. Synchronizowanie wtkw .................................................329


Dlaczego trzeba synchronizowa wtki? ............................................................330
Obiekty synchronizacji wtkw .............................................................................339
Obiekty CRITICAL_SECTION .....................................................................................340
Obiekty CRITICAL_SECTION
do zabezpieczania wspuytkowanych zmiennych ..................................343
Przykad prosty system z producentem i konsumentem ........................345
Muteksy ..........................................................................................................................351
Semafory ........................................................................................................................358
Zdarzenia .......................................................................................................................361
Przykad system z producentem i konsumentem ......................................364
Wicej wskazwek na temat muteksw
i obiektw CRITICAL_SECTION ............................................................................369
Inne funkcje Interlocked ...........................................................................................371
Wydajno przy zarzdzaniu pamici ................................................................373
Podsumowanie ............................................................................................................374
wiczenia .......................................................................................................................375

Rozdzia 9. Blokowanie, wydajno i dodatki w systemach NT6 ..........377


Wpyw synchronizacji na wydajno ....................................................................378
Program do badania wydajnoci ...........................................................................383
Dopracowywanie wydajnoci systemw wieloprocesorowych
za pomoc liczby powtrze ptli obiektw CS ...........................................384
Blokady SRW w systemach NT6 ..............................................................................387
Zmniejszanie rywalizacji za pomoc puli wtkw ...........................................390
Porty koczenia operacji wejcia-wyjcia ...........................................................393
Pule wtkw z systemw NT6 ................................................................................394
Podsumowanie wydajno blokowania ........................................................403
Paralelizm po raz wtry .............................................................................................404
Koligacja procesora ....................................................................................................409

SPIS

TRECI

Wskazwki i puapki z obszaru wydajnoci ........................................................411


Podsumowanie ............................................................................................................413
wiczenia .......................................................................................................................414

Rozdzia 10. Zaawansowana synchronizacja wtkw .............................417


Model zmiennej warunkowej
i waciwoci zwizane z bezpieczestwem ...................................................418
Stosowanie funkcji SignalObjectAndWait ..........................................................426
Przykad obiekt bariery z progiem ...................................................................428
Obiekt kolejki ................................................................................................................432
Przykad wykorzystanie kolejek w wieloetapowym potoku ...................436
Zmienne warunkowe z systemw Windows NT6 ............................................446
Asynchroniczne wywoania procedur ..................................................................451
Kolejkowanie asynchronicznych wywoa procedur .....................................452
Oczekiwanie z obsug alertw ..............................................................................454
Bezpieczne anulowanie wtkw ...........................................................................456
Wtki Pthreads i przenono aplikacji ................................................................457
Stosy wtkw i liczba wtkw ................................................................................457
Wskazwki z obszaru projektowania, diagnozowania i testowania ..........458
Poza interfejs Windows API .....................................................................................461
Podsumowanie ............................................................................................................462
wiczenia .......................................................................................................................463

Rozdzia 11. Komunikacja midzy procesami .........................................467


Potoki anonimowe .....................................................................................................468
Przykad przekierowywanie wejcia-wyjcia
za pomoc potoku anonimowego ....................................................................469
Potoki nazwane ...........................................................................................................472
Funkcje do obsugi transakcji z wykorzystaniem potoku nazwanego .....479
Przykad system klient-serwer do przetwarzania wiersza polece ......483
Komentarze na temat programu klient-serwer
do przetwarzania wiersza polece ....................................................................489
Szczeliny pocztowe ....................................................................................................491
Tworzenie i nazywanie potokw oraz szczelin pocztowych
i nawizywanie pocze z nimi .........................................................................496
Przykad serwer moliwy do znalezienia przez klienty .............................496
Podsumowanie ............................................................................................................499
wiczenia .......................................................................................................................500

Rozdzia 12. Programowanie sieciowe


z wykorzystaniem gniazd systemu Windows .....................503
Gniazda systemu Windows ......................................................................................504
Funkcje do obsugi gniazd serwera ......................................................................507

10

SPIS

TRECI

Funkcje do obsugi gniazd klienta ........................................................................513


Porwnanie potokw nazwanych i gniazd ........................................................515
Przykad funkcja do odbierania komunikatw w gniedzie ...................516
Przykad klient oparty na gniazdach ...............................................................517
Przykad oparty na gniazdach serwer z nowymi mechanizmami .........519
Serwery wewntrzprocesowe .................................................................................529
Komunikaty oparte na wierszach, punkty wejcia bibliotek DLL
i pami TLS ...............................................................................................................531
Przykad bezpieczna ze wzgldu na wtki biblioteka DLL
do obsugi komunikatw w gniazdach ............................................................533
Przykad inna strategia tworzenia bibliotek DLL bezpiecznych
ze wzgldu na wtki ...............................................................................................538
Datagramy .....................................................................................................................541
Gniazda Berkeley a gniazda systemu Windows ................................................543
Operacje nakadanego wejcia-wyjcia
oparte na gniazdach systemu Windows ..........................................................544
Dodatkowe funkcje gniazd systemu Windows .................................................544
Podsumowanie ............................................................................................................545
wiczenia .......................................................................................................................546

Rozdzia 13. Usugi systemu Windows ....................................................549


Tworzenie usug systemu Windows przegld .............................................550
Funkcja main() ..............................................................................................................551
Funkcje ServiceMain() ................................................................................................552
Procedura sterujca usugi ......................................................................................557
Rejestrowanie zdarze ..............................................................................................558
Przykad nakadka na usugi ..............................................................................558
Zarzdzanie usugami systemu Windows ..........................................................565
Podsumowanie dziaanie usug i zarzdzanie nimi ...................................569
Przykad powoka do sterowania usug .......................................................569
Wspuytkowanie obiektw jdra przy uyciu usugi ..................................574
Uwagi na temat diagnozowania usug ................................................................575
Podsumowanie ............................................................................................................576
wiczenia .......................................................................................................................577

Rozdzia 14. Asynchroniczne operacje wejcia-wyjcia i IOCP ................579


Przegld asynchronicznych operacji wejcia-wyjcia
w systemie Windows ..............................................................................................580
Operacje nakadanego wejcia-wyjcia ...............................................................581
Przykad synchronizacja z wykorzystaniem uchwytu pliku ....................586
Przykad przeksztacanie pliku za pomoc operacji
nakadanego wejcia-wyjcia i wielu buforw ..............................................587
Wzbogacone operacje wejcia-wyjcia z procedurami zakoczenia ........591
Przykad przeksztacanie plikw
za pomoc wzbogaconych operacji wejcia-wyjcia ..................................597

SPIS

TRECI

11

Asynchroniczne operacje wejcia-wyjcia z wykorzystaniem wtkw .....600


Zegary oczekujce ......................................................................................................602
Przykad korzystanie z zegarw oczekujcych ............................................605
Mechanizm IOCP .........................................................................................................607
Przykad serwer oparty na mechanizmie IOCP ............................................612
Podsumowanie ............................................................................................................619
wiczenia .......................................................................................................................620

Rozdzia 15. Zabezpieczanie obiektw systemu Windows .....................623


Atrybuty zabezpiecze .............................................................................................623
Przegld zabezpiecze deskryptor zabezpiecze ......................................624
Flagi kontrolne deskryptora zabezpiecze ........................................................628
Identyfikatory zabezpiecze ...................................................................................628
Zarzdzanie listami ACL ............................................................................................630
Przykad uprawnienia w stylu UNIX-a do plikw NTFS .............................632
Przykad inicjowanie atrybutw zabezpiecze ...........................................636
Wczytywanie i modyfikowanie deskryptorw zabezpiecze ......................641
Przykad odczytywanie uprawnie do pliku ................................................643
Przykad modyfikowanie uprawnie do plikw .........................................645
Zabezpieczanie obiektw jdra i komunikacji ..................................................645
Przykad zabezpieczanie procesu i jego wtkw .......................................648
Przegld dodatkowych mechanizmw zabezpiecze ...................................648
Podsumowanie ............................................................................................................650
wiczenia .......................................................................................................................651

Dodatek A Uywanie przykadowych programw ...............................655


Ukad plikw w pakiecie Przykady .......................................................................656

Dodatek B

Przenono kodu rdowego


Windows, UNIX i Linux ....................................................659
Strategie tworzenia przenonego kodu rdowego .....................................660
Usugi systemu Windows dla systemu UNIX .....................................................660
Przenono kodu rdowego z funkcjami systemu Windows .................661
Rozdziay 2. i 3. zarzdzanie plikami i katalogami ......................................667
Rozdzia 4. obsuga wyjtkw ...........................................................................672
Rozdzia 5. zarzdzanie pamici, pliki odwzorowane w pamici
i biblioteki DLL ..........................................................................................................674
Rozdzia 6. zarzdzanie procesem ...................................................................675
Rozdzia 7. wtki i szeregowanie ......................................................................677
Rozdziay od 8. do 10. synchronizowanie wtkw .....................................679
Rozdzia 11. komunikacja midzy procesami ..............................................681
Rozdzia 14. asynchroniczne operacje wejcia-wyjcia ............................684
Rozdzia 15. zabezpieczanie obiektw systemu Windows ......................685

12

SPIS

Dodatek C

TRECI

Wyniki pomiarw wydajnoci .............................................687


Konfiguracje testowe .................................................................................................687
Pomiary wydajnoci ...................................................................................................690
Przeprowadzanie testw ..........................................................................................703

Bibliografia .........................................................................705
Skorowidz ...........................................................................709

R O Z D Z I A 

1 3

USUGI SYSTEMU WINDOWS

Serwery z rozdziaw 11. i 12. to aplikacje konsolowe. W zasadzie serwery


te mog dziaa w nieskoczono i obsugiwa liczne klienty, a te nawizuj poczenie, wysyaj dania, odbieraj odpowiedzi i zrywaj poczenie. Oznacza to, e serwery te mog cigle oferowa usugi. Jednak
aby serwery byy w peni efektywne, potrzebna jest moliwo zarzdzania usugami.
Usugi systemu Windows (ang. Windows Services)1, nazywane niegdy
usugami NT, udostpniaj mechanizmy do zarzdzania potrzebne do przeksztacenia serwerw na usugi, ktre mona uruchamia na danie lub
w czasie adowania systemu przed zalogowaniem si uytkownikw. Mona
te wstrzymywa i wznawia takie usugi, jak rwnie koczy i ledzi
ich dziaanie. Informacje o usugach zawiera rejestr.
Ostatecznie wszystkie serwery, na przykad te zbudowane w rozdziaach 11. i 12., naley przeksztaci na usugi, zwaszcza jeli maj by
powszechnie stosowane przez klientw lub w organizacji.
System Windows udostpnia wiele usug. Nale do nich Klient DNS,
rne usugi SQL Server i Usugi terminalowe. Peny zestaw usug mona
wywietli za pomoc przystawki Zarzdzanie komputerem dostpnej
w Panelu sterowania.
Program JobShell (listing 6.3) z rozdziau 6. umoliwia uproszczone
zarzdzanie serwerem. Pozwala uruchomi serwer pod kontrol zadania
i wysa sygna zakoczenia pracy. Usugi systemu Windows s jednak
duo bardziej kompletne i niezawodne. Podstawowym przykadem w tym
rozdziale jest zmodyfikowana wersja programu JobShell umoliwiajca kontrolowanie takich usug.
1

Ta terminologia bywa mylca, poniewa system Windows udostpnia wiele usug, ktre
nie s opisanymi tu usugami systemu Windows. Znaczenie powinno wynika z kontekstu
(podobnie zrozumienie pojcia system Windows przy omawianiu interfejsu API nie sprawiao problemu).

549

550

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

W tym rozdziale pokazano te, jak przeksztaci istniejc aplikacj konsolow w usug systemu Windows, a take jak instalowa , obserwowa
i kontrolowa usugi. Znajduje si tu take omwienie rejestrowania zdarze
(mechanizm ten umoliwia usudze zapis wykonanych operacji w pliku).

Tworzenie usug systemu Windows przegld


Usugi systemu Windows dziaaj pod kontrol menedera SCM (ang. Service Control Manager). Narzdzie to mona wykorzysta do sterowania
usugami na trzy sposoby:
1. Przez uycie przystawki administracyjnej Usugi (Panel sterowania/
System i konserwacja/Narzdzia administracyjne).
2. Za pomoc narzdzia sc.exe obsugiwanego z poziomu wiersza
polece.
3. Przez programistyczne kontrolowanie menedera SCM, co ilustruje
listing 13.3.
Przeksztacenie aplikacji konsolowej (takiej jak serverNP lub serverSK)
na usug systemu Windows wymaga wykonania trzech podstawowych
krokw w celu umieszczenia programu pod kontrol menedera SCM.
1. Naley utworzy nowy punkt wejcia w postaci funkcji main()
i zarejestrowa w nim usug w menederze SCM przez podanie
logicznych punktw wejcia i nazwy usugi.
2. Trzeba przeksztaci dawny punkt wejcia w postaci funkcji main()
na funkcj ServiceMain(), ktra rejestruje procedur sterujc
usugi i informuje meneder SCM o jej stanie. Pozostay kod programu moe pozosta taki sam, cho mona doda polecenia do rejestrowania zdarze. Zamiast nazwy ServiceMain() naley poda
nazw logicznej usugi. W procesie moe dziaa jedna lub kilka
takich usug.
3. Naley napisa procedur sterujc usugi reagujc na polecenia
od menedera SCM.
W tych trzech punktach wspomniano kilkakrotnie o tworzeniu, uruchamianiu i kontrolowaniu usug. W nastpnych podrozdziaach opisano
szczegy tych operacji, a rysunek 13.1 w dalszej czci rozdziau ilustruje
wspdziaanie rnych komponentw.

FUNKCJA

MAIN()

551

Funkcja main()
Nowa funkcja main() wywoywana przez meneder SCM ma za zadanie
rejestrowa usug w menederze i uruchamia program rozdzielajcy do
sterowania usug. Wymaga to wywoania funkcji StartServiceCtrl
Dispatcher z nazwami i punktami wejcia usug logicznych.
BOOL StartServiceCtrlDispatcher (
SERVICE_TABLE_ENTRY *lpServiceStartTable)

Jedyny parametr, lpServiceStartTable, to adres tablicy z elementami SERVICE_TABLE_ENTRY. Kady taki element to nazwa i punkt wejcia usugi logicznej. Kocem tablicy jest para elementw NULL.
Funkcja zwraca warto TRUE, jeli rejestracja zakoczya si powodzeniem.
Gwny wtek procesu usugi wywoujcego funkcj StartService
CtrlDispatcher nawizuje poczenie z menederem SCM. Meneder
ten rejestruje usug (lub usugi), przy czym wtek wywoujcy suy jako
program rozdzielajcy do sterowania usug. Meneder SCM nie zwraca
sterowania do wtku wywoujcego do czasu zakoczenia pracy przez
wszystkie usugi. Warto zauway , e usugi logiczne nie rozpoczynaj
dziaania od razu. Uruchomienie usugi wymaga wywoania opisanej dalej
funkcji StartService.
Listing 13.1 przedstawia typowy program gwny usugi z jedn usug
logiczn.
Listing 13.1. Funkcja main gwny punkt wejcia usugi
#include "Everything.h"
void WINAPI ServiceMain (DWORD argc, LPTSTR argv[]);
static LPTSTR serviceName = _T("SocketCommandLineService");
/* Gwna procedura uruchamiajca program rozdzielajcy do sterowania usug. */
VOID _tmain (int argc, LPTSTR argv[])
{
SERVICE_TABLE_ENTRY dispatchTable[] =
{
{ serviceName, ServiceMain },
{ NULL, NULL }
};

552

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

if (!StartServiceCtrlDispatcher (dispatchTable))
ReportError (_T("Nie mozna uruchomic programu
rozdzielajacego."), 1, TRUE);
/* Funkcja ServiceMain() zadziaa po uruchomieniu jej przez meneder SCM. */
/* Sterowanie jest zwracane do tego miejsca dopiero po zamkniciu wszystkich usug. */
return;
}

Funkcje ServiceMain()
Tablica przydziau okrela funkcje, jak pokazano to na listingu 13.1, a kada
z nich reprezentuje usug logiczn. Funkcje te to wzbogacone wersje
podstawowego programu przeksztaconego na usug, a meneder SCM
wywouje kad usug logiczn w osobnym wtku. Usuga logiczna moe
z kolei uruchomi dodatkowe wtki, takie jak wtki robocze serwera generowane przez programy serverSK i serverNP. Czsto usuga systemu Windows obejmuje tylko jedn usug logiczn. Na listingu 13.2 usuga logiczna
to zmodyfikowana wersja gwnego serwera (listing 12.2). W jednej usudze
systemu Windows mona uruchomi usugi logiczne oparte na gniazdach
i potokach nazwanych. Wtedy naley udostpni dwie funkcje gwne
usugi.
Cho funkcja ServiceMain() jest oparta na funkcji main() oraz ma
parametry z liczb i acuchem argumentw, warto zwrci uwag na jedn
ma rnic. Funkcj t naley zadeklarowa jako void WINAPI. Nie
powinna ona zwraca wartoci typu int, jak robi to zwyka funkcja main().

Rejestrowanie procedury sterujcej usugi


Procedura sterujca usugi wywoywana przez meneder SCM musi mie
moliwo kontrolowania powizanej z ni usugi logicznej. Procedura
sterujca konsoli z programu serverSK ustawia globaln flag zamknicia
i ilustruje (cho na uproszczonym przykadzie), jak powinna wyglda taka
procedura. Jednak kada usuga logiczna musi przede wszystkim natychmiast zarejestrowa procedur za pomoc funkcji RegisterServiceCtrl
HandlerEx. Funkcj t naley wywoa na pocztku funkcji Service
Main() i nie uruchamia jej w dalszej czci programu. Meneder
SCM po otrzymaniu dania sterujcego od usugi wywouje omawian
procedur.

FUNKCJE SERVICEMAIN()

553

SERVICE_STATUS_HANDLE
RegisterServiceCtrlHandlerEx (
LPCTSTR lpServiceName,
LPHANDLER_FUNCTION_EX lpHandlerProc,
LPVOID lpContext)

Parametry
Parametr lpServiceName to podana przez uytkownika nazwa usugi
umieszczona we wpisie dotyczcym danej usugi logicznej w tablicy usug.
Nazwa ta powinna odpowiada nazwie funkcji ServiceMain zarejestrowanej za pomoc funkcji StartServiceCtrlDispatcher.
Parametr lpHandlerProc to adres rozbudowanej procedury obsugi
opisanej w dalszym podrozdziale.
Parametr lpContext to zdefiniowane przez uytkownika dane przekazane do procedury sterujcej. Umoliwiaj one jednej procedurze sterujcej rozrnianie wielu korzystajcych z niej usug.
Jeli wystpi bd, zwracana warto (obiekt typu SERVICE_STATUS_
HANDLE) to 0. Do zbadania bdw naley zastosowa standardowe
metody.

Ustawianie stanu usugi


Po zarejestrowaniu procedury obsugi nastpne zadanie polega na ustawieniu stanu usugi na warto SERVICE_START_PENDING. Umoliwia to
funkcja SetServiceStatus. Posuy ona jeszcze w kilku innych miejscach
do ustawiania rnych wartoci w celu poinformowania menedera SCM
o obecnym stanie usugi. W jednym z dalszych podrozdziaw i w tabeli 13.3
opisano inne obok SERVICE_START_PENDING prawidowe wartoci stanu.
Procedura sterujca usugi musi ustawi stan przy kadym wywoaniu, nawet jeli stan ten si nie zmieni.
Ponadto kady wtek usugi moe w dowolnym momencie wywoa
funkcj SetServiceStatus, aby przekaza informacje o postpie w pracy
programu, bdach i inne. Usugi czsto korzystaj z odrbnego wtku do
okresowego aktualizowania stanu. Odstp midzy aktualizacjami jest okrelony w skadowej w parametrze ze struktur danych. Meneder SCM
moe uzna , e wystpi bd, jeli aktualizacja stanu nie nastpi w podanym czasie.

554

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

BOOL SetServiceStatus (
SERVICE_STATUS_HANDLE hServiceStatus,
LPSERVICE_STATUS lpServiceStatus)

Parametry
Parametr hServiceStatus to warto typu SERVICE_STATUS_HANDLE
zwrcona przez funkcj RegisterServiceCtrlHandlerEx (dlatego
naley j wywoa przed funkcj SetServiceStatus).
Parametr lpServiceStatus wskazuje struktur SERVICE_STATUS.
Opisuje ona waciwoci, stan i moliwoci usugi.

Struktura SERVICE_STATUS
Oto definicja struktury SERVICE_STATUS:
typedef struct _SERVICE_STATUS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;

Parametry
Parametr dwWin32ExitCode to normalny kod wyjcia wtku usugi logicznej. Usuga musi ustawi ten kod na warto NO_ERROR w czasie dziaania i przy standardowym koczeniu pracy. Mimo nazwy parametru mona
go uywa take w aplikacjach 64-bitowych. Czon 32 pojawia si te
w innych nazwach.
Parametr dwServiceSpecificExitCode mona wykorzysta do zasygnalizowania bdu w czasie uruchamiania lub zatrzymywania usugi, jednak
warto ta zostanie zignorowana, jeli parametr dwWin32ExitCode ma
warto rn od ERROR_SERVICE_SPECIFIC_ERROR.
Usuga powinna okresowo zwiksza warto parametru dwCheckPoint,
aby informowa o przechodzeniu przez wszystkie etapy pracy, w tym ini-

FUNKCJE SERVICEMAIN()

555

cjowanie i zamykanie usugi. Ta warto jest niewana i powinna wynosi 0,


jeli usuga nie ma do wykonania operacji uruchomienia, zatrzymania,
wstrzymania lub kontynuowania.
Parametr dwWaitHint to czas w milisekundach midzy wywoaniami
funkcji SetServiceStatus w celu zwikszenia wartoci parametru
dwCheckPoint lub zmiany wartoci parametru dwCurrentState. Jak
wczeniej wspomniano, jeli ten czas upynie bez wywoania funkcji Set
ServiceStatus, meneder SCM moe uzna , e wystpi bd.
Pozostae skadowe struktury SERVICE_STATUS opisano w osobnych
punktach.

Typ usugi (dwServiceType)


Parametr dwServiceType musi mie jedn z wartoci opisanych w tabeli 13.1.
Tabela 13.1. Typy usug
Warto

Znaczenie

SERVICE_WIN32_OWN_PROCESS

Sygnalizuje, e usuga systemu Windows dziaa we


wasnym procesie ze swoimi zasobami. Warto t
wykorzystano na listingu 13.2.

SERVICE_WIN32_SHARE_PROCESS

Okrela usug systemu Windows wspuytkujc


proces z innymi usugami. Powoduje to poczenie
kilku usug w jednym procesie, co pozwala
zmniejszy potrzebn ilo zasobw.

SERVICE_KERNEL_DRIVER

Okrela sterownik urzdzenia systemu Windows


i jest zarezerwowana do uytku przez system.

SERVICE_FILE_SYSTEM_DRIVER

Okrela sterownik systemu plikw systemu Windows


i take jest zarezerwowana.

SERVICE_INTERACTIVE_PROCESS

T flag mona poczy tylko z dwoma wartociami


SERVICE_WIN32_X. Usugi interaktywne powoduj
zagroenie w obszarze bezpieczestwa i naley ich
unika .

W tej ksice typ usugi to prawie zawsze SERVICE_WIN32_OWN_


PROCESS, a ustawienie SERVICE_WIN32_SHARE_PROCESS to jedyna
inna warto odpowiednia dla usug w trybie uytkownika. Przedstawienie pozostaych wartoci pozwala jednak pokaza , e usugi odgrywaj
wiele rnych rl.

556

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

Stan usugi (dwCurrentState)


Parametr dwCurrentState okrela obecny stan usugi. W tabeli 13.2
przedstawiono rne moliwe wartoci.
Tabela 13.2. Wartoci okrelajce stan usugi
Warto

Znaczenie

SERVICE_STOPPED

Usuga nie jest uruchomiona.

SERVICE_START_PENDING

Usuga rozpoczyna dziaanie, ale nie jest jeszcze gotowa


do odpowiadania na dania (na przykad dlatego,
e wtek roboczy nie zosta jeszcze uruchomiony).

SERVICE_STOP_PENDING

Usuga zatrzymuje dziaanie, ale nie zakoczya jeszcze


zamykania. Na przykad globalna flaga zamknicia
zostaa ustawiona, ale wtki robocze jeszcze nie
odpowiedziay.

SERVICE_RUNNING

Usuga dziaa.

SERVICE_CONTINUE_PENDING

Usuga jest w trakcie wznawiania pracy po wstrzymaniu,


ale jeszcze nie dziaa.

SERVICE_PAUSE_PENDING

Trwa wstrzymywanie usugi, ale nie przesza ona jeszcze


bezpiecznie w stan wstrzymania.

SERVICE_PAUSED

Usuga jest wstrzymana.

Akceptowane kody sterowania (dwControlsAccepted)


Parametr dwControlsAccepted okrela kody sterowania, ktre usuga ma
akceptowa i przetwarza za pomoc procedury sterujcej usugi (zobacz
nastpny podrozdzia). W tabeli 13.3 wymieniono trzy wartoci uyte
w jednym z dalszych przykadw. Odpowiednie wartoci naley poczy
bitowym operatorem or (|). Trzy dodatkowe wartoci zawiera opis struktury SERVICE_STATUS w dokumentacji MSDN.

Kod specyficzny dla usugi


Po zarejestrowaniu procedury obsugi i ustawieniu stanu na warto
SERVICE_START_PENDING usuga moe przeprowadzi swoj inicjacj oraz
ponownie okreli stan. W przeksztaconej wersji programu serverSK po
zainicjowaniu gniazd i przygotowaniu serwera do akceptowania pocze
od klientw status naley ustawi na warto SERVICE_RUNNING.

PROCEDURA

STERUJCA USUGI

557

Tabela 13.3. Kody sterowania akceptowane przez usug (niepena lista)


Warto

Znaczenie

SERVICE_ACCEPT_STOP

Dodaje obsug dania


SERVICE_CONTROL_STOP.

SERVICE_ACCEPT_PAUSE_CONTINUE

Dodaje obsug da


SERVICE_CONTROL_PAUSE
i SERVICE_CONTROL_CONTINUE.

SERVICE_ACCEPT_SHUTDOWN
(funkcja ControlService nie moe

wysa tego kodu sterowania)

SERVICE_ACCEPT_PARAMCHANGE

Powiadamia usug o zamykaniu systemu.


Umoliwia to systemowi przesanie wartoci
SERVICE_CONTROL_SHUTDOWN do usugi.
Ten kod jest przeznaczony do wycznego
uytku przez system Windows.
Umoliwia zmian parametrw rozruchowych
bez ponownego uruchamiania. Powiadomienie
to SERVICE_CONTROL_PARAMCHANGE.

Procedura sterujca usugi


Procedura sterujca usugi, czyli funkcja zwrotna okrelona w funkcji
RegisterServiceCtrlHandlerEx, ma nastpujc posta :
DWORD WINAPI HandlerEx (
DWORD dwControl,
DWORD dwEventType,
LPVOID lpEventData,
LPVOID lpContext)

Parametr dwControl okrela wysany przez meneder SCM sygna sterujcy, ktry naley przetworzy .
Parametr ten przyjmuje 14 wartoci, w tym te wymienione w tabeli 13.3.
Oto pi wartoci istotnych w omawianym przykadzie:
SERVICE_CONTROL_STOP
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_SHUTDOWN

558

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

Mona te stosowa zdefiniowane przez uytkownika wartoci z przedziau od 128 do 255, jednak nie wykorzystano ich w tym miejscu.
Parametr dwEventType ma zwykle warto 0, jednak do zarzdzania
urzdzeniami su wartoci niezerowe (omawianie tego zagadnienia wykracza poza zakres ksiki). Parametr lpEventDate udostpnia dodatkowe dane wymagane dla niektrych zdarze.
Ostatni parametr, lpContext, zawiera zdefiniowane przez uytkownika dane przekazane do funkcji RegisterServiceCtrlHandlerEx przy
rejestrowaniu okrelonej procedury obsugi.
Procedura obsugi jest wywoywana przez meneder SCM w tym samym
wtku, co program gwny, i jest zwykle napisana jako instrukcja switch.
Ilustruj to przykady.

Rejestrowanie zdarze
Usugi dziaaj bezwejciowo bez interakcji z uytkownikiem, dlatego
zwykle nie powinny bezporednio wywietla komunikatw o stanie. W systemach starszych ni Vista i NT6 niektre usugi tworzyy konsol, pole
komunikatw lub okno do interakcji z uytkownikiem. Obecnie techniki
te nie s ju dostpne.
Rozwizanie tego problemu polega na rejestrowaniu zdarze w pliku
dziennika lub wykorzystaniu mechanizmu rejestrowania zdarze z systemu Windows. Takie zdarzenia s przechowywane w systemie Windows
i mona je wywietli za pomoc przegldarki zdarze dostpnej w Narzdziach administracyjnych w Panelu sterowania.
Dalszy przykadowy program SimpleService (listing 13.2) rejestruje wane
zdarzenia i bdy usugi w pliku dziennika. W wiczeniu poproszono o zmodyfikowanie tego programu przez zastosowanie zdarze systemu Windows.

Przykad nakadka na usugi


Program z listingu 13.2 przeksztaca dowoln funkcj _tmain na usug.
Aby byo to moliwe, trzeba wykona opisane dalej operacje. Istniejcy
kod serwera (czyli dawna funkcja _tmain) jest wywoywany jako wtek lub
proces z poziomu funkcji ServiceSpecific. Dlatego przedstawiony tu
kod to nakadka na istniejcy serwer.

PRZYKAD

NAKADKA NA USUGI

559

Listing 13.2. Program SimpleService nakadka na serwery


/* Rozdzia 13. SimpleService.c.
Najprostszy przykad usugi systemu Windows.
Jej jedyne moliwoci to aktualizowanie punktw kontrolnych
i akceptowanie podstawowych polece sterujcych.
Program mona te uruchomi jako niezalen aplikacj. */

#include "Everything.h"
#include <time.h>
#define UPDATE_TIME 1000 /* Sekunda odstpu midzy aktualizacjami. */
VOID LogEvent (LPCTSTR, WORD), LogClose();
BOOL LogInit(LPTSTR);
void WINAPI ServiceMain (DWORD argc, LPTSTR argv[]);
VOID WINAPI ServerCtrlHandler(DWORD);
void UpdateStatus (int, int);
int ServiceSpecific (int, LPTSTR *);
static BOOL shutDown = FALSE, pauseFlag = FALSE;
static SERVICE_STATUS hServStatus;
static SERVICE_STATUS_HANDLE hSStat; /* Uchwyt do ustawiania stanu. */
static LPTSTR serviceName = _T("SimpleService");
static LPTSTR logFileName = _T(".\\LogFiles\\SimpleServiceLog.txt");
static BOOL consoleApp = FALSE, isService;
/* Gwna procedura uruchamiajca program rozdzielajcy do sterowania usug. */
/* Program mona te uruchomi jako niezalen aplikacj konsolow. */
/* Stosowanie: simpleService [-c] */
/*
Opcja -c powoduje uruchomienie aplikacji konsolowej zamiast usugi. */
VOID _tmain (int argc, LPTSTR argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ serviceName, ServiceMain},
{ NULL,
NULL }
};
Options (argc, argv, _T("c"), &consoleApp, NULL);
isService = !consoleApp;
/* Inicjowanie pliku dziennika. */
if (!LogInit (logFileName)) return;
if (isService) {
LogEvent(_T("Uruchamianie programu rozdzielajacego."),
EVENTLOG_SUCCESS);
StartServiceCtrlDispatcher (DispatchTable);

560

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

} else {
LogEvent(_T("Uruchamianie aplikacji."), EVENTLOG_SUCCESS);
ServiceSpecific (argc, argv);
}
LogClose();
return;
}
/* Punkt wejcia w postaci funkcji ServiceMain wywoywanej przez program gwny. */
void WINAPI ServiceMain (DWORD argc, LPTSTR argv[])
{
LogEvent (_T("Wchodzenie do funkcji ServiceMain."),
EVENTLOG_SUCCESS);
hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
hServStatus.dwCurrentState = SERVICE_START_PENDING;
hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
hServStatus.dwWin32ExitCode = NO_ERROR;
hServStatus.dwServiceSpecificExitCode = 0;
hServStatus.dwCheckPoint = 0;
hServStatus.dwWaitHint = 2 * UPDATE_TIME;
hSStat =
RegisterServiceCtrlHandler( serviceName, ServerCtrlHandler);
if (hSStat == 0) {
LogEvent (_T("Nie mozna zarejestrowac procedury obslugi."),
EVENTLOG_ERROR_TYPE);
hServStatus.dwCurrentState = SERVICE_STOPPED;
hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
hServStatus.dwServiceSpecificExitCode = 1;
UpdateStatus (SERVICE_STOPPED, -1);
return;
}
LogEvent (_T("Zarejestrowano procedure sterujaca."),
EVENTLOG_SUCCESS);
SetServiceStatus (hSStat, &hServStatus);
LogEvent (_T("Stan SERVICE_START_PENDING."), EVENTLOG_SUCCESS);
/* Uruchamianie zada specyficznych dla usugi. Oglne operacje zostay wykonane. */
ServiceSpecific (argc, argv);
/* Sterowanie jest zwracane do tego miejsca dopiero po zakoczeniu
dziaania funkcji ServiceSpecific, co oznacza zamknicie systemu. */
LogEvent (_T("Watki uslugi zakonczyly prace."),
EVENTLOG_SUCCESS);
LogEvent (_T("Ustawianie stanu na SERVICE_STOPPED."),
EVENTLOG_SUCCESS);

PRZYKAD

NAKADKA NA USUGI

561

UpdateStatus (SERVICE_STOPPED, 0);


LogEvent (_T("Stan ustawiono na SERVICE_STOPPED."),
EVENTLOG_SUCCESS);
return;
}
/* Funkcja specyficzna dla usugi (gwna) wywoywana w funkcji ServiceMain. */
int ServiceSpecific (int argc, LPTSTR argv[])
{
UpdateStatus (-1, -1); /* Zmiana stanu i ustawienie nastpnego punktu kontrolnego. */
/* Serwer mona uruchomi jako wtek lub proces. */
/* Zamy, e usuga rozpoczyna prac w dwie sekundy. */
UpdateStatus (SERVICE_RUNNING, -1);
LogEvent (_T("Aktualizacja stanu. Usluga dziala."),
EVENTLOG_SUCCESS);
/* Okresowe aktualizowanie stanu. */
/*** Ptl do obsugi aktualizacji mona uruchomi w odrbnym wtku. ***/
/* Naley te sprawdzi flag pauseFlag zobacz wiczenie 13-1. */
LogEvent (_T("Uruchamianie glownej petli uslugi."),
EVENTLOG_SUCCESS);
while (!shutDown) { /* Flaga shutDown jest ustawiana przy poleceniu zamknicia. */
Sleep (UPDATE_TIME);
UpdateStatus (-1, -1); /* Zamy, e zmiany nie wystpiy. */
LogEvent (_T("Aktualizacja stanu. Brak zmian."),
EVENTLOG_SUCCESS);
}
LogEvent (_T ("Proces serwera zakonczyl prace."),
EVENTLOG_SUCCESS);
return 0;
}
/* Procedura sterujca. */
VOID WINAPI ServerCtrlHandler( DWORD dwControl)
{
switch (dwControl) {
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
shutDown = TRUE; /* Ustawianie flagi globalnej shutDown. */
UpdateStatus (SERVICE_STOP_PENDING, -1);
break;
case SERVICE_CONTROL_PAUSE:
pauseFlag = TRUE;
/* Implementacja wstrzymania to temat wiczenia 13.1. */
break;
case SERVICE_CONTROL_CONTINUE:
pauseFlag = FALSE;
/* Implementacja kontynuacji to te wiczenie. */
break;

562

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

case SERVICE_CONTROL_INTERROGATE:
break;
default:
if (dwControl > 127 && dwControl < 256) /* Zdefiniowane przez
uytkownika. */
break;
}
UpdateStatus (-1, -1);
return;
}
void UpdateStatus (int NewStatus, int Check)
/* Ustawianie stanu usugi i punktu kontrolnego (na okrelon warto lub przez zwikszenie). */
{
if (Check < 0 ) hServStatus.dwCheckPoint++;
else hServStatus.dwCheckPoint = Check;
if (NewStatus >= 0) hServStatus.dwCurrentState = NewStatus;
if (isService) {
if (!SetServiceStatus (hSStat, &hServStatus)) {
LogEvent (_T("Nie mozna ustawic stanu."),
EVENTLOG_ERROR_TYPE);
hServStatus.dwCurrentState = SERVICE_STOPPED;
hServStatus.dwWin32ExitCode =
ERROR_SERVICE_SPECIFIC_ERROR;
hServStatus.dwServiceSpecificExitCode = 2;
UpdateStatus (SERVICE_STOPPED, -1);
return;
} else {
LogEvent (_T("Zaktualizowano stan uslugi."),
EVENTLOG_SUCCESS);
}
} else {
LogEvent (_T("Zaktualizowano stan niezaleznego programu."),
EVENTLOG_SUCCESS);
}
return;
}
/* Proste rejestrowanie zdarze w pliku. */
static FILE * logFp = NULL;
/* Bardzo prosta usuga rejestrujca (korzysta z pliku). */
VOID LogEvent (LPCTSTR UserMessage, WORD type)
{
TCHAR cTimeString[30] = _T("");
time_t currentTime = time(NULL);
_tcsncat (cTimeString, _tctime(&currentTime), 30);
/* Usuwanie znaku nowego wiersza na kocu acucha z czasem. */
cTimeString[_tcslen(cTimeString)-2] = _T('\0');
_ftprintf(logFp, _T("%s. "), cTimeString);

PRZYKAD

NAKADKA NA USUGI

if (type == EVENTLOG_SUCCESS || type ==


EVENTLOG_INFORMATION_TYPE)
_ftprintf(logFp, _T("%s"), _T("Informacja.
else if (type == EVENTLOG_ERROR_TYPE)
_ftprintf(logFp, _T("%s"), _T("Blad.
else if (type == EVENTLOG_WARNING_TYPE)
_ftprintf(logFp, _T("%s"), _T("Ostrzezenie.
else
_ftprintf(logFp, _T("%s"), _T("Nieznane.
_ftprintf(logFp, _T("%s\n"), UserMessage);
fflush(logFp);
return;

563

"));
"));
"));
"));

}
BOOL LogInit(LPTSTR name)
{
logFp = _tfopen (name, _T("a+"));
if (logFp != NULL) LogEvent (_T("Zainicjowano rejestrowanie."),
EVENTLOG_SUCCESS);
return (logFp != NULL);
}
VOID LogClose()
{
LogEvent (_T("Zamykanie dziennika."), EVENTLOG_SUCCESS);
return;
}

Opcja c podawana w wierszu polece okrela, e kod naley uruchomi jako niezaleny program (na przykad w celach diagnostycznych).
Pominicie tej opcji powoduje wywoanie funkcji StartServiceCtrl
Dispatcher.
Innym dodatkiem jest plik dziennika. Dla uproszczenia jego nazw
zapisano na stae w kodzie. Usuga rejestruje w tym pliku istotne zdarzenia.
Na kocu znajduj si proste funkcje do inicjowania i zamykania dziennika
oraz rejestrowania komunikatw.
W komentarzach opisano kilka innych uproszcze i ogranicze.

Uruchamianie prostej usugi


Przebieg programu 13.2a pokazuje, jak za pomoc uruchamianego w wierszu polece narzdzia sc utworzy , uruchomi , odpyta , zatrzyma i zamkn program SimpleService. Tylko administrator moe wykonywa te
operacje.
Przebieg programu 13.2b przedstawia zawarto pliku dziennika.

564

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

Przebieg programu 13.2a. Usuga SimpleService kontrolowana za pomoc narzdzia sc

Przebieg programu 13.2b. SimpleServiceLog.txt plik dziennika

ZARZDZANIE

USUGAMI SYSTEMU

WINDOWS

565

Zarzdzanie usugami systemu Windows


Po napisaniu usugi nastpnym krokiem jest umieszczenie jej pod kontrol
menedera SCM, aby mg on uruchamia i zatrzymywa usug oraz sterowa ni na inne sposoby. Cho program sc.exe i usugowe narzdzia
administracyjne na to pozwalaj, usugami mona te zarzdza programistycznie, co opisano w dalszej czci podrozdziau.
Trzeba wykona kilka krokw otworzy meneder SCM, utworzy
usug pod jego kontrol, a nastpnie uruchomi t usug. Te etapy nie
su do bezporedniego kontrolowania usugi. S to instrukcje dla menedera SCM, ktry z kolei steruje okrelon usug.

Otwieranie menedera SCM


Do utworzenia usugi niezbdny jest odrbny proces uruchomiony jako
administrator. Podobnie dziaa program JobShell (rozdzia 6.) uruchamiajcy zadania. Pierwszy krok to otwarcie menedera SCM i pobranie
uchwytu, ktry umoliwi utworzenie usugi.
SC_HANDLE OpenSCManager (
LPCTSTR lpMachineName,
LPCTSTR lpDatabaseName,
DWORD dwDesiredAccess)

Parametry
Jeli meneder SCM dziaa na komputerze lokalnym, parametr lpMachine
Name ma warto NULL, natomiast mona te uzyska dostp do menedera uruchomionego na maszynach z danej sieci.
Parametr lpDatabaseName ma zwykle warto NULL.
Parametr dwDesiredAccess ma standardowo warto SC_MANAGER_
ALL_ACCESS, jednak mona okreli bardziej ograniczone uprawnienia
dostpu, jak opisano to w dokumentacji dostpnej w internecie.

Tworzenie i usuwanie usugi


Aby zarejestrowa usug, naley wywoa funkcj CreateService.

566

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

SC_HANDLE CreateService (
SC_HANDLE hSCManager,
LPCTSTR lpServiceName,
LPCTSTR lpDisplayName,
DWORD dwDesiredAccess,
DWORD dwServiceType,
DWORD dwStartType,
DWORD dwErrorControl,
LPCTSTR lpBinaryPathName,
LPCTSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCTSTR lpDependencies,
LPCTSTR lpServiceStartName,
LPCTSTR lpPassword);

Funkcja CreateService umieszcza nowe usugi w rejestrze w kluczu:


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

Nie naley jednak prbowa pomija funkcji CreateService przez bezporednie manipulowanie rejestrem. O tym kluczu wspomniano tylko po to,
aby pokaza , w jaki sposb Windows przechowuje informacje o usugach.

Parametry
Parametr hSCManager to uchwyt typu SC_HANDLE zwrcony przez funkcj
OpenSCManager.
Parametr lpServiceName to nazwa uywana do pniejszego wskazywania usugi. Jest to jedna z nazw usug logicznych podanych w tablicy
przydziau w wywoaniu funkcji StartServiceCtrlDispatcher. Warto
zauway , e funkcj CreateService trzeba wywoa dla kadej usugi
logicznej.
Parametr lpDisplayName to nazwa usugi wywietlana uytkownikowi
w narzdziu administracyjnym Usugi (Panel sterowania/Narzdzia administracyjne) i w innych miejscach. Nazwa ta pojawia si natychmiast po udanym wywoaniu funkcji CreateService.
Do parametru dwDesiredAccess mona przypisa warto SERVICE_
ALL_ACCESS lub kombinacj wartoci GENERIC_READ, GENERIC_WRITE
i GENERIC_EXECUTE. Wicej szczegw na ten temat mona znale
w dokumentacji MSDN.
Wartoci parametru dwServiceType przedstawiono w tabeli 13.1.

ZARZDZANIE

USUGAMI SYSTEMU

WINDOWS

567

Parametr dwStartType okrela sposb uruchamiania usugi. W przykadach uyto ustawienia SERVICE_DEMAND_START, natomiast inne wartoci (SERVICE_BOOT_START i SERVICE_SYSTEM_START) umoliwiaj
uruchamianie usug sterownikw urzdze w czasie adowania lub uruchamiania systemu. Ustawienie SERVICE_AUTO_START informuje, e usug
naley wczy w czasie uruchamiania komputera.
Parametr lpBinaryPathName okrela pen ciek do pliku wykonywalnego. Koniecznie trzeba poda rozszerzenie .exe. Jeli cieka obejmuje odstpy, naley uy cudzysoww.
Inne parametry dotycz nazwy konta i hasa, grup sucych do czenia
usug, a take zalenoci, jeli istnieje kilka zalenych od siebie usug.
Wartoci parametrw konfiguracyjnych istniejcej usugi mona zmieni za pomoc funkcji ChangeServiceConfig i ChangeService
Config2. Ta druga jest prostsza i prawdopodobnie z tego powodu nie
nosi nazwy ChangeServiceConfigEx. Do wskazywania usug su
ich uchwyty, a wspomniane funkcje pozwalaj ustawi nowe wartoci
wikszoci parametrw. Mona na przykad poda now warto parametrw dwServiceType lub dwStartType, jednak nie mona zmieni
parametru dwAccess.
Istnieje te funkcja OpenService. Suy ona do pobierania uchwytu
nazwanej usugi. Aby wyrejestrowa usug z menedera SCM, naley uy
funkcji DeleteService, a do zamykania uchwytw SC_HANDLE przeznaczona jest funkcja CloseServiceHandle.

Uruchamianie usugi
Usuga po utworzeniu nie jest uruchomiona. Naley wywoa funkcj Ser
viceMain() przez podanie uchwytu uzyskanego za pomoc funkcji
CreateService. Razem z uchwytem naley poda parametry wiersza
polece (argc, argv) oczekiwane przez funkcj gwn usugi (czyli funkcj okrelon w tablicy przydziau).
BOOL StartService (
SC_HANDLE hService,
DWORD argc,
LPTSTR argv[])

568

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

Kontrolowanie usugi
Usug mona kontrolowa przez nakazanie menederowi SCM wywoania
procedury sterujcej usugi z okrelonym kodem sterowania.
BOOL ControlService (
SC_HANDLE hService,
DWORD dwControlCode,
LPSERVICE_STATUS lpServStat)

Oto wartoci parametru dwControlCode istotne w omawianych przykadach:


SERVICE_CONTROL_STOP
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_SHUTDOWN

Wane s te wartoci z przedziau od 128 do 255 okrelone przez


uytkownika. Dodatkowe nazwane kody informuj usug o zmianie wartoci uruchomieniowych lub modyfikacjach w zakresie powizania.
Warto SERVICE_CONTROL_INTERROGATE nakazuje usudze przesanie informacji o stanie przez wywoanie funkcji SetServiceStatus.
Technika ta ma jednak ograniczon przydatno , poniewa meneder SCM
otrzymuje okresowe aktualizacje.
Parametr lpServStat wskazuje struktur SERVICE_STATUS, w ktrej
zapisywany jest aktualny stan usugi. Z tej samej struktury korzysta funkcja
SetServiceStatus.

Sprawdzanie stanu usugi


Aby pobra aktualny stan usugi ze struktury SERVICE_STATUS, naley
wywoa ponisz funkcj:
BOOL QueryServiceStatus (
SC_HANDLE hService,
LPSERVICE_STATUS lpServiceStatus)

PODSUMOWANIE

DZIAANIE USUG I ZARZDZANIE NIMI

569

Istnieje rnica midzy wywoaniem funkcji QueryServiceStatus


(pobiera ona aktualne informacje o stanie od menedera SCM) i wywoaniem funkcji ControlService z kodem sterowania SERVICE_CONTROL_
INTERROGATE. Ta pierwsza nakazuje usudze zaktualizowa meneder
SCM, a nie aplikacj.

Podsumowanie dziaanie usug i zarzdzanie nimi


Rysunek 13.1 przedstawia meneder SCM i jego zwizki z usugami oraz
programem sterujcym usugi, takim jak narzdzie z listingu 13.3 z nastpnego podrozdziau. Usuga musi przede wszystkim zarejestrowa si w menederze SCM, a wszystkie kierowane do niej polecenia przechodz przez
ten meneder.

Rysunek 13.1. Kontrolowanie usug systemu Windows za pomoc menedera SCM

Przykad powoka do sterowania usug


Usugi systemu Windows mona kontrolowa po klikniciu ikony Usugi
w oknie Narzdzia administracyjne. Inna moliwo to sterowanie usugami
za pomoc programu sc.exe uruchamianego w wierszu polece w systemie

570

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

Windows. Ponadto mona sterowa usug z poziomu aplikacji, co ilustruje


nastpny przykad program ServiceShell (listing 13.3). Jest to zmodyfikowana wersja programu JobShell (listing 6.3) z rozdziau 6.
Listing 13.3. ServiceShell program do sterowania usugami
/* Rozdzia 13. */
/* ServiceShell.c powoka do zarzdzania usugami systemu Windows.
Jest to zmodyfikowana wersja programu do zarzdzania zadaniami z rozdziau 6.
Tu program zarzdza usugami, a nie zadaniami. */
/* Ilustruje sterowanie usug z poziomu programu.
Zwykle naley korzysta z polecenia sc.exe lub narzdzia
administracyjnego Usugi. */
/* Oto lista obsugiwanych polece:
create Tworzy usug
delete Usuwa usug
start
Uruchamia usug
control Kontroluje usug */

#include "Everything.h"
static
static
static
static

int
int
int
int

Create (int, LPTSTR *, LPTSTR);


Delete (int, LPTSTR *, LPTSTR);
Start (int, LPTSTR *, LPTSTR);
Control (int, LPTSTR *, LPTSTR);

static SC_HANDLE hScm;


static BOOL debug;
int _tmain (int argc, LPTSTR argv[])
{
BOOL exitFlag = FALSE;
TCHAR command[MAX_COMMAND_LINE+10], *pc;
DWORD i, locArgc; /* Lokalny argument argc. */
TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];
LPTSTR pArgs[MAX_ARG];
debug = (argc > 1); /* Prosta flaga diagnostyczna. */
/* Przygotowywanie lokalnej tablicy argv ze wska nikami do acuchw znakw. */
for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];
/* Otwieranie na lokalnym komputerze menedera SCM
z domyln baz danych i penym dostpem. */
hScm = OpenSCManager (NULL, SERVICES_ACTIVE_DATABASE,
SC_MANAGER_ALL_ACCESS);
/* Gwna ptla do przetwarzania polecenia. */
_tprintf (_T("\nZarzadzanie uslugami systemu Windows."));
while (!exitFlag) {
_tprintf (_T("\nSM$"));

PRZYKAD

POWOKA DO STEROWANIA USUG

571

_fgetts (command, MAX_COMMAND_LINE, stdin);


/* Zastpowanie znaku nowego wiersza sekwencj koca acucha znakw. */
pc = _tcschr (command, _T('\n')); *pc = _T('\0');
if (debug) _tprintf (_T("%s\n"), command);
/* Przeksztacanie polecenia na posta argc, argv. */
GetArgs (command, &locArgc, pArgs);
CharLower (argstr[0]); /* Wielko znakw w poleceniu nie ma znaczenia. */
if (debug) _tprintf (_T("\n%s %s %s %s"), argstr[0],
argstr[1],
argstr[2], argstr[3]);
if (_tcscmp (argstr[0], _T("create")) == 0) {
Create (locArgc, pArgs, command);
}
else if (_tcscmp (argstr[0], _T("delete")) == 0) {
Delete (locArgc, pArgs, command);
}
else if (_tcscmp (argstr[0], _T("start")) == 0) {
Start (locArgc, pArgs, command);
}
else if (_tcscmp (argstr[0], _T("control")) == 0) {
Control (locArgc, pArgs, command);
}
else if (_tcscmp (argstr[0], _T("quit")) == 0) {
exitFlag = TRUE;
}
else _tprintf (_T("\nNieznane polecenie."));
}
CloseServiceHandle (hScm);
return 0;
}
int Create (int argc, LPTSTR argv[], LPTSTR command)
{
/* Tworzenie nowej usugi z ustawieniem SERVICE_DEMAND_START:
argv[1]: nazwa usugi
argv[2]: wywietlana nazwa
argv[3]: binarny plik wykonywalny */

SC_HANDLE hSc;
TCHAR executable[MAX_PATH+1],
quotedExecutable[MAX_PATH+3] = _T("\"");
/* Potrzebna jest pena cieka i jeli wystpuj odstpy cudzysowy. */
GetFullPathName (argv[3], MAX_PATH+1, executable, NULL);
_tcscat(quotedExecutable, executable);
_tcscat(quotedExecutable, _T("\""));

572

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

if (debug) _tprintf (_T("\nPelna sciezka do uslugi: %s"),


executable);
hSc = CreateService (hScm, argv[1], argv[2],
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
quotedExecutable, NULL, NULL, NULL, NULL, NULL);
CloseServiceHandle (hSc); /* Nie trzeba zachowywa uchwytu, poniewa
funkcja OpenService pobiera informacje z bazy danych usugi. */

return 0;
}
/* Usuwanie usugi
argv[1]: nazwa usuwanej usugi */
int Delete (int argc, LPTSTR argv[], LPTSTR command)
{
SC_HANDLE hSc;

if (debug) _tprintf (_T("\nPrzed usunieciem uslugi: %s"),


argv[1]);
hSc = OpenService(hScm, argv[1], DELETE);
DeleteService (hSc);
CloseServiceHandle (hSc);
return 0;
}
/* Uruchamianie nazwanej usugi
argv[1]: nazwa uruchamianej usugi */
int Start (int argc, LPTSTR argv[], LPTSTR command)
{
SC_HANDLE hSc;
TCHAR workingDir[MAX_PATH+1];
LPTSTR argvStart[] = {argv[1], workingDir};

GetCurrentDirectory (MAX_PATH+1, workingDir);


/* Pobieranie uchwytu usugi podanej w wierszu polece (argv[1]). */
hSc = OpenService(hScm, argv[1], SERVICE_ALL_ACCESS);
/* Uruchamia usug z jednym argumentem katalogiem roboczym. */
/* Nazwa usugi pochodzi z wiersza polece programu (argv[1]). */
StartService (hSc, 2, argvStart);
CloseServiceHandle (hSc);
return 0;
}
/* Sterowanie nazwan usug.
argv[1]: nazwa kontrolowanej usugi
argv[2]: polecenie sterujce (wielko znakw nie ma znaczenia):

PRZYKAD

POWOKA DO STEROWANIA USUG

573

stop
pause
resume
interrogate
user - zdefiniowane przez uytkownika

*/
static LPCTSTR commandList[] =
{ _T("stop"), _T("pause"), _T("resume"),
_T("interrogate"), _T("user") };
static DWORD controlsAccepted[] = {
SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE,
SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROGATE, 128 };
int Control (int argc, LPTSTR argv[], LPTSTR command)
{
SC_HANDLE hSc;
SERVICE_STATUS sStatus;
DWORD dwControl, i;
BOOL found = FALSE;
if (debug) _tprintf (_T("\nSterowanie usluga: %s"), argv[1]);
for (i= 0;
i < sizeof(controlsAccepted)/sizeof(DWORD) && !found; i++)
found = (_tcscmp (commandList[i], argv[2]) == 0);
if (!found) {
_tprintf (_T("\nNiedozwolone polecenie %s"), argv[1]);
return 1;
}
dwControl = controlsAccepted[i-1];
if (dwControl == 128) dwControl = _ttoi (argv[3]);
if (debug) _tprintf (_T("\ndwControl = %d"), dwControl);
hSc = OpenService(hScm, argv[1],
SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE |
SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL |
SERVICE_QUERY_STATUS );
ControlService (hSc, dwControl, &sStatus);
if (dwControl == SERVICE_CONTROL_INTERROGATE) {
QueryServiceStatus (hSc, &sStatus);
_tprintf (_T("\nStan z funkcji QueryServiceStatus."));
_tprintf (_T("\nStan uslugi:"));
_tprintf (_T("\ndwServiceType: %d"), sStatus.dwServiceType);
_tprintf (_T("\ndwCurrentState: %d"),
sStatus.dwCurrentState);
_tprintf (_T("\ndwControlsAccepted: %d"),
sStatus.dwControlsAccepted);

574

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

_tprintf (_T("\ndwWin32ExitCode: %d"),


sStatus.dwWin32ExitCode);
_tprintf (_T("\ndwServiceSpecificExitCode: %d"),
sStatus.dwServiceSpecificExitCode);
_tprintf (_T("\ndwExitCode: %d"), sStatus.dwCheckPoint);
_tprintf (_T("\ndwWaitHint: %d"), sStatus.dwWaitHint);
}
if (hSc != NULL) CloseServiceHandle (hSc);
return 0;
}

Ten przykad ma pokaza , jak kontrolowa usugi z poziomu programu.


Nie zastpuje on programu sc.exe ani narzdzia administracyjnego Usugi.
Przebieg programu 13.3 przedstawia dziaanie funkcji SimpleService.

Przebieg programu 13.3. Aplikacja ServiceShell zarzdzanie usugami

Wspuytkowanie obiektw jdra przy uyciu usugi


Czasem usuga i aplikacje wspuytkuj obiekt jdra. Usuga moe na
przykad korzysta z nazwanego muteksu do zabezpieczania wspuytkowanego obszaru pamici stosowanego do komunikacji z aplikacjami.
Ponadto w tym kontekcie odwzorowanie plikw take jest wspuytkowanym obiektem jdra.

UWAGI

NA TEMAT DIAGNOZOWANIA USUG

575

Wystpuje tu problem wynikajcy z tego, e aplikacje pracuj w innym


kontekcie zabezpiecze ni usugi, ktre mog dziaa na koncie systemowym. Nawet jeli ochrona nie jest potrzebna, nie naley tworzy i (lub)
otwiera wspuytkowanych obiektw jdra ze wskanikiem atrybutw
zabezpiecze ustawionym na NULL (zobacz rozdzia 15.). Zamiast tego
potrzebna jest przynajmniej rna od NULL poufna lista kontroli dostpu.
Oznacza to, e aplikacje i usuga musz korzysta z rnej od NULL struktury
atrybutw zabezpiecze. Zwykle warto zabezpiecza obiekty, a zagadnienie to jest tematem rozdziau 15.
Warto te zauway , e jeli usuga dziaa na koncie systemowym, moe
mie trudnoci z dostpem do zasobw z innych maszyn, na przykad do
wspuytkowanych plikw.

Uwagi na temat diagnozowania usug


Usuga ma dziaa cigle, dlatego musi by niezawodna i w miar moliwoci wolna od defektw. Cho usug mona doczy do debugera i uy
dziennikw zdarze do ledzenia jej dziaania, te techniki najlepiej jest
stosowa po zainstalowaniu usugi.
W fazie rozwijania i diagnozowania kodu czsto najatwiej jest zastosowa nakadk na usugi zaprezentowan na listingu 13.2. Umoliwia ona
uruchomienie programu jako usugi lub niezalenej aplikacji. Wybr
odbywa si za pomoc opcji c podawanej w wierszu polece.
Najpierw naley rozwin wersj przedusugow w postaci nieza-

lenego programu. W ten sposb zbudowano na przykad program


serverSK.
Nastpnie naley dopracowa program za pomoc rejestrowania zdarze lub pliku dziennika.
Po stwierdzeniu, e program jest gotowy do zainstalowania jako
usuga, naley uruchomi go bez podawania w wierszu polece
opcji c. Program zostanie uruchomiony jako usuga.
Niezbdne s dodatkowe testy usugi, aby wykry bdy logiczne
i problemy z bezpieczestwem. Usugi mog dziaa na koncie systemowym i nie zawsze maj dostp do obiektw uytkownika, a wersja
niezalena czasem nie umoliwia wykrycia takich problemw.
Normalne diagnozowanie zdarze i drobne prace konserwacyjne
mona przeprowadzi na podstawie informacji z pliku dziennika lub

576

ROZDZIA 13.

USUGI

SYSTEMU

WINDOWS

dziennika zdarze. Nawet informacje o stanie mog pomc w okreleniu sprawnoci serwera i wykryciu symptomw usterek.
Jeli konieczne s skomplikowane prace konserwacyjne, mona zdiagnozowa program jako zwyk aplikacj za pomoc opcji c.

Podsumowanie
Usugi systemu Windows udostpniaj standardowe moliwoci w zakresie
dodawania utworzonych przez uytkownika usug do komputerw z system
Windows. Gotowy niezaleny program mona przeksztaci na usug za
pomoc metod opisanych w tym rozdziale.
Usugi mona tworzy , sterowa nimi i obserwowa ich dziaanie za
pomoc narzdzi administracyjnych lub programu ServiceShell zaprezentowanego w tym rozdziale. Meneder SCM kontroluje zainstalowane usugi
i ledzi ich dziaanie. W rejestrze znajduj si wpisy powizane z wszystkimi usugami.

Co dalej?
W rozdziale 14. opisano asynchroniczne operacje wejcia-wyjcia. Obejmuj
one dwie techniki do wykonywania wielu operacji odczytu i zapisu rwnolegle z przetwarzaniem danych. Nie trzeba przy tym korzysta z wtkw potrzebny jest tylko jeden wtek uytkownika.
W wikszoci przypadkw atwiej jest pisa programy za pomoc wielu
wtkw ni asynchronicznych operacji wejcia-wyjcia, a wydajno rozwiza opartych na wtkach jest zwykle wysza. Jednak asynchroniczne
operacje wejcia-wyjcia s niezbdne przy stosowaniu portw koczenia
operacji wejcia-wyjcia. Porty te s niezwykle przydatne przy budowaniu
skalowalnych serwerw, ktre mog obsugiwa du liczb klientw.
W rozdziale 14. omwiono te zegary oczekujce.

Lektura dodatkowa
W ksice Professional NT Services Kevin Miller dokadnie opisa usugi.
W niniejszym rozdziale nie omwiono sterownikw urzdze i ich interakcji z usugami. Informacje na te tematy mona znale na przykad
w ksice Programming the Microsoft Windows Driver Model, Second Edition Waltera Oneya.

WICZENIA

577

wiczenia
13.1. Zmodyfikuj program SimpleService (listing 13.2) przez zastosowanie
zdarze systemu Windows zamiast pliku dziennika. Potrzebne bd
funkcje RegisterEventSource, ReportEvent i Deregister
EventSource (kad z nich opisano w dokumentacji MSDN).
Rozwa ponadto wykorzystanie rejestrowania zdarze w systemie
Vista. Inna moliwo to zastosowanie systemu rejestrowania o otwartym dostpie do kodu rdowego, takiego jak Nlog (http://nlogproject.org/home).
13.2. Rozbuduj program serviceSK, tak aby w sensowny sposb przyjmowa polecenie wstrzymania. Oto sugestia wstrzymana usuga powinna zachowywa istniejce poczenia, ale nie moe przyjmowa
nowych pocze. Ponadto usuga powinna zakoczy przetwarzanie
odebranych da i wysa odpowiedzi, jednak nie mona akceptowa w niej dalszych da od klientw.
13.3. Program ServiceShell przy sprawdzaniu stanu usugi po prostu wywietla liczby. Rozwi ten program w taki sposb, aby przedstawia
stan w bardziej czytelnej postaci.
13.4. Przekszta program serverNP (listing 12.3) na usug.
13.5. Przetestuj program serviceSK z pliku Przykady. Zmodyfikuj go, tak
aby korzysta z rejestrowania zdarze.

You might also like