Sie sind auf Seite 1von 105

Begrung

Win32 Systemprogrammierung
Fachhochschule Wiesbaden Lehrveranstaltung: Systemprogrammierung Prof. Dr. Weber

Christian Geiler geilerd@arcor.de Daniel Pielok daniel_pielok@hotmail.de Fouad Aberkane fouad.aberkane@freenet.de

30.01.2009

Win32 Systemprogrammierung

Inhaltsverzeichnis

Kapitel 1
1. Einfhrung 2. Dateisysteme 3. I/O Systemaufrufe 4. Mutex/File Locking

30.01.2009

Win32 Systemprogrammierung

1.1 Einfhrung

WinApi
Ausgeschrieben steht WinAPI frWindows 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 fr Microsoft WindowsBetriebssysteme erstellen

30.01.2009

Win32 Systemprogrammierung

1.1 Einfhrung

WinApi
Die existierenden Funktionen der WinAPI sind ausschlielich 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

1.1 Einfhrung

Versionen
Win16 war die erste API, fr die 16-Bit Versionen von Microsoft Windows. Gngiger Begriff war schlicht Windows API, wurde aber spter umbenannt in Win16, um sie von der neueren Windows API der 32-BitArchitektur unterscheiden zu knnen. Die Funktionen der Win16 API liegen hauptschlich im Kern des Betriebssystems: kernel.exe (oder krnl286.exe oder krnl386.exe), user.exe und gdi.exe. Trotz der Dateiendung exe sind diese Dateien tatschlich sogenannte Programmbibliotheken.

30.01.2009

Win32 Systemprogrammierung

1.1 Einfhrung

Versionen
Win32 ist die 32-Bit-API fr 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 eingefhrt. Die Version von Win32, die mit Windows 95 ausgeliefert wurde, lief ursprnglich unter dem Namen Win32c, wobei das 'c' fr Kompatibilitt (engl. compatibility) stand, aber dieser Ausdruck wurde spter von Microsoft zugunsten von Win32 wieder verworfen.

30.01.2009

Win32 Systemprogrammierung

1.1 Einfhrung

Versionen
Win32s ist die 32-Bit-API fr die Windows 3.1x-Familie von Microsoft Windows und als solche die 32-BitErweiterung fr die ansonsten 16-bittigen Betriebssysteme. Das s steht fr 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 lauffhig, 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 fr Heimanwender gesetzt werden.
30.01.2009 Win32 Systemprogrammierung 7

1.1 Einfhrung

Versionen
Win32 fr 64-Bit-Windows, auch bekannt unter dem Namen Win64, ist die Version der API die fr 64-BitVersionen von Windows namentlich Windows XP x64 Edition, Windows Server 2003 x64 Edition (fr AMD64 Prozessoren), Windows XP 64-Bit Edition und Windows Server 2003 fr Itanium-Serien - entworfen wurde. Bei den 64-Bit-Versionen handelt es sich nur um zwei weitere untersttzte 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 knnen.

30.01.2009

Win32 Systemprogrammierung

1.2 Dateisysteme

Dateisysteme
Das Dateisystem ist die Ablageorganisation auf einem Datentrger eines Computers. Dateien mssen gelesen, gespeichert oder verschoben werden. Fr den Menschen mssen Dateiname und computerinterne Dateiadressen in Einklang gebracht werden. Das leichte Wiederfinden und das sichere Abspeichern ist wesentlich. Das Ordnungs- und Zugriffssystem bercksichtigt die Gerteeigenschaften und ist normalerweise Bestandteil des Betriebssystems.

30.01.2009

Win32 Systemprogrammierung

1.2 Dateisysteme

Welche Dateisysteme gibt es?


FAT16 FAT32 HPFS NTFS NetWare ISO 9660 (CD-ROM) und ISO 13346 (DVD) UDF ReiserFS, ext, ext2, ext3, XFS, JFS
30.01.2009 Win32 Systemprogrammierung 10

1.2 Dateisysteme

Betriebssysteme & Dateisysteme


Die Betriebssysteme Windows 95 bis Windows ME benutzen ausschlielich 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

11

1.3 I/O Systemaufrufe

Systemaufrufe
Ein Systemaufruf ist eine vom Anwendungsprogrammen benutzte Methode, um vom Betriebssystem bereitgestellte Funktionalitten auszufhren.Systemaufrufe werden im Quellcode wie Bibliotheksfunktionen aufgerufen. Jedoch die Leistung solch eines Systemaufrufs wird im Kern des Betriebssystems erbracht. Ein Systemaufruf fhrt Assemblercode und C Code aus. In der folgenden Abbildung wird ein Systemaufruf schematisch dargestellt.

30.01.2009

Win32 Systemprogrammierung

12

1.3 I/O Systemaufrufe

Ablauf
In der Definition der Funktion write befindet sich C/Assemblercode diese Zeilen haben die Aufgabe den Adressraum zu wechseln und zwar vom Adressraum des Prozesses in den Adressraum des Kern's

30.01.2009

Win32 Systemprogrammierung

13

1.3 I/O Systemaufrufe

Systemaufruf Beispiele
Unix open close read write lseek stat unlink mkdir rmdir Win32 CreateFile CloseHandle ReadFile WriteFile SetFilePointer GetFileAttributes DeleteFile CreateDirectory RemoveDirectory Beschreibung Neue Datei erzeugen oder Datei ffnen Datei schlieen Daten aus einer Datei lesen Daten in eine Datei schreiben Warten auf ein Ereignis Dateizeiger bewegen Datei lschen Neues Verzeichnis erzeugen Leeres Verzeichnis lschen

30.01.2009

Win32 Systemprogrammierung

14

1.3 I/O Systemaufrufe

CreateFile
Die Funktion CreateFile erzeugt eine Datei der Rckgabewert dieser Funktion ist ein Handle womit man spter die Datei eindeutig identifizieren kann.
HANDLE CreateFile ( LPCTSTR lpFileName, /*Name der Datei*/ DWORD dwDesiredAccess, /*Lesen, Schreiben, Beides*/ DWORD dwShareMode, /*Share Modus fr Prozesse*/ [LPSECURITY_ATTRIBUTES lpSecurityAttributes,] DWORD dwCreationDisposition, /*berschreiben, ffnen...*/ DWORD dwFlagsAndAttributes, /*Schreibgesch., Versteckt*/ [HANDLE hTemplateFile]);

30.01.2009

Win32 Systemprogrammierung

15

1.3 I/O Systemaufrufe

ReadFile
Die Funktion ReadFile liest aus einer gegebenen Datei mithilfe eines HANDLE's.
BOOL ReadFile ( HANDLE hFile, /*Das Objekt das gelesen werden soll*/ LPVOID lpBuffer,/*Buffer*/ DWORD nNumberOfBytesToRead, /*Anzahl Max. Bytes*/ LPDWORD lpNumberOfBytesRead, /*Wirkl. gel. Bytes*/ [LPOVERLAPPED lpOverlapped]);

