Skąd nauczyć się WinAPI

0

Czy moglibyście mi polecić jakąś książkę albo witrynę w Internecie, która kompletnie opisywałaby programowanie pod Windows za pomocą WinAPI? Książki o asemblerze, które posiadam, zawierają wyrywkowy wstęp do tej tematyki, ale właśnie nie o to mi chodzi. Chodzi mi o kompletny podręcznik, a nie o przewodnik typu quick start. Mam na myśli głównie wykorzystanie WinAPI w asemblerze, ale też w C, ponieważ nie wszystko zrobię korzystając z biblioteki standardowej. Oficjalna dokumentacja Microsoftu opisuje różne procedury pojedynczo, ale ja potrzebowałbym jednak czegoś traktującego temat bardziej całościowo, włącznie z wyjaśnieniem całego systemu wywoływania API, bo to nie jest takie proste jak w DOS-ie. To może być publikacja anglojęzyczna, ale jednak lepiej jakby znalazło się coś po polsku. Może mieć 900 stron, to akurat nie problem, byle by było kompletne.

1

https://lubimyczytac.pl/ksiazka/231308/programowanie-windows - kiedyś było coś takiego, ale nie wiem, czy było jakieś uaktualnienie.

0

Zasadniczo musi być kompatybilne z Windowsem 7 i 10, żeby to miało większy sens.

0

Ja korzystam tylko z microsoftu i czasem z innych stron co się wygoogluje.
Tu jest ładnie podzielone na różne części winapi:
https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-api-list

Jak surowe syscalle piszę, ale to zwykle pod linuxem to używam:
https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md

Windows ma swoje odpowiedniki więc jak widzisz, że coś istnieje w jednym systemie to jest i w drugim, coś jak z frameworkami wiesz jak coś zrobić w vue podobnego szukasz w react lub innych.

Chodź nie wszystko jest takie samo, np. windows ma tokeny, a linux masz uid, guid jeśli chcesz zmienić uprawnienia procesu.
Na linuxie masz syscalle fork i clone, pierwszy robi nowy process, drugi nowy thread.
Na windowsie odpowiednik to NtCreateProcess Zw.

Ja raczej uczę się w stylu, chcę aplikację zrobić w winapi gui.
To trochę googluje jak utworzyć okno.
Potem jak dodawać elementy do okna, jak utworzyć menu bar, button itp.
Jak eventy obsługiwać, kliknięcie myszką, jakieś zdarzenia okna jak minimalizowanie, move, klawiatura.

Jak bym się skupiał na obsłudze plików to tak jak na linuxie robisz open, potem read i close, a zawartość na stdout.
To na windowsie zrobisz CreateFileA, ReadFile, CloseHandle i praktycznie taki sam proces jest.

Oczywiście standardowa biblioteka opakowuje to w C i C++, że w zależności od systemu operacyjnego używasz odpowiednich systemowych operacji, dzięki temu jest przenośne co do architektury i systemu operacyjnego.

1

Masz https://cpp0x.pl/kursy/Kurs-WinAPI-C++/167

Winapi jest ok, jak zrobisz antyalising na grafice to daj znać(żeby czcionka ładnie wyglądała) bo już zapomniałem jak to się robi.
Chyba trochę przesadzasz ze skomplikowaniem tego. To jest jedna jedna pętla która odczytuje wszystkie zdarzenia.

1

Zadajesz dziwne pytania. Microsoft dokładnie udokumentował swoje api, link już podano powyżej. I nie to nie jest skomplikowane, jest proste do bólu. Co nie znaczy, że prosto jest osiągnąć zamierzony efekt, trzeba się dużo narzeźbić.

2

https://learn.microsoft.com/en-us/windows/win32/learnwin32/learn-to-program-for-windows.

Od siebie dodam, że nie idź w to. Jest to całkowicie nieprzydatne, jeśli chcesz klepać apki desktopowe. WinApi to strasznie złe API i nie warto się go uczyć. Jedyne zastosowanie to bycie Windowsowym hackerem, który chce wiedzieć jak to działa pod spodem, ale to bardzo nisza. Dużo lepiej uczyć się internalów linuxa, bo jest opensource a znajomość linuxa jest dużo bardziej przydatna (pod kątem zawodowy)

2

E tam od razu złe. Powiedz raczej, że zmieniły się trendy i dziś już się tak oprogramowania nie pisze. To jest api proste jak budowa cepa, problem w tym że cep to bardzo proste narzędzie, więc osiągnięcie efektu przystającego to dzisiejszych standardów jest pracochłonne.

