Interfejs programowania aplikacji systemów operacyjnych Windows jest reprezentowany przez zestaw funkcji. Po ich wywołaniu można tworzyć różne obiekty (pliki, procesy, wątki, obiekty synchronizacji itp.). Aby zapewnić wystarczająco abstrakcyjny i ujednolicony dostęp do tych obiektów, ich identyfikacja odbywa się za pomocą deskryptorów – „bezosobowych” wartości liczbowych.
Niezbędny
- - tłumacz z języka programowania, który umożliwia korzystanie z Windows API;
- - ewentualnie SDK platformy Windows.
Instrukcje
Krok 1
Zdobądź klamki do okien. Istnieje wiele sposobów, aby to zrobić. Dokładna metoda zależy od celu końcowego.
Użyj interfejsów API CreateWindow lub CreateWindowEx, aby utworzyć okno. Zwracają uchwyt w przypadku sukcesu i NULL w przypadku niepowodzenia.
Wyszukaj okna najwyższego poziomu i okna podrzędne według różnych parametrów, używając odpowiednio funkcji FindWindow i FindWindowEx. Po udanym wyszukiwaniu zostanie uzyskana klamka okna.
Wylicz okna za pomocą funkcji EnumWindows, EnumChildWindows, EnumThreadWindows. Uchwyty znalezionych okien zostaną przekazane jako parametr do funkcji zwrotnej.
Znajdź klamkę do okna znajdującą się w określonym miejscu na ekranie. Wywołaj jedną z funkcji: WindowFromPoint, ChildWindowFromPoint lub ChildWindowFromPointEx.
Krok 2
Uzyskaj uchwyty procesów. Utwórz nowy proces, wywołując funkcje API CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW lub CreateProcessWithLogonW. Wszystkie zwracają uchwyt do nowego procesu w polu hProcess struktury PROCESS_INFORMATION, do którego wskaźnik należy przekazać jako ostatni parametr.
Znajdź dojście do procesu według jego znanego identyfikatora. Użyj wywołania OpenProcess. Identyfikatory wszystkich uruchomionych procesów można uzyskać, na przykład, za pomocą funkcji CreateToolhelp32Snapshot, Process32First i Process32Next z biblioteki pomocy narzędzi.
Pobierz pseudouchwyt bieżącego procesu za pomocą funkcji GetCurrentProcess.
Krok 3
Uzyskaj deskryptory wątków. Funkcje CreateThread i CreateRemoteThread tworzą wątki odpowiednio we własnym i cudzym procesie, zwracając ich uchwyty. Możesz otworzyć istniejący wątek za pomocą jego identyfikatora i uzyskać odpowiedni uchwyt za pomocą funkcji OpenThread. Pseudo-uchwyt bieżącego przepływu jest zwracany po wywołaniu GetCurrentThread.
Krok 4
Deskryptory plików, katalogów, dysków fizycznych, woluminów dyskowych, konsol, zasobów komunikacyjnych (portów we/wy), gniazd pocztowych i nazwanych potoków można uzyskać, wywołując pojedynczą funkcję CreateFile.
Krok 5
Deskryptory obiektów mapowania plików do pamięci są zwracane przez wywołania funkcji CreateFileMapping i OpenFileMapping.
Krok 6
Funkcje CreateMutex, CreateSemaphore i CreateEvent tworzą, a funkcje OpenMutex, OpenSemaphore i OpenEvent otwierają istniejące obiekty synchronizacji (muteksy, semafory i zdarzenia). Wszystkie zwracają deskryptory.
Krok 7
Wszystkie obiekty GDI (takie jak konteksty urządzeń, czcionki, pędzle, ołówki, bitmapy zależne i niezależne od sprzętu, sekcje DIB itp.) są manipulowane za pomocą ich deskryptorów. Funkcje tworzenia obiektów GDI są liczne i należy się z nimi zapoznać w sekcji MSDN, aby uzyskać informacje na ich temat.
Krok 8
Deskryptor uzyskany w jednym procesie z reguły nie może być użyty w innym. Jednak w niektórych przypadkach możliwe jest uzyskanie duplikatu deskryptora odpowiadającego obiektowi pierwotnemu. Wywołaj interfejs API DuplicateHandle, aby zduplikować dojście. Można to wykorzystać na przykład do współdzielenia nienazwanych obiektów synchronizacji lub kanałów między wieloma procesami.