30.01.2009

Win32 Systemprogrammierung

16

1.3 I/O Systemaufrufe

CloseFile
Die Funktion CloseFile schliet eine Datei.
BOOL CloseFile (HANDLE hFile);

30.01.2009

Win32 Systemprogrammierung

17

1.3 I/O Systemaufrufe

Lese Beispiel
#include<windows.h> #define SOURCE source.txt #define MAXREADSIZE 1024 int main(int argc, char **argv[]) { HANDLE hread; DWORD readsize; char buffer [MAXREADSIZE]; hread = CreateFile(SOURCE, GENERIC_READ, 0, NULL,OPEN_EXISTING, 0, NULL); /*Mgliche Fehler abfangen*/ ReadFile (hread, buffer, MAXREADSIZE, &readsize, NULL); /*Mgliche Fehler abfangen*/ printf(%s, buffer); CloseFile(hread);

30.01.2009

Win32 Systemprogrammierung

18

1.4 Mutex

Mutex
Mutex bedeutet Wechselseitiger Ausschluss (mutual exclusion).Ein Mutex ist nix anderes als eine Gruppe von Verfahren mit denen das Problem des kritischen Abschnitts gelst wird.Damit wird verhindert, dass nebenlufige Prozesse gleichzeitig oder zeitlich verschrnkt gemeinsam genutzte Datenstrukturen unkoordiniert verndern. Zu dieser Gruppe gehren zB. Semaphore, Monitore, Lock.

30.01.2009

Win32 Systemprogrammierung

19

1.4 File Locking

File Locking
Das File Locking ist einfaches Prinzipe das folgendermaen vorgeht nach dem dem ffnen einer Datei fr 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 multitaskingfhigen Systemen wie beispielsweise Windows-Rechnern eingesetzt

30.01.2009

Win32 Systemprogrammierung

20

1.4 File Locking

LockFile
Die WinApi stellt die Funktionalitt fr das File Locking zur Verfgung mit der Methode LockFile kann man eine ganze Datei oder bestimmte Abschnitte in Bytes fr 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

21

1.4 File Locking

UnlockFile
Natrlich muss die gesperrte Datei bzw. der Abschnitt wieder fr andere Prozesse zugnglich sein dafr gibts 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

22

1.4 File Locking

File Locking Beispiel


#include<windows.h> #define ANFANG 10 #define ENDE 20 HANDLE hFile; hFile = CreateFile(TEXT("two.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); /*Fehler abfangen*/ LockFile(hFile, ANFANG, 0, ENDE, 0); /*Datei lesen*/ UnlockFile(hFile, ANFANG, 0, ENDE, 0);
30.01.2009 Win32 Systemprogrammierung 23

/* Datei ffnen*/ /* Datei lesen*/ /* Mehrfache Lesen*/ /* Security Atrribut wird nich gebraucht */ /* ffnen oder erstellen*/ /* Normale Datei*/ /* Kein Template*/

Inhaltsverzeichnis

Kapitel 2
1. Windows Registry 2. Fehlerbehandlung 3. Windows Sockets

30.01.2009

Win32 Systemprogrammierung

24

2.1 Windows Registry

Registry
Zentrale, hierarchische Datenbank fr Applikations- und Konfigurationsinformationen Registry-Editor wird durch den regedit Befehl geffnet auf der Kommandozeile Zugriff durch Schlssel Programme kommunizieren mit der Registry durch Registry API Funktionsaufrufe Registry-Programmierung hnlich zur Dateiverarbeitung

30.01.2009

Win32 Systemprogrammierung

25

2.1 Windows Registry

Registry
Registry enthlt folgende Informationen:
Betriebssystem-Versionsnr., Build-Nr. und registrierte User hnliche Informationen fr jede installierte Applikation Hardware-Informationen ber Prozessortyp, Anzahl an Prozessoren, Arbeitsspeicher, etc. Benutzerspezifische Informationen (Home-Verzeichnis, bevorzugte Anwendungen) installierte Services Mappings von Dateiendungen zu deren ausfhrbaren Programmen und Mappings von Netzwerkadressen zu deren Hostnamen
30.01.2009 Win32 Systemprogrammierung 26

2.1 Windows Registry

Registry

30.01.2009

Win32 Systemprogrammierung

27

2.1 Windows Registry

Registry-Schlssel
HKEY_LOCAL_MACHINE Informationen ber den Rechner und darauf installierte Software HKEY_USERS Informationen ber BenutzerKonfigurationen HKEY_CURRENT_CONFIG Informationen wie Bildschirmauflsung und Schriftarten HKEY_CLASSES_ROOT Mappings von Dateiendungen zu deren Anwendung HKEY_CURRENT_USER Benutzerspezifische Informationen (Umgebungsvariablen, Drucker, ...)
30.01.2009 Win32 Systemprogrammierung 28

2.1 Windows Registry

Registry API Calls


RegOpenKeyEx - vorhandenen Key ffnen RegDeleteKeyEx - vorhandenen Key lschen RegCreateKeyEx - neuen Key erzeugen RegEnumKeyEx - Auflisten aller Subkeys im geffneten Key RegSetValueEx Setzen eines Name/Wert-Paares im geffneten Key RegEnumValue - Auflisten aller Values im geffneten Key
30.01.2009 Win32 Systemprogrammierung 29

2.1 Windows Registry

RegOpenKeyEx
LONG RegOpenKeyEx ( HKEY hKey,
/* Parent Key-Handle */ /* Name des Subkeys */ /* = 0 */ /* Zugriffsrechte */

LPCTSTR lpSubKey, DWORD ulOptions, PHKEY phkResult);

REGSAM samDesired,

/* Key-Handle des neu geffneten Keys*/

30.01.2009

Win32 Systemprogrammierung

30

2.1 Windows Registry

RegOpenKeyEx Beispiel
#include <windows.h> HKEY hKey = Null; /* Schlssel ffnen */ if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, LSoftware\\Alias\\Common, 0, KEY_READ, &hKey)) { } printf(Fehler beim ffnen des Keys);

30.01.2009

Win32 Systemprogrammierung

31

2.1 Windows Registry

RegEnumKeyEx
LONG RegEnumKeyEx ( HKEY hKey,
/* Parent Key-Handle */ /* Indexwert */

DWORD dwIndex, LPTSTR lpName,

/* Name des Schlssels */ /* Gre des Keynamen*/ /* reserviert */

LPDWORD lpcbName, LPTSTR lpClass,

LPDWORD lpReserved, LPDWORD lpcbClass,


30.01.2009

/* Klassenname */ /* Gre des Klassennames*/ /*Zeit des letzten Schreibens*/


32

PFILETIME lpftLastWriteTime);

