Operativsystem IS1350 LAB 3 2009-09-21 Checklista: ÿ ÿ Inloggningsuppgifter till KTH.SE-konto Tillgång till PC med Windows och C-kompilator, t.ex. Dev-C++ Sammanfattning I den här laborationen ska vi titta närmare på funktionalitet som Windows tillhandahåller dels när vi programmerar user mode tillämpningar men även i de fall vi programmerar drivrutiner för kernel mode. Utvecklingsverktyg väljes fritt av gruppen. Exempel på utvecklingsverktyg är: Dev-C++, http://www.bloodshed.net/devcpp.html (använd senaste betan). Redovisning Redovisning av uppgifter för betyget G sker gruppvis, alla i gruppen ska kunna redovisa väsentliga delar av uppgifterna. Uppgifterna för betyget H redovisas individuellt. Tips I Dev-C++ behöver du ange följande parameter för länkaren för att kunna arbeta med Winsock 2 biblioteket: -lws2_32 Detta gör du genom menyn: Project Project Options Parameters Linker Installera den virtuella maskinen Hämta den virtuella maskinen från kurshemsidan, http://www.ict.kth.se/courses/is1350/winxp.exe
och kör den för att packa upp den. OBS! Du behöver åtminstone 5GB ledigt diskutrymme med ntfs-filsystem. Hämta och installera VMWare Player från http://www.vmware.com/ om du inte redan har gjort det i labb 2. Starta VMWare Player och öppna den virtuella maskinen. Logga in med användaren windows utan att ange ett lösenord. Packa upp och installera Windows Device Driver Development Kit från foldern ddk på skrivbordet i den virtuella maskinen. Installera Dev cpp från skrivbordet (devcpp-4.9.9.2_setup) OBS! Om du startar om den virtuella Windows-datorn så måste du aktivera installationen. Har du tillgång till Internet kan du göra det, annars måste du skriva in en ny licensnyckel. Som KTH student kan du hämta en licensnyckel för Windows XP via MSDNAA, se http://www.kth.se/student/support/itsc/1.3813 Exempel på Windows Socket programmering Gå igenom och titta på exemplet i C:\Documents and Settings\windows\My Documents\exempel\WinSockets. OBS! Brandväggen kan behöva stängas av för att kunna köra serverdelen av exemplet. Anropa servern via loopback, 127.0.0.1 Uppgift 1: Client sockets I en föregående laboration (laboration 1) skrev du ett litet program för att läsa ut information om filer i Unix miljö. I den här laborationen ska vi skriva en klient för Windows som kan kommunicera med en färdig stat-server använd Dev C++ miljön. Det vill säga du ska endast skriva klienten (för Windows) servertillämpningen (FileInfoServer54321.exe) hittar du i katalogen fileinfoserver på skrivbordet. I katalogen fileinfoserver finns en fil med namnet test.txt som du kan testa att ditt program fungerar med. Eventuellt måste du sätta Win95-kompabilitet på FileInfoServer54321.exe för att den ska fungera. Klienttillämpningen ska kunna ta emot ett par argument från kommando-raden; det första argumentet talar om IP adressen till servern, nästa argument talar om till vilken port tillämpningen ska ansluta sig mot och det sista argumentet pekar ut vilken fil vi ska få information om. Kör ditt program (om det heter rstatclient.exe) enligt nedan mot loopback interface:t 127.0.0.1: C:\Temp>rstatclient.exe 127.0.0.1 54321 test.txt Tillämpningen får som svar en färdigformaterad text (som i laboration 1), denna
text ska skrivas ut på skärmen. Tips, eftersom du inte vet hur mycket data du kommer att få som svar, kan du inte använda en buffert med förutbestämd storlek. Funktionen för att ta emot data ser ut på följande sätt: int recv(socket s, char* buf, int len, int flags); Beskrivning av parametrar: s [in] The descriptor that identifies a connected socket. buf [out] The buffer for incoming data. len [in] The length, in bytes, of buf. flags [in] Pointer to flags. Detta medför att om du till exempel har allokerat en buffert på 512 tecken kan du behöva anropa recv flera gånger i en loop, så länge det finns data att läsa från socket:en. Funktionen returnerar ett heltal som talar om hur många bytes som tagits emot (om inget gick fel). Tips, följande steg bör tillämpningen hantera: 1. Initiera 2. Skapa socket 3. Koppla upp sig mot servern 4. Skicka filnamnet till servern 5. Ta emot information om filen från server 6. Skriva ut informationen på skärmen 7. Koppla ner och frigöra resurser För referenser och hjälp med programmeringen se länkar under Dokumentation. Uppgift 2: Undersöka en drivrutin I den här uppgiften behöver du inte skriva någon kod, utan du ska istället analysera färdig kod. Du ska analysera en drivrutin kallad sioctl (finns i katalogen C:\ioctl), drivrutinen är ett exempel från Windows DDK. IOCTL är ett minimalistiskt exempel och är tänkt att demonstrera funktionalitet i Windows och är tänkt att fungera i undervisningssyfte. Din uppgift är att analysera koden och bilda dig en uppfattning om hur en drivrutin fungerar i Windows. Du ska kunna redogöra för centrala koncept gällande drivrutiner i Windows det vill säga hur en drivrutin kommunicerar, hanterar olika händelser, hur drivrutinstacken i Windows fungerar i grova drag, etc. IOCTL består av två delar dels själva drivrutinen men även ett program som kan kommunicera med drivrutinen.
Som hjälp kan du läsa om hur man skriver en Windows device driver på den här länken: http://www.adp-gmbh.ch/win/misc/writing_devicedriver.html Instruktioner för att kompilera och köra exemplet: Börja med att öppna ddk-prompten från startmenyn, välj Windows XP och Free Build Environment. Gå till katalogen C:\ioctl. (OBS! Sökvägen till källkodskataloger får inte innehållet blanksteg). Kompilera med kommandot build. När kompileringen är klar finns klienten ioctlapp.exe i katalogen C:\ioctl\exe\objfree_wxp_exe_x86\i386 och drivrutinen sioctl.sys i C:\ioctl\sys\objfree_wxp_exe_x86\i386. Kopiera sioctl.sys till C:\ioctl\exe\objfree_wxp_exe_x86\i386. Nu kan du köra ioctlapp.exe Uppgift 3: En drivrutin med tillhörande user mode program Utifrån din analys i ovanstående steg ska du skapa en enkel prototyp för en drivrutin samt ett user mode program som kan kommunicera med drivrutinen. Din drivrutin ska inte göra speciellt mycket, det ska räkna antalet gånger någon försöker göra en read respektive write operation mot den. Eftersom operativsystemet är sårbar och känslig för kernel mode kod bör din drivrutin följa en någorlunda god programmeringssed, detta innebär att drivrutinen ska kunna laddas in men även laddas ur. Därför behöver din drivrutin frigöra eventuella resurser den har initierat då den laddas ur minnet. Förutom att kunna hantera inladdning och urladdning ska din drivrutin som sagt räkna antalet read respektive write operationer som drivrutinen anropats med, detta innebär att den måste kunna hantera IRP:n som motsvarar read och write. Varje gång drivrutinen laddas ur minnet ska antalet read och write operationer skrivas ut med hjälp av: DbgPrint( Detta skriver ut din text... ). Man kan fråga sig vart den utskrivna texten hamnar? Den kan man se med hjälp av verktyget DebugView som finns på skrivbordet i zip-arkivet DebugView.zip I katalogen där du har källkoden för din drivrutin skapar du följande två filer som ddk:n använder när du bygger: SOURCES TARGETNAME=YOURDRIVERNAME TARGETPATH=OBJ TARGETTYPE=DRIVER SOURCES=YourSourceCode.c MAKEFILE!INCLUDE $(NTMAKEEENV)\makefile.def
Öppna ddk-prompten på samma sätt som i uppgift 2 och byt till din källkodskatalog. OBS! Sökvägen till din källkodskatalog får inte innehållet blanksteg. För att kompilera din kod skriver du build. Usermode programmet har ett syfte och det är att anropa drivrutinen och skapa en del read och write anrop mot den med hjälp av vanliga Windows API:er som ReadFile och WriteFile. Se t.ex. http://msdn.microsoft.com/enus/library/aa364232(vs.85).aspx för en förklaring till ovanstående och andra systemanrop. Så här testar du att det fungerar För att ladda in och ur din drivrutin kan du använda dig av verktyget InstDvr som finns på skrivbordet. Kopiera först din kompilerade drivrutin med filändelse.sys till katalogen C:\Windows\System32\drivers. Kör sedan InstDrv och lägg till hela sökvägen till din drivrutin. Nu kan du installera, starta, stoppa och avinstallera din drivrutin i InstDrv. Eventuellt måste du Starta DebugView och installera och starta drivrutinen. Kör sedan usermode programmet, stoppa och avinstallera drivrutinen och kontrollera i DebugView att antalet anrop verkar stämma. OBS! Välj Capture Kernel under menyalternativet Capture. Eventuellt måste du ta bort markeringen för protect your computer (Windows Vista). Uppgift 4: Server sockets (Endast högre betyg) I den här uppgiften ska du skapa en egen server istället för den som du använde dig av i uppgift 1. Tanken är att servern ska kunna ta emot anrop från klientprogrammet du har skapat, det vill säga servern får ett filnamn. Serverprogrammet ska kontrollera om filen finns på servern och ge ett svar om detta. Om filen finns ska servern returnera storleken på filen och datum för när filen skapades. Detta innebär att du i denna uppgift kommer att arbeta med lyssnande sockets och att ta reda på information om en given fil på hårddisken. Tips, följande steg bör tillämpningen hantera: 1. Initiera 2. Skapa sockets 3. Lyssna på inkommande trafik 4. Acceptera inkommande trafik 5. Kontrollera om filen finns, ta reda på information om filen 6. Skicka ett svar till anroparen
Uppgift 5: Laddare för drivrutin (Endast högre betyg) I denna uppgift ska du fortsätta att utveckla user mode programmet för din drivrutin. Istället för att förlita dig till ett extern program som instdrv för att ladda in drivrutinen ska ditt user mode program själv kunna ladda drivrutinen. Detta innebär att flödet i ditt user mode program bör se ut på följande sätt: 1. Ladda drivrutinen 2. Generera read och write anrop mot drivrutinen 3. Ladda ur drivrutinen
Referenser [1] Winsock Reference http://msdn2.microsoft.com/en-us/library/ms741416.aspx [2] Network Programming Using WIN APIs http://msdn2.microsoft.com/en-us/library/ms817954.aspx [3] Win32 Socket Client http://www.codersource.net/win32_socket_client.html [4] Socket Server in Win32 http://www.codersource.net/winsock_tutorial_server_select_model.html [5] Win32 and COM development http://msdn2.microsoft.com/en-us/library/aa139672.aspx Labfiler Dev C++ http://www.bloodshed.net/devcpp.html DebugView http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx InstDrv http://www.rootkit.com/vault/hoglund/instdvr.zip DDK http://www.microsoft.com TIPS http://www.adp-gmbh.ch/win/misc/writing_devicedriver.html http://www.codeproject.com/kb/system/driverdev.aspx http://www.codeproject.com/kb/system/driverdev2.aspx http://www.codeproject.com/kb/system/driverdev3.aspx http://www.codeproject.com/kb/system/driverdev4asp.aspx http://www.codeproject.com/kb/system/driverdev5asp.aspx