21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 1 von 27
Hochschule RheinMain WS 2009/2010Allgemeine Informatik (B.Sc.)Vertiefung Bachelor AI
Windows32 Systemprogrammierung
Eine Gegenüberstellung vonSystemaufrufen unterWindows und Linux
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 2 von 27
Grundlagen Windows APIDatentypen und NotationenRegistrierungsdatenbank
Dateioperationen Dateisysteme und -verwaltungBEISPIEL: cat
Prozesse und Threads SpeicherverwaltungSynchronisation
Dynamic Link LibrariesInterprozesskommunikation Named Pipes
MailslotsVerteilte Systeme WCF
SocketsQuellcodeportabilität
Inhalte
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 3 von 27
Grundlagen – Windows API
„Application Programming Interface“ #include <windows.h>
Abgeschlossene Bibliothek einheitlicher ProgrammierschnittstellenIn C/C++ und Assembler → kernel32.dll, user32.dll, gdi32.dll, …Funktionsverweise auf System Call Table im Betriebssystemkern
Entwicklungen : Native API, Win32 API, .NET Framework,MFC-Bibliothek
Gleiches Grundkonzept in Linux #include <unistd.h>
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 4 von 27
Grundlagen – Datentypen und Notationen
„Ungarische Notation“
Datentypen und Variablennamen bestehen ausPräfixen (Erläutern Verwendungszweck im Programm)Basistyp (Erläutern Inhalt der Variablen)
BEISPIEL:DWORD dwThreadIdArray[MAX_THREADS];
Verbesserte Quellcode-Lesbarkeit„Sprechende“ Variablennamen
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 5 von 27
Grundlagen – Datentypen und Notationen
DWORD 4 Byte (32 Bit) unsigned IntegerLPWORD Zeiger auf 2 Byte (16 Bit) unsigned IntegerHANDLE void-Zeiger Speicherbereich „Objektidentifikator“HKEY Objektidentifikator eines Registrierungsschlüssels…
Typdefinitionen aus ISO C Standard (Plattformabhängig ! )
size_t vorzeichenloser Datentyp (mindestens 16 Bit)time_t Integer oder Float (32 oder 64 Bit)...
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 6 von 27
Grundlagen – Registrierungsdatenbank
Konfigurationsdatenbank von Windows seit NT
Einträge z.B. durch Installationsprogramme: Key-Value-PaareInstallationspfade, Programmkonfigurationen, ...
+ Zentraler Ablageort für Windows und -Programme+ Schnell durch direkte Speicherung der Datentypen– Problematisch, wenn „defekt“ oder ungepflegt → „uninstall“– Einstellungen nicht portabel bzw. rechnerübergreifend
Manipulationen von Hand durch das Dienstprogramm regedit.exe
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 7 von 27
Grundlagen – Registrierungsdatenbank
DHKEY_LOCAL_MACHINE\SOFTWARE
\Microsoft\Windows
\CurrentVersion\Run
Grob Vergleichbar:
Pseudodateisystem undKonfigurations-Skripte z.B. in /etc/init.d/
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 8 von 27
Grundlagen – Registrierungsdatenbank
BEISPIEL: Auslesen der RUN-Konfiguration
HKEY hTestKey;if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS ){
/* Schlüssel-Informationen auslesen */RegQueryInfoKey(...)/* Wenn Unterschlüssel vorhanden */
RegEnumKeyEx(...)/* Wenn Werte vorhanden */
RegEnumValue(...)} RegCloseKey(hTestKey);
Quelle: MSDN Library lokale Demo
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 9 von 27
Dateioperationen – Dateisysteme und -verwaltung
FAT16, FAT32, NTFS
Jeder Datenträger als eigenenes Laufwerk eingebundenGesamtstruktur für Benutzer unsichtbar im System
Ext2, Ext3, Ext4, ReiserFS, …
Gesamte Baumstruktur für die Benutzer nutzbar undeinsehbar, sofern entsprechende Berechtigungen gesetzt
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 10 von 27
Dateioperationen – BEISPIEL: cat
#include "stdafx.h" //Application Framework eXtensions#include <windows.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <string.h>
int _tmain(int argc, _TCHAR* argv[]) //ASCII oder Unicode{
HANDLE hInFile, hStdIn = GetStdHandle(STD_INPUT_HANDLE);HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);DWORD nIn, nOut;
hInFile = CreateFile(argv[i], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hInFile == INVALID_HANDLE_VALUE){… //Fehlermeldung
}while(ReadFile(hInFile, &chr, 1, &nIn, NULL)&& (nIn != 0)
&& WriteFile(hStdOut, &chr, nIn, &nOut, NULL));CloseHandle(hInFile);
}
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 11 von 27
Prozesse und Threads – Speicherverwaltung
Strukturen: Jobs, Prozesse, (Kernel) Threads, Fibers (MS)
Prozesse:Virtueller Adressraum von 4 GB2 GB für System 2 GB für BenutzerMindestens ein Thread und dessen HeapThreads:Entsprechen POSIX Threads von LinuxEin Übergabeargument: (struct-)Zeigerpthread_create ↔ CreateThreadpthread_exit ↔ ExitThread
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 12 von 27
Prozesse und Threads
CreateProcess(...) → eigenener, neuer Prozess„Kind“prozess kann auch nach „Eltern“prozess aktiv seinKeine abgegrenzten Prozessgruppen (aber Signalgruppen)Handles und IDs
fork() → exakte Prozesskopie exec(...) → ÜberlagerungHierarchie: Ende des Elternprozesses beendet KindprozesseBegrenzte ProzessgruppenNur Prozess-IDs
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 13 von 27
Prozesse und Threads
BEISPIEL: Prozesserzeugung
Zusammenfassung von fork(...) und exec(...) in CreateProcess(...)
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
Quelle: MSDN Library lokale Demo
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 14 von 27
Prozesse und Threads
BEISPIEL: Threaderzeugung
Voraussetzung:(Funktions)zeiger auf Start-Adresse definiert
CreateThread( NULL, // default security attributes 0, // use default stack size MyThreadFunction, // thread function name pDataArray[i], // argument to thread function 0, // use default creation flags &dwThreadIdArray[i] ) // returns the thread identifier
Quelle: MSDN Library
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 15 von 27
Prozesse und Threads – Synchronisation
MSDN Library: Synchronization ObjectsHauptsächlich: Event, Mutex, Semaphore, TimerSekundär nutzbar: Change notification, Console input,
Job, Memory resource notification, Process, Thread
Besonderheit: Mehrere Threads in EINEM Prozess:void WINAPI EnterCriticalSection(
__inout LPCRITICAL_SECTION lpCriticalSection);
BOOL WINAPI TryEnterCriticalSection(__inout LPCRITICAL_SECTION lpCriticalSection);
In Linux bekannt: Semaphore, Mutex, Signale
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 16 von 27
Dynamic Link Libraries
Während Laufzeit nachladbare Funktionsbibliothek bzw.Klassenbibliothek (ActiveX) (Sicherheitskritisch!)
Enthalten ausführbaren Programmcode.dll dynamisch, .lib statisch (und compile-stub für dll)Wird in den Speicherbereich des Prozesses eingebundenWiederverwendbarer und „schnell“ austauschbarer CodeNutzbar „wenn nötig“ (z.B. OpenGL, DirectX, encoder, ...)
Ähnliches Konzept:Shared Objects (.so Dateien)
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 17 von 27
Dynamic Link Libraries
BEISPIEL: dll-Export einer Additionsfunktion
#include <windows.h>// DLL entry function (called on load, unload, ...)BOOL APIENTRY DllMain( HANDLE hModule, DWORD dwReason, LPVOID lpReserved ) { return TRUE; }// Exported function - adds two numbersextern "C" __declspec(dllexport) double AddNumbers(double a, double b) { return a + b; }
#include <windows.h>#include <stdio.h>// Import function that adds two numbersextern "C" __declspec(dllimport) double AddNumbers(double a, double b);int main(int argc, char *argv[]) { double result = AddNumbers(1, 2); printf("The result was: %f\n", result); Return 0; }
Quelle: Wikipedia
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 18 von 27
Interprozesskommunikation – (Named) Pipes
Wie UNIX: Anonyme Pipes zeichenbasiert, halbduplex
Named Pipes: vgl. FIFO, aber nachrichtenbasiert, vollduplex
Pipe-Server ruft CreateNamedPipe(...) auf (ab NT)Clients greifen über Dateioperation CreateFile(...) zu
MSDN Library
FIFOs (halbduplex, zeichenorientiert, lokal nutzbar) mkfifo
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 19 von 27
Interprozesskommunikation – (Named) Pipes
Quelle: Hart - Windows System Programming
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 20 von 27
Interprozesskommunikation – Mailslots
„Rundruf“-Mechanismus: meist ein Sender, viele EmpfängerBeispiel: Mailslot-Nutzung z.B. bei Systemdienst-Aufruf
„net send [IP-Adresse] <Nachricht>“
Eine RichtungKeine Empfangsgarantie/-bestätigungNetzwerkfähigLänge der Nachrichten begrenzt (424 Bytes) MSDN Library
Nicht vorhanden (Hier eher z.B. Nutzung von Signalen)
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 21 von 27
Interprozesskommunikation – Mailslots
Quelle: Hart - Windows System Programming
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 22 von 27
Verteilte Systeme – WCF
● Windows Communication Foundation● DCOM, Enterprise Services, MSMQ, WSE, Web-Services unter einer
einheitlichen API● .NET Framework ab Version 3.0● mögliche Sprachen: C++, C#, VB
● Address (Adresse) als URI (https://srv.domain.com/data/Service)● Binding (Anbindung) Festlegung von Protokoll und Kodierung● Contract (Vertrag) legt Schnittstellen und Methoden fest
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 23 von 27
Verteilte Systeme – Sockets
● Implementierung von IP unter BSD● durch die freie Lizenz nahezu 1:1 auch unter anderen Systemen
implementiert, auch unter Windows● Programmierung auf allen Systemen sehr ähnlich
● bind(),listen(), accept(), connect(), ...
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 24 von 27
Quellcodeportabilität
Vor allem von Serveranwendungen wird oft vorausgesetzt, dass diese zumindest auf Windows, UNIX und Linux laufen.
● ein Quellcode für alle Plattformen● per Makros und Build-Parameter werden Zielplattform, Prozessor-
architektur und 32- oder 64-Bit festgelegt● bedingte Compilierung (#IFDEF, …) sollte wenn möglich vermieden
werden● der Quellcode sollte mit verschiedenen Compilern kompatibel sein● Systemvoraussetzungen sollten auf allen Systemen ähnlich sein
Bis auf wenige Ausnahmen, sollte dies bei einem ordentlichen Code ohne GUI-Interface möglich sein.
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 25 von 27
Quellcodeportabilität
Strategien, um Portabilität zu erreichen
● Bibliotheken verwenden, die Open-Source sind oder von Microsoft bereitgestellt werden, welche POSIX-Funktionen unter Windows emulieren (häufig eingesetzt)
● Bibliotheken verwenden, die Windows-Funktionen unter UNIX/Linux emulieren (sehr rar)
● Industrie-Standard-Funktionen verwenden, die auch Microsoft direkt unterstützt (häufig)
● Makros anstelle von Bibliotheken verwenden, welche ein OS unter einem Anderen emuliert (auch rar)
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 26 von 27
Quellcodeportabilität
Windows Services for UNIX
● SFU: Microsoft Produkt, das ein UNIX-Subsystem (Interix) im NT-Userspace bereitstellt
● aktuelle Version: 3.5, kann von der Microsoft Webseite bezogen werden
● erfüllt theoretisch alle POSIX-Anforderungen● wird lt. Microsoft nicht weiter unterstützt
21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 27 von 27
Quellen und KontaktMarius Schäfer
Ralf Erik Rossel([email protected])
Microsoft Developer Network – Entwicklerbibliothek:http://msdn.microsoft.com/en-us/library/ee663297(v=VS.85).aspx
Literatur:Johnson M. Hart: Windows System Programming (4th. Edition)
Tutorial: Einführung in die Win32-Programmierung in Chttp://www.pronix.de/pronix-1023.html
Ergänzung der Vorgänger:http://www.cs.hs-rm.de/~weber/sysprog/sysp.html
Wikipedia-Artikel als Ausgangspunkt zur Stichwortsuche:http://en.wikipedia.org/wiki/Windows.h
System Call Table von Linux und Windows (x86 Architektur):http://lxr.linux.no/#linux+v2.6.34/arch/x86/kernel/syscall_table_32.Shttp://www.metasploit.com/users/opcode/syscalls.html