Win32 Systemprogrammierung

2.1 Windows Registry

RegCreateKeyEx
LONG RegCreateKeyEx ( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved, LPTSTR lpClass,
/* = 0 */

/* Typ des neuen Keys */

DWORD dwOptions, REGSAM samDesired,


/* Zugriffsrechte */

LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);


30.01.2009 Win32 Systemprogrammierung 33

2.1 Windows Registry

RegCreateKeyEx Beispiel
#include <windows.h> HKEY hKey = Null; DWORD dwDisp = NULL; /* Schlssel mit Schreibrechten erzeugen */ if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_LOCAL_MACHINE, LSYSTEM\\CurrentControlSet\\Services\\EventLog\\MyLog, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp)) { } printf(Fehler beim Erzeugen des Keys);

30.01.2009

Win32 Systemprogrammierung

34

2.1 Windows Registry

Values in der Registry


Values sind typisiert Einige Typen: REG_BINARY Binrdaten REG_DWORD 32 Bit Zahlen REG_SZ Strings REG_EXPAND_SZ Strings mit Verweisen auf Umgebungsvariablen

30.01.2009

Win32 Systemprogrammierung

35

2.1 Windows Registry

RegSetValueEx
LONG RegSetValueEx ( HKEY hKey,
/* Key-Handle */ /* Name des Values */

LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, DWORD cbData);

/* = 0 */

/* Datentyp des Values */ /* Daten (Value) */

CONST BYTE * lpData,

/* Gre der Daten */

30.01.2009

Win32 Systemprogrammierung

36

2.1 Windows Registry

RegSetValueEx Beispiel
#include <windows.h> HKEY hKey = Null; wchar_t *value = LNew Registry Value; /* Key ffnen oder neu erzeugen */ ... /* Wert setzen */ if (ERROR_SUCCESS != RegSetValueEx(hKey, LMyValue, 0, REG_SZ, (LPBYTE) value, (DWORD) ((lstrlen(value)+1) * sizeof(TCHAR))) { } printf(Fehler beim Setzen des Wertes);

30.01.2009

Win32 Systemprogrammierung

37

2.1 Windows Registry

RegEnumValue
LONG RegEnumValue ( HKEY hKey,
/* Parent Key-Handle */ /* Indexwert */ /* Name des Values */ /* Gre des Valuenamens */

DWORD dwIndex,

LPTSTR lpValueName,

LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData,


30.01.2009

/* reserviert */

/* Typ des Values */

/* der zurckgegebene Wert */ /* Gre des Rckgabewertes */


38 Win32 Systemprogrammierung

LPDWORD lpcbData);

2.2 Fehlerbehandlung

Fehlerbehandlung
Win32 Structured Exception Handling (SEH) Exceptions, Arithmetikfehler und Systemfehler SEH Support durch Win32 Funktionen, Sprachensupport des Compilers und Run-Time Support Beispiele fr Fehlerbehandlungen: Array-Out-Of-Bound-Exceptions Pointer Dereferenzierung Division durch Null
30.01.2009 Win32 Systemprogrammierung 39

2.2 Fehlerbehandlung

Try / Except
hnlich zum gewhnlichen try-catch-Block:
__try { /* Code, der einen Fehler werfen knnte */ } __except (filter expression) { /* Fehlerbehandlung */ }

Filter expression: nur auf bestimmte Fehlerereignisse im except-Block reagieren

30.01.2009

Win32 Systemprogrammierung

40

2.2 Fehlerbehandlung

Filterexpressions
Filterexpression in __except Anweisung wird direkt nach Auftreten der Exception berprft normalerweise eine Konstante, eine Filterfunktion oder ein konditionaler Ausdruck, wobei immer einer der folgenden drei Typen zurckgegeben werden muss: EXCEPTION_EXECUTE_HANDLER EXCEPTION_CONTINUE_SEARCH EXCEPTION_CONTINUE_EXECUTION

30.01.2009

Win32 Systemprogrammierung

41

2.2 Fehlerbehandlung

Exceptions Beispiel 1
#include <windows.h> GetTempFileName (TempFile, ...); while (...) __try { /* Datei erzeugen */ hFile = CreateFile (TempFile, ..., OPEN_ALWAYS, ...); SetFilePointer (hFile, 0, NULL, FILE_END); /* in Datei schreiben */ WriteFile (hFile, ...); /* hier kann ein Addressierungsfehler auftreten!!! */ i = *p; ... CloseHandle (hFile); } __except (EXCEPTION_EXECUTE_HANDLER) { CloseHandle (hFile); DeleteFile (TempFile); } /* Datei am Ende immer geschlossen*/
30.01.2009 Win32 Systemprogrammierung 42

2.2 Fehlerbehandlung

Fehlercodes
DWORD GetExceptionCode (VOID); Funktion gibt Fehlercode zurck Reagieren auf bestimmte Fehlerereignisse mglich einige wichtige Fehlercodes: EXCEPTION_ACCESS_VIOLATION EXCEPTION_NONCONTINUABLE_EXECUTION EXCEPTION_INT_DIVIDE_BY_ZERO EXCEPTION_BREAKPOINT
30.01.2009 Win32 Systemprogrammierung 43

2.2 Fehlerbehandlung

Exceptions Beispiel 2
#include <windows.h> __try { ... i = j / 0; ... } __except (Filter (GetExceptionCode ())) { ... } /* Filter Funktion, die auf bestimmte Fehler DWORD Filter (DWORD ExCode) { switch (ExCode) { ... case EXCEPTION_INT_DIVISION_BY_ZERO: ... return EXCEPTION_EXECUTE_HANDLER; case ... } }
30.01.2009 Win32 Systemprogrammierung

reagiert*/

44

2.3 Windows Sockets

Windows Sockets
dienen der Interprozess-Kommunikation fast identisch zu Berkeley Sockets Initialisierung der WinSock API: int WSAStartup ( WORD wVersionRequired, LPWSADATA lpWSAData);
/* Socket Version (Minimum) */ /* Pointer zu WSADATA Struct */

30.01.2009

Win32 Systemprogrammierung

45

2.3 Windows Sockets

Sockets (TCP)

Quelle: Folienbeispiel von Herr Weber


30.01.2009 Win32 Systemprogrammierung 46

2.3 Windows Sockets

Sockets socket, bind


Socket erzeugen: SOCKET socket (int af, int type, int protocol);
/* Adress-Familie */

/* Typ des Sockets (DGRAM, STREAM) */ /* Protokoll */

Server: binden eines Sockets an einen Port: int bind (SOCKET s, int namelen);
30.01.2009

/* Socket-Handle */ /* Adresse/Port */