I warto dodać, że to jest naprawdę api tylko do bezpośredniej interakcji z systemem. A to za mało, żeby stworzyć poważną aplikację, gdzie wymagana jest np integracja z jakimś api (rest, soap), bazą danych itd. Trzeba używać niskopoziomowych bibliotek dla c+, socketów i to tu jest największy ból bo jeśli wystarczy ci wygląd natywny windowsa bez wodotrysków graficznych to okno od biedy narysujesz i obsłużysz. Ale to zwykle za mało.

0
slsy napisał(a):

https://learn.microsoft.com/en-us/windows/win32/learnwin32/learn-to-program-for-windows.

Od siebie dodam, że nie idź w to. Jest to całkowicie nieprzydatne, jeśli chcesz klepać apki desktopowe. WinApi to strasznie złe API i nie warto się go uczyć. Jedyne zastosowanie to bycie Windowsowym hackerem, który chce wiedzieć jak to działa pod spodem, ale to bardzo nisza. Dużo lepiej uczyć się internalów linuxa, bo jest opensource a znajomość linuxa jest dużo bardziej przydatna (pod kątem zawodowy)

+1

gajusz800 napisał(a):

E tam od razu złe. Powiedz raczej, że zmieniły się trendy i dziś już się tak oprogramowania nie pisze. To jest api proste jak budowa cepa, problem w tym że cep to bardzo proste narzędzie, więc osiągnięcie efektu przystającego to dzisiejszych standardów jest pracochłonne.

+1

Przy czym również błędne.
Jedna z funkcji zwraca BOOL, opis w przepraszającym tonie mówi, ze sorry, ale zwraca (ichniejsze) "true" w przypadku niepowodzenia, po prostu zawsze

Manna5 napisał(a):

Mam na myśli głównie wykorzystanie WinAPI w asemblerze, ale

Ale oprócz tego wszystko w porządku ?
Nawet 30 lat temu, na wiele biedniejszym sprzęcie, nie pisano aplikacji w asemblerze

0

Czasem się używa tego winapi, ale raczej niekomercyjnie, a raczej do hakowania, reverse engineeringu.

Jak shellcode to raczej wolałbyś mieć bardzo mało kodu, to możesz sobie zrobić połączenie tcp + przekierowanie danych z i stdin/stdout na sockety odpowiednio w assemblerze z winapi.

Jakieś rysowanie po innych programach, alokowanie stron pamięci lub zmienianie uprawnień.
Uruchamianie zdalnych threadów, gdzie możemy wewnątrz innego procesu odpalić własny kod.
Modyfikować innych procesów pamięć.

Jeśli analizujemy aplikację co robi to możemy podejrzeć jakie systemowe syscalle wywołuje, badając to wiemy co malware może modyfikować w systemie, więc musimy trochę wiedzieć jak działają.
Czy otwierają jakieś pliki, modyfikują rejestry w systemie, grzebią w schowku etc.
Potem wiedząc czego szukamy można breakpointy na te syscalle ustawić i bardzo szybko znaleźć fragment kodu, który tworzy plik, wysyła jakieś dane, szyfruje coś.
Oczywiście wypada tu znać assemblera / c / c++.

Jakieś enumerowanie szyny PCI -> USB -> Device, komunikacja z urządzeniem niskopoziomowa, można też różne operacje na karcie sieciowej wykonywać jak dostępne sieci itp.

Później hakowanie kernela jeśli modyfikujemy syscalle, przykładowo jeśli będzie jakaś magiczna wartość w syscallu to wykonuje się nasz kod, a jak coś innego to jest wykonywany zwykły syscall.
Jeśli chce się programować w kernelu windowsa to warto znać winapi, bo od wewnątrz praktycznie wyłącznie korzystasz z syscalli tylko że musisz tam zwykle Zw na początku dopisać każdego wywołania.

Można dość prosto w jakiejś grze narysować menu za pomocą winapi taki overlay na daną aplikacją, nadsłuchiwać wciśnięte klawisze i np. ukrywać/pokazywać po naciśnięciu klawisza.
A po kliknięciu sprawdzać czy overlay jest pokazany, obliczać gdzie się kliknęło i później modyfikować jakieś struktury danego procesu.

Da się też jakiś interface wystawić żeby móc oskryptowywać jakieś aplikacje, które normalnie nie ma żadnego interface, czy to bota zrobić.

0

Od siebie dodam, że nie idź w to. Jest to całkowicie nieprzydatne, jeśli chcesz klepać apki desktopowe. WinApi to strasznie złe API i nie warto się go uczyć. Jedyne zastosowanie to bycie Windowsowym hackerem, który chce wiedzieć jak to działa pod spodem, ale to bardzo nisza. Dużo lepiej uczyć się internalów linuxa, bo jest opensource a znajomość linuxa jest dużo bardziej przydatna (pod kątem zawodowy)

