[Archiwum biuletynów ^][< Wolumin 1, Liczba 1][Wolumin 1, Liczba 3 >]

System wewnętrzny biuletyn woluminu 1, numer 2

http://www.sysinternals.com


15 maja 1999 r. — w tym problemie:

  1. CO NOWEGO W SYSTEMACH WEWNĘTRZNYCH

    • Sdelete
    • Aktualizacja Win2K wygaszacza ekranu BlueScreen
    • "Linux i enterprise"
    • "Inside NT Utilities"
    • Moja kolumna magazynu Windows NT May
    • Nie tak nowe rzeczy
  2. WIADOMOŚCI WEWNĘTRZNE

    • Dr GUI's Poor Bedside Maniery
    • WinDev '99 Wschód
    • Numega Driver Works zwalnia nieuchronnie
    • Wydano beta 3 DDK
    • Spinlocks w kolejce Win2K
  3. CO SIĘ DZIEJE

    • Funkcja ochrony plików systemu Win2K (SFP)

SPONSOR: WINTERNALS SOFTWARE

Biuletyn Internals Systems jest sponsorowany przez Winternals Software, w Sieci Web http://www.winternals.com. Winternals Software jest wiodącym deweloperem i dostawcą zaawansowanych narzędzi systemów dla systemu Windows NT/2K. Produkty Winternals Software obejmują FAT32 dla systemu Windows NT 4.0, ERD Commander (możliwości rozruchu dla systemu Windows NT) i NTRecover.

Witam wszystkich,

Witamy w drugim wydaniu biuletynu Systems Internals. Biuletyn ma obecnie 2700 subskrybentów, a subskrypcje nadal będą silne.

Od ostatniego biuletynu firma Microsoft oficjalnie wydała system Windows 2000 Beta 3. Numer kompilacji jądra Beta 3 to 2031, podczas gdy początkowe jądro wersji NT 4.0 wynosiło 1381, a NT 3.51 miał numer kompilacji 1025. . To, co uważam za dziwne (i nieco irytujące), jest to, że firma Microsoft zwiększa numer kompilacji za każdym razem, gdy wykonują pełną kompilację systemu operacyjnego (każdego dnia roboczego), jednak zgłoszony numer kompilacji jądra odzwierciedla to, że w początkowej publicznej wersji. Na przykład, mimo że rzeczywisty numer kompilacji jądra dodatku Service Pack 5 NT 4.0 jest znacznie wyższy niż 1381, jądro nadal zgłasza 1381 jako numer kompilacji.

Wersja Beta 3 systemu Windows 2000 ma być pobudką dla społeczności deweloperów. Firma Microsoft ogłosiła, że będzie dostarczać system Windows 2000 w październiku, a beta 3 reprezentuje pełną funkcję wersję tego, co będzie dostarczane, aby deweloperzy mogli rozpocząć pisanie nowych produktów bez obawy, że wszystko się zmieni z pod nimi.

System Windows 2000 zawiera mnóstwo nowych interfejsów API, usług warstwowych i ulepszeń jądra. Jedną ze zmian, które będą szczególnie widoczne dla deweloperów sterowników urządzeń, jest zmiana blue screen of Death (BSOD). W poprzednich wersjach NT BSOD wyświetlał informacje o czasie połączenia i adresie ładowania dla wszystkich sterowników w systemie, a także zrzut stosu, jak istnieje w momencie awarii. W systemie Windows 2000 są wyświetlane tylko kod zatrzymania i skojarzone wiersze adresów (wiersze adresów tłumaczą jeden lub więcej parametrów kodu zatrzymania do lokalizacji w sterownikach urządzeń) wraz z pełnym komunikatem. Komunikat pomocy technicznej sugeruje, że sprawdzasz ustawienia systemu BIOS i dysku twardego oraz wyłączasz defragmentację oprogramowania i skanerów wirusów, aby uniknąć ponownego uzyskania awarii. Usługi Wsparcia Microsoft Premier (PSS) określono, na podstawie ich doświadczenia i opinii klientów, że 4-stylowe BSOD NT nie jest przydatne do określania przyczyny awarii.