const struct sockaddr *saddr,

/* Gre der Adresse */

Win32 Systemprogrammierung

47

2.3 Windows Sockets

Sockets - sockaddr_in
sockaddr_in Struktur bei AF_INET verwenden: struct sockaddr_in { short sin_family; u_short sin_port;
/* AF_INET */ /* Portnummer */ /* 4-Byte IP-Adresse */

struct in_addr sin_addr; char sin_zero [8]; }

/* optional */

30.01.2009

Win32 Systemprogrammierung

48

2.3 Windows Sockets

Sockets - listen
Struktur sin_addr besitzt eine Variable s_addr, die die IP Adresse speichert Bsp.: sa.sin_addr.s_addr = inet_addr (192.13.12.1); Server: Socket auf Akzeptieren von Clients vorbereiten: int listen ( SOCKET s,
/* Socket-Handle */ /* Gre der Warteschlange an Clients*/
49

int nQueueSize);

30.01.2009

Win32 Systemprogrammierung

2.3 Windows Sockets

Sockets accept, connect


Server: Warten auf Verbindungsanfrage: SOCKET accept (SOCKET s, LPSOCKADDR lpAddr, LPINT lpAddrLen);
/* Socket-Handle */ /* Definition von Port und Adresse */

/* Gre der Adresse */

Client: Verbindung aufbauen: int connect (SOCKET s, LPSOCKADDR lpAddr, int nAddrLen);
30.01.2009

/* Socket-Handle */ /* Definition von Port und Adresse */

/* Gre der Adresse */


50

Win32 Systemprogrammierung

2.3 Windows Sockets

Sockets recv, send


Empfangen von Daten: int recv ( SOCKET s, int nFlags); Senden von Daten: int send ( SOCKET s, int nFlags);
30.01.2009 Win32 Systemprogrammierung 51

/* Socket-Handle */ /*Puffer und -gre*/

LPSTR lpBuffer, int nBufferLen,

/* Socket-Handle * /*Puffer und -gre*/

LPSTR lpBuffer, int nBufferLen,

2.3 Windows Sockets

Server Beispiel
#include <winsock.h> struct sockaddr_in SrvSAddr,ConnectAddr; SOCKET SrvSock, sockio; ... SrvSock = socket (AF_INET, SOCK_STREAM, 0); SrvSAddr.sin_family = AF_INET; SrvSAddr.sin_addr.s_addr = htonl (INADDR_ANY); SrvSAddr.sin_port = htons (SERVER_PORT); /* Socket an Adresse binden */ bind (SrvSock, (struct sockaddr *) &SrvSAddr, sizeof (SrvSAddr); listen (SrvSock, 5); AddrLen = sizeof (ConnectAddr); /* Client Verbindung akzeptieren*/ sockio = accept (SrvSock, (struct sockaddr *) &ConnectAddr, &AddrLen); ... /* Daten empfangen*/ ret = recv (sockio, buffer, sizeof(buffer), 0); ... closesocket (sockio);
30.01.2009 Win32 Systemprogrammierung 52

2.3 Windows Sockets

Client Beispiel
#include <winsock.h> SOCKET ClientSock; /* Socket erzeugen */ ClientSock = socket (AF_INET, SOCK_STREAM, 0); memset (&ClientSAddr, sizeof (ClientSAddr), 0); ClientSAddr.sin_family = AF_INET; ClientSAddr.sin_addr.s_addr = inet_addr (argv[1]); ClientSAddr.sin_port = htons (SERVER_PORT); /* Verbindung zu Server aufbauen */ ret = connect (ClientSock, (struct sockaddr *) &ClientSAddr, sizeof (ClientSAddr)); ... /* Daten senden */ ret = send (ClientSock, buffer, sizeof(buffer), 0); ... /* Socket und Verbindung schliessen*/ shutdown (ClientSock); closesocket (ClientSock);
30.01.2009 Win32 Systemprogrammierung 53

Inhaltsverzeichnis

Kapitel 3
1. Win32 Adressraum 2. Virtuelle Adressierung 3. Heaps 4. Memory Mapped Files 5. Bibliotheken 6. Prozesse

30.01.2009

Win32 Systemprogrammierung

54

3.1 Win32 Adressraum


32-Bit Adressraum 32-Bit Zeiger (z.B.: LPCTSTR, LPDWORD...) 4GB adressierbarer Speicher RING 0: Kernel-Mode, Prozesse knnen die vollen 4GB adressieren. RING 3: User-Mode, Prozesse knnen nur 2-3 GB adressieren (versionsabhngig). Der Rest ist exklusiv fr Kernel, Gertetreiber, DLLs also fr von mehreren Diensten genutzten Code Reserviert.

30.01.2009

Win32 Systemprogrammierung

55

3.2 Virtuelle Adressierung: Einfhrung I


Rechtfertigung: nicht alle Teile eines Programms werden immer gleichzeitig bentigt Funktionsweise: - virtueller Speicher ist in Seiten aufgeteilt. - physikalischer Speicher ist in gleich groe 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

56

3.2 Virtuelle Adressierung: Einfhrung II


Vorteil: Es ist mit nur 32MB physical Memory mglich einen 1GB Prozess laufen zu lassen. Dazu werden die aktuell bentigten Speicherbereiche in den RAM geladen und nicht bentigte aus diesem verdrngt . Funktionen auf Seiten-Basis: VirtualAlloc, VirtualFree, VirtualLock, VirtualUnlock ... Funktionen auf definierbarer Basis (byte, word,...): HeapAlloc, HeapCreate, HeapDestroy, HeapFree...

30.01.2009

Win32 Systemprogrammierung

57

3.2 Memory Management Architecture


Windows Program
C library: malloc, free Heap API: H e a p C r e a t e , H e a p D e s t r o y , MMF API: H e a p A l l o c , H e a p C F r re ea et e F C r e a t e V Virtual Memory API

i l e M a p p i n i e w O f F i l e

Windows Kernel with Virtual Memory Manager

Physical Memory

Disc & File System

30.01.2009

Win32 Systemprogrammierung

58

3.3 Heaps: Einfhrung


Ein Heap (engl: Haufen) ist ein Speichervorrat, welcher dem Stack (lokaler Prozedur-Speicher) entgegen wchst. Jeder Prozess besitzt min. einen Default-Heap. Speicheranforderungen durch malloc, realloc, calloc, werden vom DefaultHeap 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

59

3.3 Heaps: Beispiel separater Heaps


Virtual Address Space Not allocated Process Heap Program

r o c H o o t R

e a p = H

= G

e t P

r o c e s s H (P r o c H

e a p

( );

p R

Not allocated Record N RecHeap

e a p A l l o c e a p = H e a p = H

e a p ); ( ); ( );

e c H