Może przy tworzeniu aplikacji sieciowo-serwerowych rzeczywiście lepiej znać Linux (i inne systemy uniksopodobne), ale jakbym chciał stworzyć jakiś program na sprzedaż do użytku domowego, to musi być pod Windows. I rzecz jasna mieć interfejs graficzny, którego nie da się zrobić za pomocą biblioteki standardowej C. Wiem, że istnieją biblioteki GUI wyższego poziomu, m. in. Qt, ale one zawsze będą miały jakieś ograniczenia, więc chyba lepiej poznać WinAPI i utrzymać pełną kontrolę nad wszystkim. Czas nauki nie gra roli, bo jestem młody i mam go mnóstwo.

Nawet 30 lat temu, na wiele biedniejszym sprzęcie, nie pisano aplikacji w asemblerze

Ja mówię i o asemlerze i o C, przecież API jest to samo, tylko że w asemblerze trzeba znać konwencje wywoływania i podobne kwestie, ale zgrubsza działa to tak samo.

0
Manna5 napisał(a):

Ja mówię i o asemlerze i o C, przecież API jest to samo, tylko że w asemblerze trzeba znać konwencje wywoływania i podobne kwestie, ale zgrubsza działa to tak samo.

No tylko że konwencja wywołania na architekturze x64 pod Windows jest mocno pokręcona, a jeszcze trudniej obsłużyć ją tak, żeby kod był zjadliwy dla debuggera z podziałem na funkcje, a nie był tylko zlepkiem instrukcji. Jeśli już chcesz iść tą drogą to zacznij od 32 bitów, jest znacznie prościej.

1
Manna5 napisał(a):

Mam na myśli głównie wykorzystanie WinAPI w asemblerze

ja się tego uczyłem jakieś 20 lat temu z iczelion's tutorials. wersję polską można znaleźć tutaj: https://eduinf.waw.pl/inf/prg/002_winasm/index.php

0

Skoro chcesz się uczyć, to czemu chcesz się uczyć rzeczy bezużytecznych? Jeśli desktop, to daj spokój z C++ i popatrz raczej na C# i .net. Zresztą w ogóle odradzam desktop, to dziś mało znacząca nisza. Jeśli chcesz robić aplikacje na sprzedaż, to zajmij się aplikacjami webowymi lub mobilnymi, a jeśli już desktop to na pewno WinApi nie ma sensu.

0
Manna5 napisał(a):

Może przy tworzeniu aplikacji sieciowo-serwerowych rzeczywiście lepiej znać Linux (i inne systemy uniksopodobne), ale jakbym chciał stworzyć jakiś program na sprzedaż do użytku domowego, to musi być pod Windows. I rzecz jasna mieć interfejs graficzny, którego nie da się zrobić za pomocą biblioteki standardowej C. Wiem, że istnieją biblioteki GUI wyższego poziomu, m. in. Qt, ale one zawsze będą miały jakieś ograniczenia, więc chyba lepiej poznać WinAPI i utrzymać pełną kontrolę nad wszystkim. Czas nauki nie gra roli, bo jestem młody i mam go mnóstwo.

Na prawdę: nie warto. Nikt nie pisze takich rzeczy w gołym WinAPI, bo projektowanie GUIa to cholernie ciężki temat. Dlatego co chwilę powstaje nowy framework webowy w JSie, bo sposób renderowania jest ciągle ten sam (HTML i CSS) natomiast spięcie tego w logiczną całość to ogromny problem designerski.

Moja rada: poucz się Qt, jeśli chcesz bardzo natywne. Ewentualnie ogarnij sobie np. takiego Flutter Desktop, bo to dość nowatorskie i całkiem przyjemne rozwiązanie pod względem wydajności i przyjemności pisania.

C to też słaby pomysł, jeśli chodzi o pisanie GUIa, bo jest dość toporny i brakuje ficzerów pozwalających na swobodne abstrachowanie kawałków kodu pod postacią komponentów.

0

Ciężko doradzić, jak samemu się nie używa.
Manual windy jest i nie jest tragiczny ale to dalej słabo bo manual powinno się czytać z linii komend.

Odradzać to pierwsza myśl, ale matko to tylko funkcje, taka nauka nie musi być zła. A w przyszłości da niejako porównanie z innymi rozwiązaniami na innych sys.
Doradzam olać win sockets i multithreads.

Często duże biblioteki masz w jednym pdf/html warto poszukać. Możesz takiego wertować strona po stronie i testować co robia funkcje po kolei.
Bedzie to prawdopodobnie dla Ciebie nie najgorsza nauka.

Ja wiem czego ty szukasz i jakby chodzilo o posixa to mógłbym jakieś pozycje polecić. Niestety z windowsem nie umiem, nie znam dobrych pozycji do programowania w C z winapi.

Udanej nauki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1