L'interfaccia di programmazione delle applicazioni dei sistemi operativi Windows è rappresentata da un insieme di funzioni. Quando vengono chiamati, possono essere creati vari oggetti (file, processi, thread, oggetti di sincronizzazione, ecc.). Per fornire un accesso sufficientemente astratto e unificato a questi oggetti, la loro identificazione viene eseguita utilizzando descrittori - valori numerici "impersonali".
Necessario
- - un traduttore da un linguaggio di programmazione che consente l'utilizzo delle API di Windows;
- - possibilmente Windows Platform SDK.
Istruzioni
Passo 1
Ottieni maniglie per finestre. Ci sono molti modi per farlo. Il metodo esatto dipende dall'obiettivo finale.
Utilizzare le API CreateWindow o CreateWindowEx per creare una finestra. Restituiscono un handle in caso di successo e NULL in caso di fallimento.
Cerca le finestre di primo livello e le finestre figlie in base a vari parametri utilizzando rispettivamente le funzioni FindWindow e FindWindowEx. In caso di ricerca riuscita, si otterrà l'handle della finestra.
Enumerare le finestre con le funzioni EnumWindows, EnumChildWindows, EnumThreadWindows. Gli handle delle finestre trovate verranno passati come parametro alla funzione di callback.
Trova la maniglia della finestra situata in una posizione specifica sullo schermo. Chiama una delle funzioni: WindowFromPoint, ChildWindowFromPoint o ChildWindowFromPointEx.
Passo 2
Ottieni handle di processo. Creare un nuovo processo chiamando le funzioni API CreateProcess, CreateProcessAsUser, CreateProcessWithTokenW o CreateProcessWithLogonW. Tutti restituiscono un handle al nuovo processo nel campo hProcess della struttura PROCESS_INFORMATION, il puntatore a cui deve essere passato come ultimo parametro.
Trova l'handle del processo in base al suo identificatore noto. Usa la chiamata OpenProcess. Gli ID di tutti i processi in esecuzione possono essere ottenuti, ad esempio, utilizzando le funzioni CreateToolhelp32Snapshot, Process32First e Process32Next della libreria Tool Help.
Recupera lo pseudo handle del processo corrente utilizzando la funzione GetCurrentProcess.
Passaggio 3
Ottieni descrittori di thread. Le funzioni CreateThread e CreateRemoteThread creano thread rispettivamente nel proprio processo e in quello di qualcun altro, restituendo i relativi handle. È possibile aprire un thread esistente utilizzando il suo identificatore e ottenere l'handle corrispondente utilizzando la funzione OpenThread. Lo pseudo-handle del flusso corrente viene restituito quando viene chiamato GetCurrentThread.
Passaggio 4
I descrittori per file, directory, dischi fisici, volumi disco, console, risorse di comunicazione (porte I/O), mail slot e named pipe possono essere ottenuti chiamando una singola funzione, CreateFile.
Passaggio 5
I descrittori di oggetti di mappatura file-memoria vengono restituiti dalle chiamate a CreateFileMapping e OpenFileMapping.
Passaggio 6
Le funzioni CreateMutex, CreateSemaphore e CreateEvent creano e le funzioni OpenMutex, OpenSemaphore e OpenEvent aprono oggetti di sincronizzazione esistenti (mutex, semafori ed eventi). Tutti restituiscono descrittori.
Passaggio 7
Tutti gli oggetti GDI (come i contesti di dispositivo, i caratteri, i pennelli, le matite, le bitmap dipendenti e indipendenti dall'hardware, le sezioni DIB, ecc.) vengono manipolati tramite i loro descrittori. Le funzioni per la creazione di oggetti GDI sono numerose e si consiglia di consultare nella sezione MSDN per informazioni su di esse.
Passaggio 8
Un descrittore ottenuto in un processo, di regola, non può essere utilizzato in un altro. Tuttavia, in alcuni casi è possibile ottenere un descrittore duplicato corrispondente all'oggetto primario. Chiama l'API DuplicateHandle per duplicare l'handle. Questo può essere utilizzato, ad esempio, per condividere oggetti o canali di sincronizzazione senza nome tra più processi.