e a p C r e a t e

o d e H ( ) { = H

e a p C r e a t e

Record

h i l e

pRecorde c R

e a p A

l l o c

(R

e c H (N

e a p ); e a p );

p N o d Not allocated e }
NodeHeap Node Node Node Not allocated

= H

e a p A

l l o c

o d e H

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 );

30.01.2009

Win32 Systemprogrammierung

H e a p D e s t r o y (N o d e H e a p );

60

3.3 Heaps: Vorteile separater Heaps


Fairness: kein Thread kann mehr Speicher anfordern als fr dessen Heap reserviert ist. (Memory-Leaks betreffen nur diesen Thread) Multithreaded-Preformence: Der Wettstreit um den default Heap des Prozesses entfllt, dies kann substantielle preformence Verbesserung mit sich bringen. Allocation Efficency: Speicheranforderungen auf einen kleinen Heap welche nur in einer bestimmten Gre auftreten sind effizienter als Anforderungen auf einen groen Heap, welche in den verschiedensten Gren auftreten. Somit Reduzierung von Fragmentration. Deallocation Efficeny: Der gesamte Heap kann mit nur einem Funktionsaufruf beseitigt werden, wobei auch Memory-Leaks beseitigt werden. Locality of Reference Efficency: Wird fr 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

61

3.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 DefaultHeap 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.

30.01.2009

Win32 Systemprogrammierung

62

3.3 Heaps: Erstellung


HANDLE HeapCreate ( DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize ); Rckgabewerte: NULL bei fehler sonst Heap-Handle. Parameter: - flOptions: - dwInitialSize: - dwMaximumSize: HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE Initiale Heapgre (wird in der Pagefile reserviert) Maximale Heapgre (wenn nicht 0, kein wachsen mglich)

Anmerkungen: - dwMaximumSize=0: - dwMaximumSize<>0:


30.01.2009

bei bedarf gesamter freier virtueller Adressraum dwMaximumSize wird allokiert aber es wird nur dwInitialsize in der Pagefile reserviert.
Win32 Systemprogrammierung 63

3.3 Heaps: Loeschen


BOOL HeapDestroy ( HANDLE hHeap ); Rckgabewerte: - Erfolg <> 0, sonst Misserfolg Parameter: - hHeap: Handle eines mit HeapCreate erstellten Heaps. Anmerkungen: - Loeschen eines Heaps - Der Default-Heap des Prozesses darf niemals zerstrt werden. - Es werden auch die in der Pageing-File ausgelagerten Teile freigegeben. - Man kann somit durch nur einen Funktionsaufruf alle allokierten Datenstrukturen des Heaps lschen => Sehr schnell!

30.01.2009

Win32 Systemprogrammierung

64

3.3 Heaps: Speicherbereich anfordern


HANDLE HeapAlloc ( HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes ); Rckgabewerte: - NULL bei Fehler (wenn kein SHE) sonst Zeiger auf Speicherbereich der Gre dwBytes. Parameter: - hHeap: - dwFlags: Handle eines Heaps (GetProcessHeap, HeapCreate) HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE, HEAP_ZERO_MEMORY Speicher in Byte welcher reserviert werden soll.

- dwBytes : Anmerkungen:

- Anfordern eines Speicherberiches vom Heap

30.01.2009

Win32 Systemprogrammierung

65

3.3 Heaps: Speicherbereich freigeben BOOL HeapFree ( HANDLE hHeap,


DWORD LPVOID Rckgabewerte: - Erfolg <> 0, sonst Misserfolg Parameter: - hHeap: - dwFlags: - lpMem : Anmerkungen: - Freigabe eines allokierten Speicherbereiches eines Heaps Handle eines Heaps (HeapCreate) HEAP_NO_SERIALIZE, Zeiger auf einen durch HeapAlloc oder HeapRelloc allokierten Speicherbereich dwFlags, lpMem );

30.01.2009

Win32 Systemprogrammierung

66

3.3 Heaps: Speicherbereichsgre ndern Rckgabewerte:

LPVOID HeapReAlloc ( HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, DWORD dwBytes );

Parameter: - NULL bei Fehler (wenn kein SHE) sonst Zeiger auf Speicherbereich der Gre dwBytes.

Handle eines Heaps (HeapCreate) HEAP_GENERATE_EXCEPTIONS, HEAP_NO_SERIALIZE, HEAP_ZERO_MEMORY (neu allokierter Speicher), HEAP_REALLOC_IN_PLACE_ONLY (Block nicht verschieben) - lpMem : Zeiger auf einen durch HeapAlloc oder HeapRelloc Anmerkungen: allokierten Speicherbereich - dwBytes : Speicher in Byte welcher reallokiert werden soll.

- hHeap: - dwFlags:

- Keine
30.01.2009 Win32 Systemprogrammierung 67

3.3 Heaps: Speicherbereichsgre ermitteln


DWORD HeapSize ( HANDLE hHeap, DWORD dwFlags, LPVOID lpMem );

Rckgabewerte: - 0 bei Fehler (wenn kein SHE) sonst Gre des Speicherbereiches in Bytes. Parameter: - hHeap: - dwFlags: - lpMem : Handle eines Heaps (HeapCreate) HEAP_NO_SERIALIZE, Zeiger auf einen durch HeapAlloc oder HeapRelloc allokierten Speicherbereich

Anmerkungen: - Ermittelt die Gre eines Speicherbereiches eines Heaps, nicht die Gre des Heaps!
30.01.2009 Win32 Systemprogrammierung 68

3.3 Heaps: weitere Funktionen


HeapValidate: Feststellen ob ein Heap korrupiert wurde. HeapCompact: Defragmentieren eines Heaps durch zusammenfassen von freien Blcken und freigeben von groen Freibereichen. HeapWalk: Ermittelt alle allokierten Speicherbereiche eines Heaps. HeapLock, HeapUnlock: Dient Mutal-Exclusion Mechanismen.

30.01.2009

Win32 Systemprogrammierung

69

3.3 Heaps: Systemaufrufe Systemaufrufe


UNIX Nur default-Heap Nicht vorhanden! malloc da nur default-Heap realloc Da nur default-Heap Nicht vorhanden! Nicht vorhanden! Nicht vorhanden! Nicht vorhanden! Nicht vorhanden! Nicht vorhanden!
30.01.2009

Win32

Beschreibung Erstellt einen Heap Lscht einen Heap Allokiert einen Speicherbereich vom Haeap Heap-Speicherbereich neu dimensionieren. HeapSpeicherbereichgre. Heap korrupiert? Heap defragmentieren Heapgre ermitteln Heap sperren (mutal exc.) Heap freigabe (mutal exc.)
70

HeapCreate HeapDestroy HeapAlloc HeapReAlloc HeapSize HeapValidate HeapCompact HeapWalk HeapLock HeapUnlock