Osobiście znalazłem listę załadowanych sterowników, a w szczególności zrzut stosu, aby być przydatnym podczas uzyskiwania raportów o błędach sterownika od użytkowników jest o wiele łatwiej i szybciej uzyskać te informacje niż mieć użytkowników do wysyłania wielobajtowego zrzutu awaryjnego. Często izolowałem przyczynę awarii na podstawie zrzutu stosu i zweryfikowanych wersji sterowników załadowanych przez użytkowników na podstawie informacji o wersji wyświetlanych na liście sterowników. Jestem ciekaw, co myślisz: czy chcesz zobaczyć NT 4-style BSOD przeniesione do Systemu Windows 2000, lub czy nowy format BSOD wystarczy? Wyślij mi wiadomość e-mail, jeśli masz opinię. Przedstawię wyniki tego nieformalnego sondażu w następnym biuletynie. Chociaż jestem w temacie BSODs, pamiętaj, aby zapoznać się z aktualizacją systemu Windows 2000 ever-popular Systems Internals BlueScreen Screen Saver, która została omówiona w tym problemie.

Dziękujemy.

-Mark

CO NOWEGO W SYSTEMACH WEWNĘTRZNYCH

SDELETE

W ramach systemu Windows NT 4.0 spełniającego wymagania dotyczące klasyfikacji zabezpieczeń C2 implementuje "ochronę ponownie obiektu". Oznacza to, że nt zero zasobów plików i pamięci aplikacji przydziela, gdy aplikacje uzyskują dostęp do zasobów po raz pierwszy. Uniemożliwia to na przykład aplikacji utworzenie dużego pliku i sprawdzenie jego zawartości w celu sprawdzenia, co wcześniej było przechowywane na dysku. Jednak ochrona ponownego użycia obiektu nie obejmuje ochrony zasobów, które są dostępne przez aplikacje, które pomijają standardowe interfejsy API związane z zasobami lub całkowicie pomijają system operacyjny. Na przykład można użyć edytora dysków, takiego jak DiskProbe zestawu Resource Kit, aby zbadać zawartość nieprzydzielonych części dysku. Dzięki temu można zobaczyć dane, które wcześniej należały do usuniętych plików.

Wiele środowisk wymaga możliwości "bezpiecznego usuwania". Ta funkcja umożliwia użytkownikom trwałe usuwanie poufnych danych, dzięki czemu nie są widoczne przez narzędzia pomijające funkcje ochrony systemu operacyjnego. Pojawienie się systemu szyfrowania plików (EFS) podkreśliło potrzebę bezpiecznego usuwania w systemie Windows 2000. Podczas szyfrowania wcześniej niezaszyfrowanego pliku efs nie usuwa zawartości alokacji dysków, które zawierały niezaszyfrowane dane pliku, gdy zwalnia on alokacje dysków. W związku z tym, mimo że aktywna wersja szyfrowanego pliku jest bezpieczna, stara wersja pliku nadal istnieje w nieprzydzielonych częściach dysku, dopóki nie zostanie zastąpiona przez nowe dane pliku, które NTFS przypisuje do tych części.

Aby wypełnić tę dziurę, napisałem SDelete (Secure Delete). Jest to narzędzie wiersza polecenia, które umożliwia nie tylko bezpieczne usuwanie standardowych plików, ale także bezpieczne usuwanie wszystkich wcześniej usuniętych danych, które istnieją w nieprzydzielonych częściach dysku. Ponadto działa z skompresowanymi, zaszyfrowanymi i rozrzedowanymi plikami systemu Windows NT/2000, co wymaga użycia interfejsu API defragmentacji. SDelete stosuje się do Departamentu Obrony czyszczenia i oczyszczania standardu DOD 5220.22-M, dzięki czemu można mieć pewność, że po usunięciu danych, jego zniknął na zawsze.

Udostępniam element SDelete z pełnym kodem źródłowym i opisem jego działania, dzięki czemu można zobaczyć, jak korzysta z interfejsu API defragmentacji, i aby można było zweryfikować moje oświadczenia, że uniemożliwi odzyskanie poufnych usuniętych danych.

Dokumentację można znaleźć w interfejsie API defragmentacji systemu Windows NT/2000 pod adresem http://www.sysinternals.com/defrag.htm. Pobierz plik SDelete z pełnym kodem źródłowym pod adresem http://www.sysinternals.com/sdelete.htm.

AKTUALIZACJA WIN2K WYGASZACZA EKRANU BLUESCREEN

