Tuesday, January 13, 2015

Udało mi się

Jakiś czas temu pisałem o problemie, okoliczności odtworzenia którego nie były trywialne. Chodzi mi o okna/notyfikacje, które poruszają tematykę rzekomo niskiej wydajności komputera, a których nachalność stanowi udrękę. Najpierw zrobiłem patcha (łatkę) do systemu, a potem odkryłem, że w systemie istnieje funkcja pozwalająca na wyłączenie schematu kolorów. Nie przyszło mi do głowy, że Microsoft pozwoliłby ot tak zmienić kompozycję jednym wywołaniem: ma to skutek globalny, przy uruchamianiu "zasobożernych" aplikacji powoduje często zawieszenie się systemu a w niektórych przypadkach uniemożliwia niektórym programom funkcjonowanie (np. Fraps, z tego co mi wiadomo, nie jest w stanie nagrywać bez kompozycji z przeźroczystoscią okien). Ale. Najpierw odkryłem ("złamałem") to okno.



Analizowałem kod w debugerze i ustaliłem, jak trzeba ten proces (dwm.exe) "szturchnąć", żeby to okno się pojawiło. Wystarczy oknu Menedżera okien pulpitu wysłać odpowiednią wiadomość. Pokażę teraz, jak każdy z Was może sprawić, żeby to okno się pojawiło (Windows 7), wysyłając procesowi 3 liczby :). Będzie to też pewnego rodzaju dowód, że z czterech liter sobie tego nie wyjąłem.

Pobierz program WindowHack. Służy do manipulowania oknami, bardzo przydatne narzędzie, moim zdaniem must-have dla każdej osoby zajmującej się programowaniem pod Windows.

Rozpakuj program, uruchom go. Kliknij drugi przycisk od lewej na samej górze (Show available windows).


W oknie poniżej wyszukaj "DWM Notification Window", kliknij prawym przyciskiem myszy i wybierz Get window.


Następnie, wybierz opcję jak na obrazku poniżej:


Pojawi się okno, w którym wpiszesz tylko wartości MSG, WPARAM i LPARAM (pola HWND nie ruszaj, będzie ono miało u Ciebie na pewno inną wartość).


Kliknij "Send Message" i najpewniej pojawi się omawiane na samym początku okno:


Istotnie, w polu LPARAM możesz podać wartości 201, 203, 400, 401 lub 405. Jak nie wierzysz to sprawdź :).

Wracając do meritum. Odkrywszy sposób na błyskawiczne i wygodne wywołanie tego okna, wszystko dalej potoczyło się z górki. Szybko odnalazłem miejsce w kodzie, gdzie zachodzi zmiana schematu. Zrobiłem łatkę, która zapobiega tej zmianie. Potem dowiedziałem się, że system oferuje funkcję wyłączenia tego schematu. Nic nie straciłem poza czasem. Ale dzięki temu mam 100% pewność, że uderzyłem we właściwe miejsce.

Jak wywoła się systemową funkcję zmieniającą kompozycję (lub schemat kolorów, jak kto woli), to znika przeźroczystość okien, w zasobniku systemowym pojawia się taki balon informacyjny:


...którego kliknięcie powoduje otwarcie takiego okna:


Powyższa zmiana często zachodzi, jak uruchomi się "ciężką aplikację" (grę, odtwarzanie wideo bardzo wysokiej jakości). Główną udręką jest fakt, że niektóre z tych powiadomień występują losowo, bez uzasadnienia. Okazuje się, że faktyczne zasoby komputera nie mają znaczenia. Potwierdza to opinia gościa, który twierdzi, że także otrzymuje takie komunikaty; na komputerze z dwoma dwunastordzeniowymi procesorami, 128GB RAM, dwiema kartami Nvidia 670 i dyskami SSD.[1].

Najwięcej czasu zabrało mi wywołanie tego okna i nie mam "przepisu", jak je wywołać, wysyłając procesowi wiadomość.


Tak na marginesie, z mojej analizy wynika, że to okno nie powinno się w ogóle pojawiać. Po prostu jeden z argumentów pewnej funkcji jest wpisany na stałe (ang. hard-coded) i teoretycznie nie ma możliwości, aby się ono "naturalnie" pojawiło. A najśmieszniejsze jest to, że w Internecie są zrzuty ekranu wykonane przez osoby, którym się to okno pojawiło. Magia. Co prawda zmieniłem pamięć procesu tak, żeby łatwo wywoływać sobie to okno, jest to niesamoistny sposób wywołania. Faktyczną kwestię pojawiania się tego okna dalej badam i najprawdopodobniej zabiorę się niedługo do pisania kolejnego programu "badawczego" :).

Wersja beta mojej łatki wygląda obecnie tak:


Może trochę straszyć, ale nie ma się czego bać.
Niedługo zostanie wydana.

No comments:

Post a Comment