Win32 Systemprogrammierung

3.4 Memory-Mapped Files: Einfhrung Files:


Rechtfertigung: - Bei der Virtuellenspeicherverwaltung muss Speicher fr Objekte (Heap-Bereiche) in der Auslagerrungsdatei (Swaping) bereitgestellt werden. - Wird ein Prozess terminiert, so geht der zugehrige Auslagerrungsdateispeicher verloren. - Lsung: Man nutzt MMF's statt der Auslagerrungsdatei.

Vorteile: - Ermglichen das Einblenden eines Objektes in den virtuellen Adressraum eines Prozesses. - Fr MMFs wird keine File-I/O-API bentigt - Inhalte von Datenstrukturen knnen wiederverwendet werden. - Implementierung fr Dateipuffer entfllt! - Bietet die Mglichkeit Daten mit anderen Prozessen zu teilen. - Die Auslagerungsdatei wird entlastet.

30.01.2009

Win32 Systemprogrammierung

71

3.4 Memory-Mapped Files: Rechte


Fr MMFs werden Rechte wie bei Dateien vergeben. PAGE_READONLY: Die Seiten des allokierten Speicherbereiches knnen nur gelesen werden. PAGE_READWRITE: Vollzugriff, die Die Seiten des allokierten Speicherbereiches knnen gelesen und beschrieben werden insofern fr die zugehrige Datei sowohl GENERIC_READ als auch GENERIC_WRITE definiert wurden. PAGE_WRITECOPY: Wird die MMF verndert (beschrieben), so wird eine Kopie dieser in der Pageing-File angelegt.

30.01.2009

Win32 Systemprogrammierung

72

3.4 Memory-Mapped Files: Erstellen I Files:


HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpsa, DWORD fdwProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpMapName ); Parameter: - hFile: Datei-Handle mit kompatiblen Rechten zu fdwProtect. - lpsa : Spezielle Zugriffsrechte, fr normale Dateien: NULL (wird z.B.: dann genutzt, wenn das MMF eine EXE-Datei ist) - fdwProtect : Zugriffsrechte der MMF siehe HIER

- dwMaximumSizeHigh : Absolute Maximalgre der MMF, MMF kann nicht darber hinaus wachsen! - dwMaximumSizeLow : Mindestgre der MMF - lpMapName: Namensraum, erlaubt den Zugriff von anderen Prozessen aus.
30.01.2009 Win32 Systemprogrammierung 73

3.4 Memory-Mapped Files: Erstellen II Files:


HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpsa, DWORD fdwProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpMapName ); Rckgabewerte: - NULL bei Fehler sonst MMF-Handle. Anmerkungen: - Wenn dwMaximumSizeHigh=0 und dwMaximumSizeLow=0, dann gre der MMF = Dateigre

30.01.2009

Win32 Systemprogrammierung

74

3.4 Memory-Mapped Files: ffnen Files:


HANDLE OpenFileMapping ( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpNameP ); Rckgabewerte: - NULL bei Fehler sonst MMF-Handle. Parameter: - dwDesiredAccess: - bInheritHandle: - lpNameP: Zugriffsrechte der MMF siehe HIER Dient der Vererbung des Objektes. Namensraum welcher durch CreateFileMapping vergeben wurde.

Anmerkungen:

- Kann mit CloseHandle gelscht werden.

30.01.2009

Win32 Systemprogrammierung

75

3.4 Memory-Mapped Files: Einblenden Files: HANDLE MapViewOfFile ( HANDLE hMapObject, DWORD dwAccess,
DWORD dwOffsetHigh, DWORD dwOffsetLow, DWORD cbMap); Rckgabewerte: - NULL bei Fehler sonst Startadresse der file-view. Parameter: - hMapObject: Handle eines MMF-Objektes. - dwAccess: Zugriffsrechte (Kompatibel zu MMF-Objekt whlen!) - cbMap: Gre der gemappten Region in Byte. - dwOffsetHigh, dwOffsetLow: Startadresse der View im Objekt. Anmerkungen: - cbMap = 0 => ganzes File Mappen - dwOffsetHigh und dwOffsetLow = 0 dann vom Dateianfang mappen, sonst immer ein Vielfaches von 64K whlen
30.01.2009 Win32 Systemprogrammierung 76

3.4 Memory-Mapped Files: Beispiel Files:

30.01.2009

Win32 Systemprogrammierung

77

3.4 MMF: Systemaufrufe Systemaufrufe


UNIX Nicht vorhanden! Nicht vorhanden! mmap (jede regulre Datei) munmap Win32 CreateFileMapping OpenFileMapping MapViewOfFile Beschreibung Erstellt ein MMF ffnet eine MMF MMF in Addressraum einblenden. MMF schlieen

UnmapViewOfFile

30.01.2009

Win32 Systemprogrammierung

78

3.5 Statische Bibliotheken