Zmiany wprowadzone przez firmę Microsoft na ekranie uruchamiania NT i układzie Blue Screen of Death (BSOD) w systemie Windows 2000 sprawiły, że system wewnętrzny wygaszacz ekranu BlueScreen wymaga dużej aktualizacji. Aby nadal zapewniać najwyższy poziom w realizmie BSOD, wydałem wersję 2.0 wygaszacza ekranu. Odzwierciedla nie tylko zmiany w formacie BSOD, ale także dokładnie naśladuje ekran uruchamiania systemu Windows 2000, wraz z rotacyjnymi aktualizacjami paska postępu i paska postępu. To tak naprawdę, że wygaszacz ekranu będzie oszukać nawet użytkowników i deweloperów systemu Windows 2000 ekspertów. Oczywiście w obszarze NT 4.0 BlueScreen Screen Saver nadal prezentuje NT 4.0 BSOD i ekrany uruchamiania.

Jak odtworzyć ekran startowy systemu Windows 2000 tak doskonale i jednocześnie nie naruszać praw autorskich? Nie dołączam grafiki mapy bitowej startowej systemu Windows 2000 z wygaszacza ekranu. Zamiast tego używam directX, aby przełączyć tryb graficzny na ten sam używany przez system Windows 2000 podczas sekwencji uruchamiania, a następnie odwołujem się do zasobów mapy bitowej pliku jądra systemu Windows 200, ntoskrnl.exe. Te zasoby (można je wyświetlić, otwierając zasoby ntoskrnl.exe w programie Visual Studio) to te, które są wyświetlane przez jądro, co jest zmianą z systemu Windows 9x sposobu wykonywania czynności, w których grafiki uruchamiania są faktycznie oddzielnymi plikami. Nie wygląda na to, że maszyny OEM komputera będą mieć możliwość dostosowania środowiska uruchamiania w systemie Windows 2000...

Wygaszacz ekranu BlueScreen można pobrać pod adresem http://www.sysinternals.com/bluescreen.htm. Jeśli masz humorystyczną historię związaną z oszukiwaniem kogoś z wygaszaczem ekranu, przekaż go.

