30.01.2009 Win32 Systemprogrammierung 1 Begrüßung Begrüßung Win32 Systemprogrammierung Fachhochschule Wiesbaden Lehrveranstaltung: Systemprogrammierung Prof. Dr. Weber Christian Geiler [email protected]Daniel Pielok [email protected]Fouad Aberkane [email protected]
105
Embed
Win32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj0809/win32.pdf · 30.01.2009 Win32 Systemprogrammierung 6 1.1 Einführung Versionen Win32 ist die 32-Bit-API für moderne
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Ausgeschrieben steht WinAPI fürWindows Application Programming Interface.Zu dt. bedeutet es Windows Anwendungs-Programmierungs- Schnittstelle.Die WinApi ist nix anderes als eine Programmierschnittstelle und Laufzeitumgebung. Mit dieser Api kann man Anwendungsprogrammen für Microsoft Windows-Betriebssysteme erstellen
30.01.2009 Win32 Systemprogrammierung 4
1.1 Einführung1.1 Einführung
WinApi
Die existierenden Funktionen der WinAPI sind ausschließlich in der Programmiersprache C und Assembler geschrieben.Die Funktionen befinden sich in Bibliotheken, den sogenannten DLL-Dateien, wie beispielsweise kernel32.dll, user32.dll und gdi32.dll. Die Api kann in Verbindung mit C, C++ oder Delphi eingesetzt werden.
30.01.2009 Win32 Systemprogrammierung 5
1.1 Einführung1.1 Einführung
Versionen
Win16 war die erste API, für die 16-Bit Versionen von Microsoft Windows. Gängiger Begriff war schlicht Windows API, wurde aber später umbenannt in Win16, um sie von der neueren Windows API der 32-Bit-Architektur unterscheiden zu können. Die Funktionen der Win16 API liegen hauptsächlich im Kern des Betriebssystems: kernel.exe (oder krnl286.exe oder krnl386.exe), user.exe und gdi.exe. Trotz der Dateiendung exe sind diese Dateien tatsächlich sogenannte Programmbibliotheken.
30.01.2009 Win32 Systemprogrammierung 6
1.1 Einführung1.1 Einführung
Versionen
Win32 ist die 32-Bit-API für moderne Versionen von Windows. Die API besteht aus Funktionen, die, wie bei Win16, in Programmbibliotheken implementiert sind. Die Kern-DLLs von Win32 sind kernel32.dll, user32.dll und gdi32.dll. Win32 wurde mit Windows NT eingeführt. Die Version von Win32, die mit Windows 95 ausgeliefert wurde, lief ursprünglich unter dem Namen Win32c, wobei das 'c' für Kompatibilität (engl. compatibility) stand, aber dieser Ausdruck wurde später von Microsoft zugunsten von Win32 wieder verworfen.
30.01.2009 Win32 Systemprogrammierung 7
1.1 Einführung1.1 Einführung
Versionen
Win32s ist die 32-Bit-API für die Windows 3.1x-Familie von Microsoft Windows und als solche die 32-Bit-Erweiterung für die ansonsten 16-bittigen Betriebssysteme. Das „s“ steht für Teilmenge (engl.: „subset“). Dabei wurden die Funktionsbibliotheken aus Windows NT nicht komplett übernommen, sondern lediglich eine Auswahl daraus, so ist beispielsweise MS Office 97 unter Windows NT 3.51 lauffähig, nicht jedoch unter Windows 3.1x. In Kombination mit Grafikschnittstellen wie OpenGL oder Video for Windows sollte damit jedoch bis zum Erscheinen von Windows 95 ein ausreichender Standard für Heimanwender gesetzt werden.
30.01.2009 Win32 Systemprogrammierung 8
1.1 Einführung1.1 Einführung
Versionen
Win32 für 64-Bit-Windows, auch bekannt unter dem Namen Win64, ist die Version der API die für 64-Bit-Versionen von Windows – namentlich Windows XP „x64 Edition“, Windows Server 2003 „x64 Edition“ (für AMD64 Prozessoren), Windows XP 64-Bit Edition und Windows Server 2003 für Itanium-Serien - entworfen wurde. Bei den 64-Bit-Versionen handelt es sich nur um zwei weitere unterstützte Plattformen innerhalb der Windows-NT-Architektur, so dass sowohl die 32-Bit- als auch die 64-Bit-Version einer Anwendung aus demselben Quellcode kompiliert werden können.
30.01.2009 Win32 Systemprogrammierung 9
1.2 Dateisysteme1.2 Dateisysteme
Dateisysteme
Das Dateisystem ist die Ablageorganisation auf einem Datenträger eines Computers. Dateien müssen gelesen, gespeichert oder verschoben werden. Für den Menschen müssen Dateiname und computerinterne Dateiadressen in Einklang gebracht werden. Das leichte Wiederfinden und das sichere Abspeichern ist wesentlich. Das Ordnungs- und Zugriffssystem berücksichtigt die Geräteeigenschaften und ist normalerweise Bestandteil des Betriebssystems.
30.01.2009 Win32 Systemprogrammierung 10
1.2 Dateisysteme1.2 Dateisysteme
Welche Dateisysteme gibt es?
FAT16 FAT32HPFSNTFS NetWareISO 9660 (CD-ROM) und ISO 13346 (DVD)UDFReiserFS, ext, ext2, ext3, XFS, JFS
30.01.2009 Win32 Systemprogrammierung 11
1.2 Dateisysteme1.2 Dateisysteme
Betriebssysteme & Dateisysteme
Die Betriebssysteme Windows 95 bis Windows ME benutzen ausschließlich FAT16 & FAT32 Systeme. Die folgenden Systeme Windows NT / 2000 / XP benutzen NTFS. Anders als bei Windows Betriebssystemen benutzt Unix/Linux ext2, ext3, ReiserFS, XFS, JFS.
30.01.2009 Win32 Systemprogrammierung 12
1.3 I/O Systemaufrufe1.3 I/O Systemaufrufe
Systemaufrufe
Ein Systemaufruf ist eine vom Anwendungsprogrammen benutzte Methode, um vom Betriebssystem bereitgestellte Funktionalitäten auszuführen.Systemaufrufe werden im Quellcode wie Bibliotheksfunktionen aufgerufen. Jedoch die Leistung solch eines Systemaufrufs wird im Kern des Betriebssystems erbracht. Ein Systemaufruf führt Assemblercode und C Code aus. In der folgenden Abbildung wird ein Systemaufruf schematisch dargestellt.
30.01.2009 Win32 Systemprogrammierung 13
1.3 I/O Systemaufrufe1.3 I/O Systemaufrufe
Ablauf
In der Definition der Funktionwrite befindet sich C/Assemblercode diese Zeilen haben die Aufgabe den Adressraumzu wechseln und zwarvom Adressraum des Prozessesin den Adressraum des Kern's
30.01.2009 Win32 Systemprogrammierung 14
1.3 I/O Systemaufrufe1.3 I/O Systemaufrufe
Systemaufruf BeispieleUnix Win32 Beschreibungopen CreateFile Neue Datei erzeugen oder Datei öffnen
close CloseHandle Datei schließen
read ReadFile Daten aus einer Datei lesen
write WriteFile Daten in eine Datei schreiben
lseek SetFilePointer Warten auf ein Ereignis
stat GetFileAttributes Dateizeiger bewegen
unlink DeleteFile Datei löschen
mkdir CreateDirectory Neues Verzeichnis erzeugen
rmdir RemoveDirectory Leeres Verzeichnis löschen
30.01.2009 Win32 Systemprogrammierung 15
1.3 I/O Systemaufrufe1.3 I/O Systemaufrufe
CreateFileDie Funktion CreateFile erzeugt eine Datei der Rückgabewert dieser Funktion ist ein Handle womit man später die Datei eindeutig identifizieren kann.HANDLE CreateFile (
Mutex bedeutet Wechselseitiger Ausschluss (mutual exclusion).Ein Mutex ist nix anderes als eine Gruppe von Verfahren mit denen das Problem des kritischen Abschnitts gelöst wird.Damit wird verhindert, dass nebenläufige Prozesse gleichzeitig oder zeitlich verschränkt gemeinsam genutzte Datenstrukturen unkoordiniert verändern. Zu dieser Gruppe gehören zB. Semaphore, Monitore, Lock.
30.01.2009 Win32 Systemprogrammierung 20
1.4 File Locking1.4 File Locking
File Locking
Das File Locking ist einfaches Prinzipe das folgendermaßen vorgeht nach dem dem Öffnen einer Datei für andere automatisch gesperrt. Es ist notwendig damit zwei Nutzer nicht gleichzeitig eine Datei manipulieren.Es kann immer nur ein Anwender bzw. immer nur ein Anwendungsprogramm zu einer Zeit die Datei manipulieren. File Locking wird in Netzwerkumgebungen oder auf multitaskingfähigen Systemen wie beispielsweise Windows-Rechnern eingesetzt
30.01.2009 Win32 Systemprogrammierung 21
1.4 File Locking1.4 File Locking
LockFile
Die WinApi stellt die Funktionalität für das File Locking zur Verfügung mit der Methode LockFile kann man eine ganze Datei oder bestimmte Abschnitte in Bytes für andere Prozesse sperren.BOOL WINAPI LockFile(
HANDLE hFile, /*Datei*/
DWORD dwFileOffsetLow, /*Offset*/
DWORD dwFileOffsetHigh, /*Offset*/
DWORD nNumberOfBytesToLockLow, /*Lock bytes*/
DWORD nNumberOfBytesToLockHigh /*Lock bytes*/
);
30.01.2009 Win32 Systemprogrammierung 22
1.4 File Locking1.4 File Locking
UnlockFile
Natürlich muss die gesperrte Datei bzw. der Abschnitt wieder für andere Prozesse zugänglich sein dafür gibt’s die Funktion UnlockFile sie besitzt dieselben argumente wie die Funktion LockFile.BOOL WINAPI UnlockFile(
HANDLE hFile, /*Datei*/
DWORD dwFileOffsetLow, /*Offset*/
DWORD dwFileOffsetHigh, /*Offset*/
DWORD nNumberOfBytesToUnlockLow, /*Unlock bytes*/
DWORD nNumberOfBytesToUnlockHigh /*Unlock bytes*/
);
30.01.2009 Win32 Systemprogrammierung 23
1.4 File Locking1.4 File Locking
File Locking Beispiel#include<windows.h>
#define ANFANG 10#define ENDE 20
HANDLE hFile;
hFile = CreateFile(TEXT("two.txt"), /* Datei öffnen*/ GENERIC_READ, /* Datei lesen*/ FILE_SHARE_READ, /* Mehrfache Lesen*/ NULL, /* Security Atrribut wird nich gebraucht */ OPEN_EXISTING, /* Öffnen oder erstellen*/ FILE_ATTRIBUTE_NORMAL, /* Normale Datei*/ NULL); /* Kein Template*/
Zentrale, hierarchische Datenbank für Applikations- und KonfigurationsinformationenRegistry-Editor wird durch den „regedit“ Befehl geöffnet auf der KommandozeileZugriff durch SchlüsselProgramme kommunizieren mit der Registry durch Registry API FunktionsaufrufeRegistry-Programmierung ähnlich zur Dateiverarbeitung
30.01.2009 Win32 Systemprogrammierung 26
2.1 Windows Registry2.1 Windows Registry
Registry
Registry enthält folgende Informationen:Betriebssystem-Versionsnr., Build-Nr. und registrierte Userähnliche Informationen für jede installierte ApplikationHardware-Informationen über Prozessortyp, Anzahl an
bevorzugte Anwendungen)installierte ServicesMappings von Dateiendungen zu deren ausführbaren
Programmen und Mappings von Netzwerkadressen zu deren Hostnamen
30.01.2009 Win32 Systemprogrammierung 27
2.1 Windows Registry2.1 Windows Registry
Registry
30.01.2009 Win32 Systemprogrammierung 28
2.1 Windows Registry2.1 Windows Registry
Registry-Schlüssel
HKEY_LOCAL_MACHINE – Informationen über den Rechner und darauf installierte SoftwareHKEY_USERS – Informationen über Benutzer-KonfigurationenHKEY_CURRENT_CONFIG – Informationen wie Bildschirmauflösung und SchriftartenHKEY_CLASSES_ROOT – Mappings von Dateiendungen zu deren AnwendungHKEY_CURRENT_USER – Benutzerspezifische Informationen (Umgebungsvariablen, Drucker, ...)
30.01.2009 Win32 Systemprogrammierung 29
2.1 Windows Registry2.1 Windows Registry
Registry API Calls
RegOpenKeyEx - vorhandenen Key öffnenRegDeleteKeyEx - vorhandenen Key löschenRegCreateKeyEx - neuen Key erzeugenRegEnumKeyEx - Auflisten aller Subkeys im geöffneten KeyRegSetValueEx – Setzen eines Name/Wert-Paares im geöffneten KeyRegEnumValue - Auflisten aller Values im geöffneten Key
30.01.2009 Win32 Systemprogrammierung 30
2.1 Windows Registry2.1 Windows Registry
RegOpenKeyEx
LONG RegOpenKeyEx ( HKEY hKey, /* Parent Key-Handle */
LPCTSTR lpSubKey, /* Name des Subkeys */
DWORD ulOptions, /* = 0 */
REGSAM samDesired, /* Zugriffsrechte */
PHKEY phkResult); /* Key-Handle des neu geöffneten Keys*/
30.01.2009 Win32 Systemprogrammierung 31
2.1 Windows Registry2.1 Windows Registry
RegOpenKeyEx Beispiel
#include <windows.h>
HKEY hKey = Null;
/* Schlüssel öffnen */ if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,
LONG RegEnumValue ( HKEY hKey, /* Parent Key-Handle */
DWORD dwIndex, /* Indexwert */
LPTSTR lpValueName, /* Name des Values */
LPDWORD lpcbValueName, /* Größe des Valuenamens */
LPDWORD lpReserved, /* reserviert */
LPDWORD lpType, /* Typ des Values */
LPBYTE lpData, /* der zurückgegebene Wert */
LPDWORD lpcbData); /* Größe des Rückgabewertes */
30.01.2009 Win32 Systemprogrammierung 39
2.2 Fehlerbehandlung2.2 Fehlerbehandlung
Fehlerbehandlung
Win32 Structured Exception Handling (SEH)Exceptions, Arithmetikfehler und SystemfehlerSEH Support durch Win32 Funktionen, Sprachensupport des Compilers und Run-Time SupportBeispiele für Fehlerbehandlungen:
Array-Out-Of-Bound-ExceptionsPointer DereferenzierungDivision durch Null
30.01.2009 Win32 Systemprogrammierung 40
2.2 Fehlerbehandlung2.2 Fehlerbehandlung
Try / Except
ähnlich zum gewöhnlichen try-catch-Block:
Filter expression: nur auf bestimmte Fehlerereignisse im except-Block reagieren
__try {/* Code, der einen Fehler werfen könnte */
}__except (filter expression) {
/* Fehlerbehandlung */}
30.01.2009 Win32 Systemprogrammierung 41
2.2 Fehlerbehandlung2.2 Fehlerbehandlung
Filterexpressions
Filterexpression in __except Anweisung wird direkt nach Auftreten der Exception überprüftnormalerweise eine Konstante, eine Filterfunktion oder ein konditionaler Ausdruck, wobei immer einer der folgenden drei Typen zurückgegeben werden muss:
RING 0: Kernel-Mode, Prozesse können die vollen 4GB adressieren.
RING 3: User-Mode, Prozesse können nur 2-3 GB adressieren (versionsabhängig). Der Rest ist exklusiv für Kernel, Gerätetreiber, DLL‘s also für von mehreren Diensten genutzten Code Reserviert.
30.01.2009 Win32 Systemprogrammierung 56
3.2 Virtuelle Adressierung: Einführung I3.2 Virtuelle Adressierung: Einführung I
Rechtfertigung: nicht alle Teile eines Programms werden immer gleichzeitig benötigt
Funktionsweise: - virtueller Speicher ist in „Seiten“ aufgeteilt.
- physikalischer Speicher ist in gleich große „Rahmen“ aufgeteilt.
- Zuordnung von Seiten zu Rahmen (Mappen).
- Auslagern von Rahmen (Swapen)
- Seitentausch-Strategien (swapen dann mappen): random=schwach, RR=fair, FIFO=Sehr fair
30.01.2009 Win32 Systemprogrammierung 57
3.2 Virtuelle Adressierung: Einführung II3.2 Virtuelle Adressierung: Einführung II
Vorteil: Es ist mit nur 32MB physical Memory möglich einen 1GB Prozess laufen zu lassen. Dazu werden die aktuell benötigten Speicherbereiche in den RAM geladen und nicht benötigte aus diesem verdrängt .
Funktionen auf Seiten-Basis: VirtualAlloc, VirtualFree, VirtualLock, VirtualUnlock ...
Funktionen auf definierbarer Basis (byte, word,...): HeapAlloc, HeapCreate, HeapDestroy, HeapFree...
Heap API: H e a p C r e a t e , H e a p D e s t r o y , H e a p A l l o c , H e a p F r e e
MMF API: C r e a t e F i l e M a p p i n g , C r e a t e V i e w O f F i l e
Virtual Memory API
Windows Kernel withVirtual Memory Manager
PhysicalMemory
Disc &FileSystem
C library: malloc, free
30.01.2009 Win32 Systemprogrammierung 59
3.3 Heaps: Einführung3.3 Heaps: Einführung
Ein Heap (engl: Haufen) ist ein Speichervorrat, welcher dem Stack (lokaler Prozedur-Speicher) entgegen wächst.
Jeder Prozess besitzt min. einen Default-Heap.
Speicheranforderungen durch malloc, realloc, calloc, werden vom Default-Heap abgezogen.
Jeder Heap wird automatisch bis zur definierten Obergrenze erweitert => und immer auf ganze Seiten gerundet.
Ein Heap in Windows ist ein Objekt somit existiert zu diesem ein Handle: HANDLE GetProcessHeap(VOID)
30.01.2009 Win32 Systemprogrammierung 60
3.3 Heaps: Beispiel separater Heaps3.3 Heaps: Beispiel separater Heaps
Node
Node
Node
Record
Record
Record
Not allocated
Not allocated
Not allocated
Not allocated
ProcessHeap
RecHeap
NodeHeap
Virtual Address Space Program
P r o c H e a p = G e t P r o c e s s H e a p ( ) ;
p R o o t = H e a p A l l o c ( P r o c H e a p ) ;
R e c H e a p = H e a p C r e a t e ( ) ;
N o d e H e a p = H e a p C r e a t e ( ) ;
w h i l e ( ) {
p R e c = H e a p A l l o c ( R e c H e a p ) ;
p N o d e = H e a p A l l o c ( N o d e H e a p ) ;· · ·
}H e a p F r e e ( R e c H e a p , 0 , p R e c ) ;
H e a p F r e e ( N o d e H e a p , 0 , p N o d e ) ;
H e a p D e s t r o y ( R e c H e a p ) ;
H e a p D e s t r o y ( N o d e H e a p ) ;
· · ·
· · ·
· · ·
30.01.2009 Win32 Systemprogrammierung 61
3.3 Heaps: Vorteile separater Heaps3.3 Heaps: Vorteile separater HeapsFairness: kein Thread kann mehr Speicher anfordern als für dessen Heap reserviert ist. (Memory-Leaks betreffen nur diesen Thread)
Multithreaded-Preformence: Der Wettstreit um den default Heap des Prozesses entfällt, dies kann substantielle preformence Verbesserung mit sich bringen.
Allocation Efficency: Speicheranforderungen auf einen kleinen Heap welche nur in einer bestimmten Größe auftreten sind effizienter als Anforderungen auf einen großen Heap, welche in den verschiedensten Größen auftreten. Somit Reduzierung von Fragmentration.
Deallocation Efficeny: Der gesamte Heap kann mit nur einem Funktionsaufruf beseitigt werden, wobei auch Memory-Leaks beseitigtwerden.
Locality of Reference Efficency: Wird für eine Datenstruktur ein kleiner Heap verwendet, so wird das Risiko von Page-Faults reduziert, da sich die Struktur dann nur über wenige Speicherseiten erstreckt.
30.01.2009 Win32 Systemprogrammierung 62
3.3 Heaps: Optionen der Heap API3.3 Heaps: Optionen der Heap API
HEAP_GENERATE_EXCEPTIONS: Nutzung eines SEH (StructuredExceptionHandler) zur Fehlerbehandlung. Vorteil: Kein Fehlertest nach einer Heapoperation notwendig
HEAP_NO_SERIALIZE:Schaltet Mutal-Exclusion Mechanismus bei zugriff auf Heap aus.
Sicher wenn: 1.) Der Prozess (Hauptthread) exklusiv den Default-
Heap und keinen der Thread-Heaps verwendet.2.) Jeder Thread exklusiv seinen eigenen Heap besitzt.
sonst: Bei gleichzeitiger Nutzung eines Heaps durch mehrere Threads muss ein Mutal-Exclusion Mechanismus implementiert werden.
HEAP_ZERO_MEMORY: Angeforderter Speicher wird mit 0 Initialisiert.
Rechtfertigung:- Bei der Virtuellenspeicherverwaltung muss Speicher für Objekte (Heap-Bereiche) in der Auslagerrungsdatei (Swaping) bereitgestellt werden. - Wird ein Prozess terminiert, so geht der zugehörige Auslagerrungsdateispeicher verloren. - Lösung: Man nutzt MMF's statt der Auslagerrungsdatei.
Vorteile:- Ermöglichen das Einblenden eines Objektes in den virtuellen Adressraum eines Prozesses.- Für MMF‘s wird keine File-I/O-API benötigt- Inhalte von Datenstrukturen können wiederverwendet werden.- Implementierung für Dateipuffer entfällt! - Bietet die Möglichkeit Daten mit anderen Prozessen zu teilen.- Die Auslagerungsdatei wird entlastet.
PAGE_READONLY:Die Seiten des allokierten Speicherbereiches können nur gelesen werden.
PAGE_READWRITE:Vollzugriff, die Die Seiten des allokierten Speicherbereiches können gelesen und beschrieben werden insofern für die zugehörige Datei sowohl GENERIC_READ als auch GENERIC_WRITE definiert wurden.
PAGE_WRITECOPY: Wird die MMF verändert (beschrieben), so wird eine Kopie dieser in der Pageing-File angelegt.
- hMapObject: Handle eines MMF-Objektes.- dwAccess: Zugriffsrechte (Kompatibel zu MMF-Objekt wählen!)- cbMap: Größe der gemappten Region in Byte.- dwOffsetHigh, dwOffsetLow: Startadresse der View im Objekt.
- NULL bei Fehler sonst Startadresse der file-view.
- cbMap = 0 => ganzes File Mappen- dwOffsetHigh und dwOffsetLow = 0 dann vom Dateianfang mappen, sonst immer ein Vielfaches von 64K wählen
30.01.2009 Win32 Systemprogrammierung 77
3.4 Memory-Mapped Files3.4 Memory-Mapped Files: Beispiel: Beispiel
30.01.2009 Win32 Systemprogrammierung 78
SystemaufrufeUNIX Win32 BeschreibungNicht vorhanden! CreateFileMapping Erstellt ein MMFNicht vorhanden! OpenFileMapping Öffnet eine MMFmmap (jede reguläre Datei)
Eigenschaften:beim Kompilationsvorgang werden Bibliothekskomponenten ins Programm hineinkopiert. (Code und Daten)Programm ist nach Kompilation unabhängig von der Bibliothek. (Version bzw. Vorhandensein der Bibliothek)Programme werden größer (Speicherbedarf!)Um von Updates zu profitieren, muss das Programm neu kompiliert werden.Es findet eine statische Typenkontrolle statt.
Beim Linken des Programmes:Linker verbindet Statische Bibliotheken mit dem Kompilat. Linker setzt daraus ein ausführbares Programm zusammen.Linker sucht aus den Bibliotheksdateien die im Programm referenzierten, Komponenten heraus, und fügt sie dann in das Programm ein.
DLL allgemein:werden bei bedarf von der Festplatte geladen (Ladeverzögerung!)Versionswahl zur Laufzeit möglich (explizites linken).
DLL als shared library:können von mehreren Programmen gleichzeitig benutzt werdenbefinden sich nur ein mal im SpeicherDLL-Komponenten werden in den Adressraum des Programms eingeblendet (gemappt)
extern "C" __declspec(dllexport) int summe( int a, int b ){ return a + b;}
BOOL APIENTRY DllMain( HANDLE ModulHandle, DWORD state, LPVOID lpReserved ){ switch( state ) { case DLL_PROCESS_ATTACH: // Die DLL wird in den Adreßraum eines Prozesses eingeblendet case DLL_THREAD_ATTACH: // Der zugehörige Prozeß hat einen neuen thread gestartet. case DLL_THREAD_DETACH: // Der zugehörige Prozeß hat einen thread gestoppt. case DLL_PROCESS_DETACH: // Die DLL wird aus dem Prozeßraum eines Prozesses entfernt default: /*ERROR*/ break; } return TRUE;}
Unter Windows entstehen beim Erzeugen einer DLL zwei Dateien: lib-Datei: enthält Platzhalter für Programmcode bzw. Daten die sog.„stubs“ dll-Datei: enthält Programmcode bzw. die Daten
Beim Linken des Programmes:Es werden lediglich die Platzhalter in das Programm eingebunden.Das Programm wird nicht so groß.Es findet eine statische Typenkontrolle statt.
Beim starten des Programmes:Benötigte DLL's werden geladen.Verweise auf Dummyfunktionen im Programm werden ersetzt. Dann Programmstart.
Beim ausführen des Programmes:Kein Unterschied.
30.01.2009 Win32 Systemprogrammierung 84
#include <stdio.h>
extern "C" int summe( int, int );
int main(){ printf( "Summe von %d und %d ist %d\n",i,i/2,summe( i, i/2 )); return 0;}
- Beim impliziten linken ist das Einbinden der Bibliothek für UNIX und Windows gleich
Beim Linken des Programmes:Dem Compiler und damit dem Linker werden die Komponenten der Bibliothek nicht bekannt gemacht.Es findet für Bibliotheksfunktionen keine Typenkontrolle statt.Nutzung On-Demand. (Programmierer hat mehr Kontrolle.)
Beim starten des Programmes:Kein Unterschied.
Beim ausführen des Programmes:Bibliotheken werden durch Betriebssystemfunktionen geladen.Bibliothekskomponenten werden durch Betriebssystemfunktionen genutzt.
Name des auszuführenden Programms. Komandozeilen ArgumenteSicherheitsattribute des Programms. (NULL=Default)Sicherheitsattribute des Threads. (NULL=Default)Option: Handles an Kinder vererben (Flag)Handles müssen dennoch als vererbbar markiert sein.Verschiedene Prozesserstellungsoptionen (Flags) siehe HierUmgebungsvariablen (NULL=Parrent's)Umgebungsvariablen sind Paare: (Name;Wert)aktuelles Arbeitsverzeichnis (NULL=Parrent's)Eigenschaften des Hauptfensters des Programms.Informationen über den erstellten Prozess(Ausgabeparameter)
- fdwAccess: Terminierungs Optionen: - PROCESS_ALL_ACCESS: Alle Zugriffsrechte erlauben. (Default von CreateProcess)
- SYNCHRONIZE: Erlaubt warten auf Beendigung.- PROCESS_TERMINATE: Erlaubt Terminierung durch TerminateProcess()- PROCESS_QUERY_INFORMATION: Erlaubt Abfrage von Prozessinformationen durch
GetExitCodeProcess() und GetPriorityClass()
- fInherit: Option: Rückgabe-Handle vererbbar?- IDProcess: Idendifiziert den zu öffnenden Prozess.
// Start the child process. CreateProcess( NULL, // No module name (use command line) argv[1], // Command line
NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) ;
// Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread );
3.6 Prozesserstellung: Windows3.6 Prozesserstellung: Windows
30.01.2009 Win32 Systemprogrammierung 102
3.6 Prozesse: Vererbung von Handles I3.6 Prozesse: Vererbung von Handles I
Vorteil: Erlaubt Zugriff auf Objekte des Elternprozesses.
Funktionsweise:Handle muss (bei Erstellung bzw. Duplizierung) vererbbar definiert werden (SECURITY_ATTRIBUTES)
Elternprozess erlaubt Nutzung seiner HandlesbInheritHandle=TRUE für CreateProcess()
Elternprozess sendet Handles an das Kind.- durch die Struktur STARTUPINFO für CreateProcess() in der STDIN bzw. STDOUT überschreiben werden.- durch IPC, Umgebungsvariablen, CML-Parameter
Anmerkungen:- vererbte Handles sind eigenständige Kopien.
(z.B.: unabhängiger File-Pointer bei Dateihandle)- auch vererbte Handles müssen geschlossen werden
30.01.2009 Win32 Systemprogrammierung 103
3.6 Prozesse: Vererbung von Handles II3.6 Prozesse: Vererbung von Handles II
Handle Übermittlung: Überschreiben von hStdInput bzw. hStdOutput mit File-Handles welche an das Kind weitergereicht werden sollen.