27
21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 1 von 27 Hochschule RheinMain WS 2009/2010 Allgemeine Informatik (B.Sc.) Vertiefung Bachelor AI Windows32 Systemprogrammierung Eine Gegenüberstellung von Systemaufrufen unter Windows und Linux

Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

  • Upload
    vankhue

  • View
    224

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 2: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 3: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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>

Page 4: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 5: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 6: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 7: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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/

Page 8: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 9: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 10: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

}

Page 11: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 12: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 13: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 14: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 15: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 16: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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)

Page 17: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 18: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 19: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 19 von 27

Interprozesskommunikation – (Named) Pipes

Quelle: Hart - Windows System Programming

Page 20: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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)

Page 21: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 21 von 27

Interprozesskommunikation – Mailslots

Quelle: Hart - Windows System Programming

Page 22: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 23: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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(), ...

Page 24: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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.

Page 25: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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)

Page 26: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

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

Page 27: Windows32 Systemprogrammierung - cs.hs-rm.deweber/sysprog/proj10/windows.pdf · 21. Juni 2010 Win32 Systemprogrammierung Marius Schäfer Ralf Erik Rossel 3 von 27 Grundlagen – Windows

21. Juni 2010 Win32 SystemprogrammierungMarius Schäfer Ralf Erik Rossel 27 von 27

Quellen und KontaktMarius Schäfer

([email protected])

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