Więcej informacji na temat tego, jak i dlaczego BSODs znajdują się w mojej kolumnie Windows NT Magazine NT Internals z grudnia 1997 r., "Inside the Blue Screen". Link na stronie Systems Internals Publications ( http://www.sysinternals.com/publ.htmPublikacje wewnętrzne systemów) spowoduje przejście do wersji lokalnej tej kolumny. Strona zawiera również linki do innych prezentacji online artykułów i kolumn, które zostały przeze mnie utworzone.

"LINUX I ENTERPRISE"

Ogromna reakcja społeczności systemu Linux na mój artykuł w kwietniowym wydaniu Windows NT Magazine o brakach skalowalności jądra systemu Linux skłoniła magazyn do opublikowania online wersji artykułu przed harmonogramem. Link do artykułu "Linux and the Enterprise" można znaleźć w sekcji "Artykuły" pod adresem http://www.sysinternals.com/publ.htm. W tym artykule opisano kilka ograniczeń bieżącej wersji jądra systemu Linux (2.2x), w tym brak wydajnego mechanizmu oczekiwania na zdarzenia, znaczące serializacji wywołań systemowych, bez asynchronicznej operacji we/wy i słabej implementacji pliku sendfile (w NT o nazwie TransmitFile) interfejs API gniazda. Połączenie tych ograniczeń uniemożliwia systemowi Linux konkurowanie z nt i innymi system UNIX, pod względem wydajności, w aplikacjach klasy korporacyjnej, takich jak serwery internetowe, serwery baz danych i serwery poczty e-mail.

"INSIDE NT UTILITIES"

Jeśli używasz filemon, Regmon lub HandleEx i chcesz dowiedzieć się więcej o tym, co ci mówią i jak są implementowane, to będziesz zainteresowany moją kolumną Magazynu Windows NT w lutym, "Inside NT Utilities". W tej kolumnie opisano wewnętrzne elementy tych narzędzi, a w przypadku regmonów i filemon nieco o kodach błędów i typach żądań, które rejestrują podczas przechwytywania działań rejestru lub systemu plików. Link do online wersji tego artykułu, który właśnie stał się dostępny, znajduje się w lokalizacji http://www.sysinternals.com/publ.htm.

MOJA KOLUMNA MAGAZYNU WINDOWS NT

Czy kiedykolwiek zastanawiasz się, jak system Windows NT/2000 organizuje zawartość rejestru w pamięci lub na dysku? Bieżąca (majowa) wersja magazynu Windows NT Magazine zawiera moją kolumnę "Inside the Registry", która informuje o tym i nie tylko. Na przykład dowiedz się, jak podsystem trybu jądra programu Configuration Manager (podsystem odpowiedzialny za zarządzanie rejestrem) wyszukuje klucze, przechowuje dane wartości, optymalizuje wyszukiwanie i chroni integralność plików rejestru na dysku. Windows NT Magazine, http://www.winntmag.com, jest dostępny w Borders i Barnes i Nobles.

NIE TAK NOWE RZECZY

Niedługo po wydaniu systemu Windows 2000 Beta 2 wziąłem kompilację Sprawdzone (debugowanie) pliku obrazu jądra (ntoskrnl.exe), czy wyszukiwanie ciągów w jądrze i pojawiło się lista nazw plików źródłowych używanych do kompilowania jądra. Sprawdzona kompilacja jądra NT/2000 zawiera wiele instrukcji Assert (kontrole spójności), które zawierają nazwę pliku, w którym znajduje się asercję. Zakładając, że praktycznie każdy plik o dowolnym znaczeniu w źródle jądra będzie miał w nim co najmniej jedną asercję, lista jest dość kompleksowa. Zrzut listy do skryptu Języka Java dał mi ładny widok drzewa przypominającego Eksploratora struktury katalogów drzewa źródłowego systemu Windows 2000. Sprawdź to pod adresem http://www.sysinternals.com/nt5src.htm.

WIADOMOŚCI WEWNĘTRZNE

DR. GUI'S POOR BEDSIDE MANIERY

W marcowym/kwietniowym wydaniu Microsoft Developer Network News Dr. GUI pola pytanie czytelnika, który pyta, jak sterownik może affinitize (wymusić użycie określonego procesora CPU) jego wątki. Dr GUI odpowiada, że nie ma możliwości określenia liczby procesorów w systemie od sterownika, i że wątek sterownika nie może powiedzieć, na jakim procesor jest uruchomiony. Niestety, dr GUI wiał tę diagnozę (może dr GUI powinien trzymać się GUIs).

Jądro NT (ntoskrnl.exe) eksportuje zmienną o nazwie KeNumberProcessors zdefiniowaną w ntDDK. H jako:

extern PCCHAR KeNumberProcessors;

Można go bezpośrednio odwołać w sterowniku w następujący sposób:

CHAR    i;

for( i = 0; i < *KeNumberProcessors; i++ ) {

    // do processor specific stuff
}

Aby określić, na którym procesorze jest uruchomiony wątek sterownika, użyj polecenia KeGetCurrentProcessorNumber(), innego eksportu jądra, który nie jest zdefiniowany tylko w NTDDK. H, ale jest rzeczywiście udokumentowany w DDK!

Dr GUI przepisał złe leki na tę dolegliwości, więc uprzejmie daj dr wiedzieć za pośrednictwem uprzejmego e-maila. Co zaskakujące, dr GUI nigdy nawet nie przyznał e-mail. Zobaczymy, czy dobry dr fesses do błędu w następnym problemie...

WIATR '99 WSCHÓD

Wydanie konferencji Premier konferencji dla deweloperów systemu Windows z 1999 roku zbliża się szybko. WinDev '99 East odbywa się 14-18 czerwca w Boston Cambridge Marriot. Mówi wiele wielkich nazwisk w rozwoju systemu Windows, w tym Jeff Richter, Jeff Prosise i Don Box. Będę tam z Jamie Hanrahan i Brian Catlin na torze kierowcy urządzenia. Moje prezentacje obejmują codzienny samouczek dotyczący wewnętrznych NT, a także jeden na piśmie sterowników systemu plików Windows NT/2K i jeden w zaawansowanych problemach z opracowywaniem sterowników sterowników urządzeń. Przyjdź i powiedz cześć!

STEROWNIK NUMEGA DZIAŁA WYPUSZCZAĆ NIEUCHRONNIE

Compuware NuMega Labs jest na skraju wydania zaawansowanego nowego zestawu deweloperów sterowników urządzeń z systemem Windows 9x/NT/2K, DriverStudio. DriverStudio łączy wszystkie istniejące narzędzia sterowników urządzeń NuMega, w tym DriverAgent, DriverWorks, SoftICE i VtoolsD oraz dodaje nowe narzędzia BoundsChecker dla sterowników i fieldAgent (tylko windows NT/2K).

Wersja sterownika urządzenia BoundsChecker zapewnia kompleksowe monitorowanie każdego interfejsu API jądra używanego przez sterownik i umożliwia monitorowanie interakcji sterownika z dowolnym innym sterownikiem urządzenia w systemie. Usługa FieldAgent umożliwia wdrożenie wersji sterownika BoundsChecker w systemach klienckich, dzięki czemu klienci mogą zbierać ślady, które można analizować. Wkrótce po bezpłatnej aktualizacji dla klientów DriverStudio są TrueTime dla sterowników i TrueCoverage dla sterowników, narzędzia, które umożliwiają łatwe dostrajanie wydajności i testowanie pokrycia sterowników urządzeń.

Ten pakiet jest ostatecznym zestawem deweloperów sterowników i bardzo polecam go (jestem w programie Beta). Dowiedz się więcej na stronie http://www.numega.com.

WERSJA BETA 3 DDK WYDANA

W połączeniu z wydaniem systemu Windows 2000 Beta 3 firma Microsoft udostępniła bezpłatnie pakiet Windows 2000 Beta 3 DDK (zestaw sterowników urządzeń). Klucz DDK można pobrać pod adresem http://www.microsoft.com/ddk/ddk2kb3.htm. Mam nadzieję, że zestaw SDK będzie dostępny wkrótce, ponieważ istnieje wiele interfejsów API Win32 w wersji Beta 3, które nie są udokumentowane w kwietniowej wersji MSDN.

SPINLOCKS W KOLEJCE WIN2K

System Windows 2000 używa nowego typu spinlock o nazwie "w kolejce spinlock" dla jego globalnych blokad. Globalne blokady w systemie Windows 2000 są takie same jak w przypadku systemu Windows NT 4.0 i obejmują:

  • KiDispatcherLock: blokada bazy danych harmonogramu
  • KiContext-SwapLock: blokada zamiany bieżnika
  • MmPfnLock: blokada bazy danych w ramce strony fizycznej
  • MmSystemSpaceLock: blokada przestrzeni adresowej trybu jądra
  • CcMasterSpinLock: globalny spinlock Menedżera pamięci podręcznej
  • CcVacbSpinLock: blokada mapowania tablicy menedżera pamięci podręcznej

W przypadku jednoprocesora w kolejce spinlocks działają dokładnie tak jak normalne spinlocki. Jednak w kompilacji wieloprocesorowej NT, kolejkowane spinlocks są znacznie różne. Podobnie jak standardowe spinlocki, kolejkowane spinlocks są implementowane w HAL. Jądro wywołuje funkcję KeAcquireQueuedSpinlock HAL, aby uzyskać w kolejce spinlock i wywołuje KeReleaseQueuedSpinlock wydanie kolejkowanego spinlocka. KeAcquireSpinlock i KeReleaseSpinlock, funkcje HAL używane przez jądro do uzyskiwania i wydawania standardowych spinlocks, wymagają adresu określonego spinlock jako parametru. Natomiast funkcje spinlock w kolejce przyjmują liczbę indeksów globalnego spinlocka. Jądro inicjuje globalne spinlocki w tablicy, gdzie każdy spinlock ma wstępnie zdefiniowany numer indeksu używany przez jądro do identyfikowania ich w hal. W związku z tym nie można zdefiniować kolejek spinlocks i używać ich przez sterowniki urządzeń, ponieważ nie ma możliwości rozszerzania globalnej tablicy spinlock w kolejce.

W systemie Windows 2000 każdy region sterowania procesorem (PCR) w SMP (istnieje jeden PCR dla każdego procesora) ma tablicę z dowolną liczbą wpisów w nim, ponieważ istnieją kolejkowane spinlocki. Każdy wpis tablicy zawiera dwa pola: wskaźnik do kolejkowanego spinlocka odpowiada (pole "spinlock" i "kolejka". W poniższym opisie, kiedy odwołujem się do pól spinlock i kolejki, mówię o polach skojarzonych z wpisem tablicy dla spinlock, który jest uzyskiwany lub zwalniany.

KeAcquireQueuedSpinlock działa w następujący sposób: funkcja próbuje uzyskać spinlock za pomocą instrukcji interlock-exchange procesora, aby umieścić adres PCR bieżącego procesora w spinlock. Jeśli spinlock jest przechowywany, funkcja ma, w ramach operacji wymiany, adres PCR innego procesora. Następnie funkcja identyfikuje się jako "oczekiwanie", przełączając niski bit pola spinlock we własnym PCR. Następnie umieszcza swój własny adres PCR w polu kolejki PCR, które pobrano z spinlocka. Na koniec czeka w pętli zajęty, aż niski bit zostanie wyłączony w polu spinlock, gdy bit jest wyłączony, a bieżący procesor został przyznany spinlock i dlatego powraca do wywołania funkcji pozyskiwania.

Po uzyskaniu przez procesor w kolejce spinlock i zakończeniu przetwarzania, które chciał wykonać podczas przechowywania blokady, wywołuje .KeReleaseQueuedSpinlock KeReleaseQueuedSpinlock Analizuje pole kolejki dla określonego spinlocka w bieżącym procesorze PCR. Jeśli pole kolejki jest inne niż zero, inny procesor ma "w kolejce" jego pcR tam. KeReleaseQueuedSpinlock czyści niską część pola spinlock dla czekającego PCR, a następnie czyści własne pole kolejki i zwraca. Czyszcząc niski bit w polu spinlock oczekiwania PCR, właśnie zasygnalizował następny procesor w wierszu, że może mieć blokadę. Jeśli pole kolejki było zerowe, żaden inny procesor nie czeka na blokadę i KeReleaseQueuedSpinlock po prostu wykonuje operację zablokowania wymiany w celu wyczyszczenia globalnego spinlocka.

Działanie kolejek spinlocks jest jednym, gdzie procesory "line up" czeka na spinlock, który jest przechowywany. Każdy procesor kolejkuje się, mówiąc przed nim, że czeka. Zapewnia to deterministyczne zamówienie na nabycie w kolejce procesorów spinlock nabyć spinlock w kolejności, w której żądają. Dla standardowych spinlocks nie ma takiego zamawiania. Kolejkowane spinlocks mają kolejną bardziej znaczącą przewagę. Gdy procesor obraca się czekając na jego pole spinlock, aby małe bity wyczyszczone, obraca się na pamięci prywatnej do własnego procesora. Gdy procesor jest zajęty czeka na standardowy spinlock obraca się na samym globalnym spinlocku, który jest współużytkowany przez wszystkie procesory. W związku z tym kolejkowane blokady spinlocks mają lepsze właściwości magistrali wieloprocesorowej, ponieważ nie ma dostępu współużytkowanego wiersza pamięci podręcznej podczas zajętego oczekiwania. Ponadto ze względu na kolejkowanie charakteru kolejek spinlocks, zwykle jest mniej operacji blokady magistrali niż w przypadku standardowych spinlocks, gdy blokada jest pod rywalizacją z kilku procesorów.

Spinlocks w kolejce to jedno z kilku ulepszeń, które firma Microsoft wprowadziła wieloprocesorowa skalowalność systemu Windows 2000.

CO SIĘ DZIEJE

System Windows 2000 zawiera wiele funkcji, które sprawiają, że są bardziej odporne na błędy operatorów i nieprawidłowo zachowywane aplikacje. Jednym z nich jest to, że wiele bibliotek DLL i sterowników w %systemroot%\system32 katalogu i %systemroot%\system32\drivers jest chronionych przez watchdog o nazwie System File Protector (SFP). Możesz zweryfikować jego istnienie, przechodząc do tego system32 katalogu i zmieniając ntoskrnl.exenazwę . Watchdog wznawia i powiadamia o wykryciu naruszenia chronionego pliku systemowego i naprawia go. Jeśli ponownie sprawdzisz katalog, okaże ntoskrnl.exe się, że został on magicznie zastąpiony. Następnym razem powiem ci, jak to działa.


Dziękujemy za przeczytanie biuletynu Systems Internals.

Opublikowana sobota, 15 maja 1999 19:15 pm przez ottoh

[Archiwum biuletynów ^][< Wolumin 1, Liczba 1][Wolumin 1, Liczba 3 >]