Eigenschaften: beim Kompilationsvorgang werden Bibliothekskomponenten ins Programm hineinkopiert. (Code und Daten) Programm ist nach Kompilation unabhngig von der Bibliothek. (Version bzw. Vorhandensein der Bibliothek) Programme werden grer (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 ausfhrbares Programm zusammen. Linker sucht aus den Bibliotheksdateien die im Programm referenzierten, Komponenten heraus, und fgt sie dann in das Programm ein.

30.01.2009

Win32 Systemprogrammierung

79

3.5 Dynamische Bibliotheken


DLL allgemein: werden bei bedarf von der Festplatte geladen (Ladeverzgerung!) Versionswahl zur Laufzeit mglich (explizites linken). DLL als shared library: knnen von mehreren Programmen gleichzeitig benutzt werden befinden sich nur ein mal im Speicher DLL-Komponenten werden in den Adressraum des Programms eingeblendet (gemappt)

30.01.2009

Win32 Systemprogrammierung

80

3.5 Dyn. Bibliothek erstellen UNIX:

//mydll.cpp extern "C" int summe( int a, int b ) { return a + b; } #include <stdio.h> extern "C" void _init( void ) { printf(Bibliothek geffnet } extern "C" void _fini( void ) { printf(Bibliothek geschlossen }

g++ -Wall -shared mydll.cpp -o libmydll.so


30.01.2009 Win32 Systemprogrammierung 81

3.5 Dyn. Bibliothek erstellen Windows:


//mydll.cpp 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 Adreraum eines Prozesses eingeblendet case DLL_THREAD_ATTACH: // Der zugehrige Proze hat einen neuen thread gestartet. case DLL_THREAD_DETACH: // Der zugehrige Proze hat einen thread gestoppt. case DLL_PROCESS_DETACH: // Die DLL wird aus dem Prozeraum eines Prozesses entfernt default: /*ERROR*/ break; } return TRUE; }

cl -LD -GX mydll.cpp


30.01.2009 Win32 Systemprogrammierung 82

3.5 Dyn. Bibliotheken: implizietes linken


Unter Windows entstehen beim Erzeugen einer DLL zwei Dateien: lib-Datei: enthlt Platzhalter fr Programmcode bzw. Daten die sog.stubs dll-Datei: enthlt 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: Bentigte DLL's werden geladen. Verweise auf Dummyfunktionen im Programm werden ersetzt. Dann Programmstart. Beim ausfhren des Programmes: Kein Unterschied.

30.01.2009

Win32 Systemprogrammierung

83

3.5 Dyn. Bibliotheken: Einbinden (implizietes linken) Windows oder UNIX:


#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 fr UNIX und
Windows gleich

30.01.2009

Win32 Systemprogrammierung

84

3.5 Dyn. Bibliotheken: explizites linken


Beim Linken des Programmes: Dem Compiler und damit dem Linker werden die Komponenten der Bibliothek nicht bekannt gemacht. Es findet fr Bibliotheksfunktionen keine Typenkontrolle statt. Nutzung On-Demand. (Programmierer hat mehr Kontrolle.) Beim starten des Programmes: Kein Unterschied. Beim ausfhren des Programmes: Bibliotheken werden durch Betriebssystemfunktionen geladen. Bibliothekskomponenten werden durch Betriebssystemfunktionen genutzt.

30.01.2009

Win32 Systemprogrammierung

85

3.5 Dyn. Bibliotheken explizites linken Systemaufrufe: Systemaufrufe


UNIX void* dlopen dlclose Win32 HINSTANCE LoadLibrary FreeLibrary Beschreibung Typ des Objektes Bibliothek ffnen Bibliothek schlieen

dlsym

GetProcAddress

Funktionspointer ermitteln

30.01.2009

Win32 Systemprogrammierung

86

3.5 Dyn. Bibliotheken: Einbinden (explizites linken) UNIX:


// einmalig die Bibliothek laden: so_handle = dlopen( "libmydll.so", RTLD_LAZY ); // Typ: Zeiger auf Funktion, die int liefert, zwei int erhlt: typedef int ( *pFuncSumme )( int, int ); // Zeiger auf die Funktion in der DLL: pFuncSumme summe_pf = NULL; if( !so_handle ) { // Laden der Bibliothek hat nicht geklapppt! char *Fehlertext = dlerror(); perror(Fehlertext); exit(EXIT_FAILURE); } // Zeiger auf die darin enthaltenen Funktionen holen: summe_pf = (pFuncSumme)dlsym( so_handle, "summe" );

30.01.2009

Win32 Systemprogrammierung

87

3.5 Dyn. Bibliotheken: Einbinden (explizites linken) Windows:


// Typ: Zeiger auf Funktion, die int liefert, zwei int erhlt: typedef int ( *pFuncSumme )( int, int ); // Zeiger auf die Funktion in der DLL: pFuncSumme summe_pf = NULL; // einmalig die Bibliothek laden: DLL_Handle = LoadLibrary( "mydll.dll"); if( !DLL_Handle ) { GetLastError() fprintf( stderr, "Fehler beim Laden der DLL!\n" ); exit( 2 );

// Zeiger auf die darin enthaltenen Funktionen holen: summe_pf = (pFuncSumme) GetProcAddress( DLL_Handle, "summe" );

30.01.2009

Win32 Systemprogrammierung

88

3.6 Prozesse: Einfhrung


Beim Linken des Programmes: DJeder Prozess besitzt seinen eigenen und unabhngigen virtuellen Adressraum. Jeder Prozess besitzt 1..N Threads. (Leichtgewichtsprozesse) Jeder Prozess kann: - Neue Threads erstellen (vom Prozess abhngig). - Neue unabhngige Prozesse erstellen. - Mit anderen Prozessen Kommunizieren. Jeder Prozess hat: - Ein oder mehr Datensegmente mit Globalen variablen - Ein oder mehr Codesegmente - Ein oder mehr Heaps - Einen Stack (Prozess-Thread) Jeder Thread: - Nutzt Daten, Code, Heaps und die Umgebungsvariablen des Prozesses. (Synchronisation!)

Code Global Variables Process Heap Process Resources Open Files, Heaps, Environment Block Thread 1 TLS Stack

Thread N TLS Stack


89

30.01.2009

Win32 Systemprogrammierung

3.6 Prozesse: erstellen I


LBOOL CreateProcess ( LPCTSTR lpImageName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpsaProcess, LPSECURITY_ATTRIBUTES lpsaThread, BOOL bInheritHandles, DWORD dwCreate, LPVOID lpvEnvironment, LPCTSTR lpCurDir, LPSTARTUPINFO lpsiStartInfo, LPPROCESS_INFORMATION lppiProcInfo)

Rckgabewerte: - NULL bei Fehler (wenn kein SHE) sonst Zeiger auf Speicherbereich der Gre dwBytes.

30.01.2009

Win32 Systemprogrammierung

90

3.6 Prozesse: erstellen II


Parameter: - lpImageName: Name des auszufhrenden Programms. - lpCommandLine: Komandozeilen Argumente - lpsaProcess: Sicherheitsattribute des Programms. (NULL=Default) Sicherheitsattribute des Threads. (NULL=Default) - lpsaThread: - bInheritHandles: Option: Handles an Kinder vererben (Flag) Handles mssen dennoch als vererbbar markiert sein. - dwCreate: Verschiedene Prozesserstellungsoptionen (Flags) siehe Hier - lpvEnvironment: Umgebungsvariablen (NULL=Parrent's) Umgebungsvariablen sind Paare: (Name;Wert) - lpCurDir: aktuelles Arbeitsverzeichnis (NULL=Parrent's) - lpsiStartInfo: Eigenschaften des Hauptfensters des Programms. - lppiProcInfo: Informationen ber den erstellten Prozess (Ausgabeparameter)

30.01.2009

Win32 Systemprogrammierung

91

3.6 Prozesse: Erstellungsoptionen (dwCreate)


CREATE_SUSPENDED: Erstellt einen Prozess, dessen Prozess-Thread schlafen gelegt wird. Der Prozess kann mit ResumeThread() geweckt werden. DETACHED_PROCESS: Erstellt einen Prozess ohne Konsole. CREATE_NEW_CONSOLE: Erstellt einen Prozess mit neuer Konsole CREATE_NEW_PROCESS_GROUP : Der 'Prozess erffnet eine neue Gruppe in der alle teilnehmenden Prozesse die gleiche Konsole benutzen.

30.01.2009

Win32 Systemprogrammierung

92

3.6 Prozesse: Prozessinformationen


Prozesse besitzen ID's und Handles: typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION; ID's und Handles: - Es kann mehrere Handles zu einem Objekt geben ID's nicht - Objekt-ID's sind einzigartig und unvernderlich. - Jedes Objekt besitzt eine ID solange es existiert.

30.01.2009

Win32 Systemprogrammierung

93

3.6 Prozesse: Terminieren


VOID ExitProcess (UINT nExitCode); Parameter: - nExitCode: Terminierungsstatus An merkungen: BOOL TerminateProcess ( HANDLE hProcess, UINT uExitCode ); Parameter: den aufrufenden Prozess mit all seinen Threads - Beendet - Ignoriert _finaly und _except Handler des SEH! (Resourcen vorher freigeben!) An merkungen: - hProcess: Handle eines Prozesses. - uExitCode: Terminirungsstatus (Eingabe-Parameter)

- Beendet einen anderen Prozess mit all einen Threads - Ignoriert SEH komplett! - Resourcen werden nicht freigeben!
30.01.2009 Win32 Systemprogrammierung 94

3.6 Prozesse: Auf Terminierung warten


HANDLE OpenProcess ( DWORD fdwAccess, BOOL fInherit, DWORD IDProcess ); Parameter: - hObject: Handle eines Objektes. Hier: Prozess-Handle.

- dwTimeOut: Wartezeit in Millisekunden. Rckgabewerte: 0=>blockiert nicht, INFINITE=>blockiert - WAIT_OBJECT_0: Prozess wurde beendet. - WAIT_TIMEOUT: - WAIT_FAILED: Anmerkungen: Wartezeit ist abgelaufen. Warten fehlgeschlagen (z.B.: keine SYNCHONIZE-Option gesetzt)

- Keine

30.01.2009

Win32 Systemprogrammierung

95

3.6 Prozesse: Terminierungssignale


BOOL GenerateConsoleCtrlEvent ( DWORD dwCtrlEvent, DWORD dwProcessGroup ); Rckgabewerte: - 0 bei Fehler sonst Erfolg.

Parameter: - dwCtrlEvent: Beenden: CTRL_C_EVENT (Dabei: dwProcessGroup=NULL) Unterbrechen: CTRL_BREAK_EVENT - dwProcessGroup: Spezifiziert die betreffende Prozessgruppe

Anmerkungen: - Ermglicht es anderen Prozessen ihre Resourcen freizugeben bevor sie terminieren.

30.01.2009

Win32 Systemprogrammierung

96

HANDLE OpenProcess ( DWORD fdwAccess, BOOL fInherit, 3.6 Prozesse: ffnenDWORD IDProcess ); Rckgabewerte:

Parameter: - NULL bei Fehler sonst MMF-Handle.

- 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: Anmerkungen: - IDProcess:

Option: Rckgabe-Handle vererbbar? Idendifiziert den zu ffnenden Prozess.

- Kann mit CloseHandle gelscht werden.


30.01.2009 Win32 Systemprogrammierung 97

3.6 Prozesse: Terminierungsstatus abfragen


BOOL GetExitCodeProcess ( HANDLE hProcess, LPDWORD lpdwExitCode ); Rckgabewerte: - Ungleich 0 bei Erfolg sonst Fehler. Parameter: - hProcess: Handle eines Prozesses. - lpdwExitCode: Terminirungsstatus (Ausgabeparameter) Anmerkungen: - Ermittelt den Terminierungsstatus eines Prozesses. - Der Prozess muss die Abfrage durch PROCESS_QUERY_INFORMATION erlauben

30.01.2009

Win32 Systemprogrammierung

98

3.6 Prozesse: Systemaufrufe Systemaufrufe


UNIX fork, das Kind ruft execl oder execle oder auf. exit - schliesst Dateien - schreibt Pufferdaten in Dateien Win32 Beschreibung Einen neuen Prozess erstellen Prozess beendet sich selbst.

CreateProcess ExitProcess - terminiet den Prozess sofort

Waitpid(unblocking option) WaitForSingleObject wait (blocking) kill Nicht vorhanden!

Auf Terminierung von Prozessen warten

GenerateConsoleCtrlEv Terminierungssignal senden ent OpenProcess


ffnet einen existierenden Prozess Terminierungsstatus anderen Prozess beenden
99

Waitpid(unblocking option) GetExitCodeProcess wait (blocking) kill mit SIGKILL, SIGTERM


30.01.2009

TerminateProcess

Win32 Systemprogrammierung

3.6 Prozesserstellung: Unix

int pid; pid = fork(); if(pid==0) { // Kindprozess execle ("/bin/ls", NULL); } // Wait until child process exits. int status=0; wait(&status);

30.01.2009

Win32 Systemprogrammierung

100

3.6 Prozesserstellung: Windows

STARTUPINFO si; PROCESS_INFORMATION pi; // 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 );

30.01.2009

Win32 Systemprogrammierung

101

3.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 Handles bInheritHandle=TRUE fr CreateProcess() Elternprozess sendet Handles an das Kind. - durch die Struktur STARTUPINFO fr CreateProcess() in der STDIN bzw. STDOUT berschreiben werden. - durch IPC, Umgebungsvariablen, CML-Parameter Anmerkungen: - vererbte Handles sind eigenstndige Kopien. (z.B.: unabhngiger File-Pointer bei Dateihandle) - auch vererbte Handles mssen geschlossen werden
30.01.2009 Win32 Systemprogrammierung 102

3.6 Prozesse: Vererbung von Handles II


Handle bermittlung: berschreiben von hStdInput bzw. hStdOutput mit File-Handles welche an das Kind weitergereicht werden sollen. dwFlags muss auf STARTF_USESTDHANDLES setzen. Kindprozess erstellen. typedef struct _STARTUPINFO { ... DWORD dwFlags; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO;

30.01.2009

Win32 Systemprogrammierung

103

3.6 Prozesse: Vererbung von Handles III


Erstellen von vererbaren Handles: typedef struct SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle; } SECURITY_ATTRIBUTES; Handle h1, h2, h3; SECURITY_ATTRIBUTES sa = (sizeof (SECURITY_ATTRIBUTES), NULL, TRUE); ... h1 = CreateFile (..., &sa, ...) // vererbbares Handle h2 = CreateFile (..., NULL,...) // nicht vererbbares Handle

30.01.2009

Win32 Systemprogrammierung

104

3.6 Prozesse: Vererbung von Handles IV


Process 1s Object Table
Handle 1 Inheritable File A

Process 2s Object Table


Inherited Handle 1

Handle 2

Not Inheritable

File B

Create File

Handle 2

Handle 3

Inheritable

File C

Inherited

Handle 3

Handle 4

Not Inheritable

File D

Create File

Handle 4

File E

Parent

Child

30.01.2009

Win32 Systemprogrammierung

105