Transcript
Page 1: Het schrijven van een device driver voor Windows 2000

Het schrijven van een device Het schrijven van een device driverdriver

voor Windows 2000

Page 2: Het schrijven van een device driver voor Windows 2000

Over deze presentatieOver deze presentatie

Tijdsduur is ongeveer één uurTijdsduur is ongeveer één uur Het leren begrijpen van een device Het leren begrijpen van een device

driver is erg lastig driver is erg lastig let goed op en maak tijdens relevante let goed op en maak tijdens relevante onderwerpen veel aantekeningenonderwerpen veel aantekeningen

Vragen kunnen gesteld worden na elk Vragen kunnen gesteld worden na elk deelonderwerp en aan het eindedeelonderwerp en aan het einde

Algemeen

Page 3: Het schrijven van een device driver voor Windows 2000

InhoudInhoud

IntroductieIntroductie ((±±5 min.)5 min.)

Algemene toelichting op device driversAlgemene toelichting op device drivers ((±±25 25 min.)min.)

Hulpmiddelen voor schrijven driverHulpmiddelen voor schrijven driver ((±±10 10 min.)min.)

Toelichting op “PPort” voorbeelddriverToelichting op “PPort” voorbeelddriver ((±±15 15 min.)min.)

Toelichting op Cypress EZ-USB oplossingToelichting op Cypress EZ-USB oplossing ((±±5 5 min.)min.)

SlotSlot

Algemeen

Page 4: Het schrijven van een device driver voor Windows 2000

IntroductieIntroductie

Page 5: Het schrijven van een device driver voor Windows 2000

IntroductieIntroductie

Wie ben ikWie ben ik Waarom deze stageWaarom deze stage VoorkennisVoorkennis WerkzaamhedenWerkzaamheden

Introductie

Page 6: Het schrijven van een device driver voor Windows 2000

Wie ben ikWie ben ik

Tommy SoolsTommy Sools Student in derde jaar informatica Student in derde jaar informatica

(blok 11)(blok 11) Stagiair bij technische informaticaStagiair bij technische informatica

Begeleid door Ruud ErmersBegeleid door Ruud Ermers

Introductie

Page 7: Het schrijven van een device driver voor Windows 2000

Waarom deze stageWaarom deze stage

Hobby elektronicaHobby elektronica Diverse computerinterface projecten die Diverse computerinterface projecten die

natuurlijk een device driver vereisennatuurlijk een device driver vereisen Op zoek naar USB microcontroller Op zoek naar USB microcontroller

oplossingoplossing Poging tot zelfstandig leren device driversPoging tot zelfstandig leren device drivers Tenslotte de vraag of er binnen Fontys Tenslotte de vraag of er binnen Fontys

een module bestaat over device driverseen module bestaat over device drivers

Introductie

Page 8: Het schrijven van een device driver voor Windows 2000

VoorkennisVoorkennis

C++ binnen informaticamodulen (Visual C++ binnen informaticamodulen (Visual Studio):Studio): Programmeren in CProgrammeren in C Low Level ProgrammingLow Level Programming InterprocescommunicatieInterprocescommunicatie Events & ExceptionsEvents & Exceptions Geheugentechnieken en –beheerGeheugentechnieken en –beheer

Gedurende twee kwartalen begeleiden Gedurende twee kwartalen begeleiden practica C Programmeren (Borland C++ practica C Programmeren (Borland C++ Builder)Builder)

Introductie

Page 9: Het schrijven van een device driver voor Windows 2000

Voorkennis (2)Voorkennis (2)

Veel hobbyprojecten met Borland DelphiVeel hobbyprojecten met Borland Delphi www.sools.comwww.sools.com

Programmeren aan administratiepakket Programmeren aan administratiepakket Order-Direct tijdens eerste stageOrder-Direct tijdens eerste stage

Hobbyprojecten met 8051 en AVR Hobbyprojecten met 8051 en AVR microcontrollers, vooral in assembler microcontrollers, vooral in assembler taaltaal

Introductie

Page 10: Het schrijven van een device driver voor Windows 2000

WerkzaamhedenWerkzaamheden

Tweede stage, twintig weken,Tweede stage, twintig weken,

momenteel zesde weekmomenteel zesde week Onderzoek doen naar de werking van Onderzoek doen naar de werking van

device driversdevice drivers Ter oefening een aantal drivers Ter oefening een aantal drivers

schrijvenschrijven Practicumhandleiding schrijven over Practicumhandleiding schrijven over

device drivers voor Windows 2000device drivers voor Windows 2000

Introductie

Page 11: Het schrijven van een device driver voor Windows 2000

Einde introductieEinde introductie

Interesse vanuit hobbyInteresse vanuit hobby Ruim voldoende voorkennis en Ruim voldoende voorkennis en

ervaringervaring Stage duurt 20 wekenStage duurt 20 weken Doel is practicumhandleiding Doel is practicumhandleiding

schrijven over Windows 2000 schrijven over Windows 2000 driverontwikkelingdriverontwikkeling

Introductie

Page 12: Het schrijven van een device driver voor Windows 2000

VragenVragen

Er kunnen nu vragen over de Er kunnen nu vragen over de introductie gesteld worden.introductie gesteld worden.

Page 13: Het schrijven van een device driver voor Windows 2000

HulpmiddelenHulpmiddelen

Page 14: Het schrijven van een device driver voor Windows 2000

HulpmiddelenHulpmiddelen

• ComputersystemenComputersystemen

• Microsoft Visual Studio 6.0Microsoft Visual Studio 6.0

• Microsoft Windows 2000 DDK (SP1)Microsoft Windows 2000 DDK (SP1)

• DebugViewDebugView

• LoadDrvLoadDrv

• Talloze andere optionele hulpprogramma’sTalloze andere optionele hulpprogramma’s

HulpmiddeleHulpmiddelenn

Page 15: Het schrijven van een device driver voor Windows 2000

ComputersystemenComputersystemen

• PC voor ontwikkelingPC voor ontwikkeling

• PC voor testenPC voor testen

HulpmiddeleHulpmiddelenn

Page 16: Het schrijven van een device driver voor Windows 2000

OntwikkelsysteemOntwikkelsysteem

• Besturingssysteem is niet relevant,Besturingssysteem is niet relevant,

bijv. Windows 2000 of XPbijv. Windows 2000 of XP• Driver nooit testen op ontwikkelsysteemDriver nooit testen op ontwikkelsysteem

HulpmiddeleHulpmiddelenn

Page 17: Het schrijven van een device driver voor Windows 2000

TestsysteemTestsysteem

• Windows 2000 Professional,Windows 2000 Professional,

met alle service packs en updatesmet alle service packs en updates• Zorgen voor een herstelmogelijkheid,Zorgen voor een herstelmogelijkheid,

bijv. Norton Ghostbijv. Norton Ghost

HulpmiddeleHulpmiddelenn

Page 18: Het schrijven van een device driver voor Windows 2000

Microsoft Visual Studio 6.0Microsoft Visual Studio 6.0

• Sjabloon “DDAppWiz.awx” installerenSjabloon “DDAppWiz.awx” installeren

• Als projectinstellingen goed zijn Als projectinstellingen goed zijn compileren via Toolscompileren via ToolsBuildBuild

• Resultaat is .sys bestandResultaat is .sys bestand

• Checked Build tegenover Free BuildChecked Build tegenover Free Build– Aan te passen via DBG defineAan te passen via DBG define– Ook van toepassing op Windows zelfOok van toepassing op Windows zelf

HulpmiddeleHulpmiddelenn

Page 19: Het schrijven van een device driver voor Windows 2000

Microsoft Visual Studio 6.0 (2)Microsoft Visual Studio 6.0 (2)HulpmiddeleHulpmiddele

nn

Page 20: Het schrijven van een device driver voor Windows 2000

DebugViewDebugView

• Toont berichten die Checked Build van Toont berichten die Checked Build van driver genereert met DbgPrintdriver genereert met DbgPrint

• DebugView geeft geen informatie weer DebugView geeft geen informatie weer gegenereerd vanuit ISR’sgegenereerd vanuit ISR’s

HulpmiddeleHulpmiddelenn

Page 21: Het schrijven van een device driver voor Windows 2000
Page 22: Het schrijven van een device driver voor Windows 2000

DebugView (2)DebugView (2)

• Werkt ook na bugcheck schermen:Werkt ook na bugcheck schermen:– ““Startup & Recovery” instellingen goedzettenStartup & Recovery” instellingen goedzetten– Zorgen dat DebugView draait tijdens crashZorgen dat DebugView draait tijdens crash– Binnen DebugView kiezen voorBinnen DebugView kiezen voor

FileFileProcess Crash Dump enProcess Crash Dump en

““memory.dmp” in Windows map selecterenmemory.dmp” in Windows map selecteren

HulpmiddeleHulpmiddelenn

Page 23: Het schrijven van een device driver voor Windows 2000

DebugView (3)DebugView (3)HulpmiddeleHulpmiddele

nn

Page 24: Het schrijven van een device driver voor Windows 2000

LoadDrvLoadDrv

• Installatie, starten, stoppen van een driverInstallatie, starten, stoppen van een driver

HulpmiddeleHulpmiddelenn

Page 25: Het schrijven van een device driver voor Windows 2000

Einde hulpmiddelenEinde hulpmiddelen

• Twee computersystemenTwee computersystemen

• Verschillende software benodigdVerschillende software benodigd

HulpmiddeleHulpmiddelenn

Page 26: Het schrijven van een device driver voor Windows 2000

VragenVragen

Er kunnen nu vragen over Er kunnen nu vragen over hulpmiddelen bij het schrijven van hulpmiddelen bij het schrijven van device drivers gesteld worden.device drivers gesteld worden.

Page 27: Het schrijven van een device driver voor Windows 2000

Device driversDevice drivers

Page 28: Het schrijven van een device driver voor Windows 2000

Device Drivers

• Waarom een device driver

• Aanroepen van een driver

• Opbouw van een driver

• Interrupt Request Levels (IRQL’s)

• Interrupt Service Routines (ISR’s) en

Deferred Procedure Calls (DPC’s)

Device drivers

Page 29: Het schrijven van een device driver voor Windows 2000

Waarom een device driver

• Vereist door ontwerp van Windows voor– stabiliteit– beveiliging

• Applicatie hoeft minder intelligent te zijn;

er is minder dubbele code

• Apparaat kan gedeeld worden met meerdere applicaties

Device drivers

Page 30: Het schrijven van een device driver voor Windows 2000

Aanroepen van een driver

• Keuze voor Borland C++ Builder

• De meeste drivers kunnen benaderd worden alsof het bestanden zijn, dus met de volgende Win32 API functies:– CreateFile– WriteFile– ReadFile– CloseFile

Device drivers

Page 31: Het schrijven van een device driver voor Windows 2000

Aanroepen van een driver (2)

• Daarnaast kan met sommige drivers de volgende functie gebruikt worden:

DeviceIoControl

• Invoer aan de functie is:– IOCTL code die het soort verzoek aangeeft

• Gegenereerd door CTL_CODE macro uit winioctl.h

– Invoer- en uitvoerbuffer

Device drivers

Page 32: Het schrijven van een device driver voor Windows 2000

Aanroepen van een driver (3)

• Vanwege ingewikkeldheid van aanroepen worden deze in een aparte unit of vaak in een DLL geplaatst

Device drivers

Page 33: Het schrijven van een device driver voor Windows 2000

Opbouw van een driver

• Plaats binnen Windows

• DriverEntry routine

• DriverUnload routine

• I/O Request Packet (IRP)

• Dispatch routines

• Voorbeelden IRP’s

Device drivers

Page 34: Het schrijven van een device driver voor Windows 2000

Plaats binnen WindowsDevice drivers

Applicatie Win32 API I/O Manager

Device Driver

ongemerkt

API functie aanroep

dispatch routine

Hardware

HAL macro’s

IoXxx functie-aanroepen

Page 35: Het schrijven van een device driver voor Windows 2000

DriverEntry routine

• Ontvangt pointer naar Driver Object

• Wordt aangeroepen wanneer de driver door Windows geladen wordt

• Initialiseert pointers naar andere routines, zoals DriverUnload, AddDevice en StartIo

• Initialiseert MajorFunction array die pointers bevat naar elke dispatch functie

Device drivers

Page 36: Het schrijven van een device driver voor Windows 2000

DriverEntry (2)

• Creëert Device Object voor elk apparaat– Device Object heeft gebruikergedefinieerde

Device Extensie voor opslag van variabelen in niet-gepagineerd geheugen

• Creëert voor elk device eventueel een symbolic link:– de naam die een applicatie kan gebruiken met

CreateFile

Device drivers

Page 37: Het schrijven van een device driver voor Windows 2000

DriverUnload routine

• Wordt alleen aangeroepen als de driver uit het geheugen wordt geladen voordat het afsluiten van Windows in gang is gezet

• Als deze routine ontbreekt blijft de driver in het geheugen totdat Windows wordt afgesloten

• Als er iets speciaals moet gebeuren als Windows wordt afgesloten moet IRP_MJ_SHUTDOWN worden afgehandeld

Device drivers

Page 38: Het schrijven van een device driver voor Windows 2000

I/O Request Packet (IRP)

• Meestal aangemaakt door I/O Manager als gevolg van Win32 API aanroep

• Verplaatst zich vanaf de I/O Manager door de driver

Device drivers

Page 39: Het schrijven van een device driver voor Windows 2000

Dispatch routines

• Worden aangeroepen door de I/O manager door de MajorCode uit de IRP als index te gebruiken voor de MajorFunction array van de driver

• Handelen codes zoals IRP_MJ_CREATE, IRP_MJ_WRITE en dergelijke af, die vaak samenhangen met een bepaalde Win32 API aanroep

Device drivers

Page 40: Het schrijven van een device driver voor Windows 2000

Dispatch routines (2)

• Completeren IRP door aanroep van IoCompleteRequest of IRP in StartIo wachtrij zetten door aanroep van IoMarkIrpPending

Device drivers

Page 41: Het schrijven van een device driver voor Windows 2000

Voorbeelden IRP’s

IRP_MJ_CREATE:

• Wordt verzonden als CreateFile wordt aangeroepen

IRP_MJ_CLOSE:

• Wordt verzonden als CloseFile wordt aangeroepen

Device drivers

Page 42: Het schrijven van een device driver voor Windows 2000

Voorbeelden IRP’s (2)

IRP_MJ_WRITE:

• Wordt verzonden als een applicatie WriteFile aanroept

• Kopieert of gebruikt buffer van gebruiker

Device drivers

Page 43: Het schrijven van een device driver voor Windows 2000

Voorbeelden IRP’s (3)

IRP_MJ_READ:

• Wordt verzonden als een applicatie ReadFile aanroept

• Kopieert naar of schrijft in buffer van gebruiker

Device drivers

Page 44: Het schrijven van een device driver voor Windows 2000

Voorbeelden IRP’s (4)

IRP_MJ_DEVICE_CONTROL:

• Wordt verzonden als een applicatie DeviceIoControl aanroept

• Bevat meestal één groot case statement die de verschillende IOCTL codes afhandelt

Device drivers

Page 45: Het schrijven van een device driver voor Windows 2000

Einde opbouw van een driver

• Driver bevindt zich tussen I/O Manager en hardware

• DriverEntry routine is beginpunt• DriverUnload routine is optioneel• I/O Request Packets (IRP’s) verplaatsen

zich door de driver• Dispatch routines worden gebruikt om

IRP’s af te handelen• Verschillende soorten IRP’s

Device drivers

Page 46: Het schrijven van een device driver voor Windows 2000

Interrupt Request Levels (IRQL)

• Delen van een driver worden vanuit verschillende contexten aangeroepen

• Afhankelijk van deze context verschilt het IRQL nummer

• Hoe hoger het IRQL, hoe beperkter een driver is in zijn aanroepen

• Code binnen een hoger IRQL kan niet onderbroken worden door code met een lager of gelijk IRQL

Device drivers

Page 47: Het schrijven van een device driver voor Windows 2000

IRQL (2)

• Voorbeelden van IRQL’s (hoog naar laag):– DIRQL: hardware IRQL’s

• Van toepassing binnen een ISR voor hardware• Niet alloceren van niet-gepagineerd geheugen

– DISPATCH_IRQL• Van toepassing binnen een DPC routine• Alleen alloceren van niet-gepagineerd geheugen

– APC_IRQL– PASSIVE_IRQL

• Van toepassing binnen dispatch routines• Alloceren van gepagineerd geheugen

Device drivers

Page 48: Het schrijven van een device driver voor Windows 2000

ISR’s en DPC’s

• Interrupt Service Routine (ISR) wordt aangeroepen wanneer er een hardware interrupt optreedt

• IRQL = een DIRQL• ISR plant Deferred Procedure Call (DPC)• Windows voert DPC’s uit zodra het IRQL

daalt tot DISPATCH_LEVEL• DPC regelt tijdsintensieve zaken of zaken

die alleen op een lager IRQL mogelijk zijn

Device drivers

Page 49: Het schrijven van een device driver voor Windows 2000

Einde device drivers

• Nut device driver

• Aanroepen van een driver

• Opbouw driver

• IRQL’s

• ISR’s en DPC’s

Device drivers

Page 50: Het schrijven van een device driver voor Windows 2000

VragenVragen

Er kunnen nu vragen over device Er kunnen nu vragen over device drivers gesteld worden.drivers gesteld worden.

Page 51: Het schrijven van een device driver voor Windows 2000

PPort voorbeelddriverPPort voorbeelddriver

Page 52: Het schrijven van een device driver voor Windows 2000

Pport driver

• StartIo principe• Terugloopplug• Werking• Probleem• Oplossingen

PPort driver

Page 53: Het schrijven van een device driver voor Windows 2000

StartIo principe

StartIo principe:• Dispatch routine roept IomarkIrpPending aan om

IRP in wachtrij te plaatsen• IoStartPacket haalt IRP uit wachtrij en roept de

StartIo routine aan, die verwerking uitvoert afhankelijk van de MajorCode

• StartIo routine roept IoStartNextPacket aan zodat volgende IRP uit wachtrij verwerkt kan worden

PPort driver

Page 54: Het schrijven van een device driver voor Windows 2000

StartIo principe (2)

• StartIo routine zorgt voor serialisatie

• StartIo routine verzorgt de eigenlijke I/O met de hardware

• Hoeft niet verplicht gebruikt te worden

PPort driver

Page 55: Het schrijven van een device driver voor Windows 2000

Terugloopplug

• Als hardware wordt er een terugloopplug op de parallelle poort gebruikt

• Genereren van interrupt mogelijk via Reset uitgang (gekoppeld aan Ack ingang)

PPort driver

Page 56: Het schrijven van een device driver voor Windows 2000

Werking

• StartIo ontvangt IRP

• StartIo roept TransmitByte aan

• TransmitByte genereert interrupt

• ISR roept TransmitByte aan

• Als bytes op zijn dan plant de ISR een DPC in, die de IRP completeert

• DPC completeert IRP

PPort driver

Page 57: Het schrijven van een device driver voor Windows 2000

Probleem

• Bugcheck scherm:

MULTIPLE_IRP_COMPLETE_REQUEST

• Oorzaak:

DPC wordt dubbel uitgevoerd,

dus ook de ISR wordt dubbel uitgevoerd

PPort driver

Page 58: Het schrijven van een device driver voor Windows 2000

Oplossingen

Oplossing 1:

• Binnen ISR regel verwijderen:

WriteControl(pDevExt, CTL_DEFAULT)

• Zorgt ervoor dat het Interrupt Enabled bit wordt uitgeschakeld

• Veroorzaakt bugcheck scherm bij afsluiten van Windows:

DRIVER_IRQL_NOT_LESS_OR_EQUAL

PPort driver

Page 59: Het schrijven van een device driver voor Windows 2000

Oplossingen (2)

Oplossing 2:

• Bijhouden of de DPC al is uitgevoerd nadat een interrupt is gegenereerd

• Werkt alleen goed als de interrupt door jezelf gegenereerd wordt;

acceptabel voor deze driver maar onmogelijk binnen de meeste drivers

PPort driver

Page 60: Het schrijven van een device driver voor Windows 2000

Einde PPort driver

• StartIo principe

• Terugloopplug

• StartIo, ISR en DPC implementatie

• Probleem

• Voorlopige oplossing

PPort driver

Page 61: Het schrijven van een device driver voor Windows 2000

VragenVragen

Er kunnen nu vragen over de PPort Er kunnen nu vragen over de PPort driver gesteld worden.driver gesteld worden.

Page 62: Het schrijven van een device driver voor Windows 2000

EZ-USB oplossingEZ-USB oplossing

Page 63: Het schrijven van een device driver voor Windows 2000

EZ-USB oplossing

• Cypress EZ-USB chip• Cypress EZ-USB toolkit• USB MP3 device• USB experimenteerbord

EZ-USB oplossing

Page 64: Het schrijven van een device driver voor Windows 2000

EZ-USB chip

• Cypress AN2131

• Snelheid effectief 6 MHz

(24 MHz ÷ 4 klokpulsen)

• 8 kilobyte intern RAM

• Dataoverdracht van MCU naar USB module via RAM geheugen

EZ-USB oplossing

Page 65: Het schrijven van een device driver voor Windows 2000

Cypress EZ-USB toolkit

• Firmware voor Keil C51– Keil uVision 2 benodigd

• Broncode van een universele driver• Veel documentatie

EZ-USB oplossing

Page 66: Het schrijven van een device driver voor Windows 2000

USB MP3 Device

• Rob Looijmans

• Jan Blanken

• Ron van Balen

• Gerard Akse

EZ-USB oplossing

Page 67: Het schrijven van een device driver voor Windows 2000

USB MP3 Device (2)

• Twee stereo MP3 naar analoog decoders

verbonden via SPI bus via UART met EZ-USB processor

• Functioneert als terugloopapparaat en genereert een test sinustoon via een speciaal commando

• Functioneert in de toekomst als USB geluidskaart

EZ-USB oplossing

Page 68: Het schrijven van een device driver voor Windows 2000

USB experimenteerbord

• 32 kilobyte extra RAM geheugen• EEPROM via I2C bus• 8 LEDs• 4 drukknoppen, optioneel als interrupts• 2 RS232 poorten• LCD aansluiting• Standaardheaders voor uitbreidingen voor

printplaat Peter Klijn

EZ-USB oplossing

Page 69: Het schrijven van een device driver voor Windows 2000

USB experimenteerbord (2)

• Hardware gereed voor 18 april a.s.

• Als voorbeeld wordt een aangepaste driver geschreven

• Geschikt als voorbeeldhardware bij het schrijven van een eigen driver

• Geschikt om te leren werken met een 8051 processor

EZ-USB oplossing

Page 70: Het schrijven van een device driver voor Windows 2000

Einde EZ-USB oplossing

• Handige toolkit, inclusief alle benodigde broncode en documentatie

• Tenminste twee projecten maken op dit moment gebruik van de EZ-USB chip

• Het toekomstgerichte experimenteerbord zorgt dat Cypress EZ-USB voorlopig de standaard is binnen Fontys

EZ-USB oplossing

Page 71: Het schrijven van een device driver voor Windows 2000

VragenVragen

Er kunnen nu vragen over de EZ-USB Er kunnen nu vragen over de EZ-USB oplossing gesteld worden.oplossing gesteld worden.

Page 72: Het schrijven van een device driver voor Windows 2000

SlotSlot

Page 73: Het schrijven van een device driver voor Windows 2000

Verdere stageVerdere stage

Stage duurt nog circa 14 wekenStage duurt nog circa 14 weken Vrijwel elke dag tot aan de Vrijwel elke dag tot aan de

zomervakantie beschikbaar voor zomervakantie beschikbaar voor vragen over device drivers in lokaal vragen over device drivers in lokaal 0.1530.153

Slot

Page 74: Het schrijven van een device driver voor Windows 2000

SlotSlot

HulpmiddelenHulpmiddelen Device driversDevice drivers Pport driverPport driver EZ-USB oplossingEZ-USB oplossing

Slot

Page 75: Het schrijven van een device driver voor Windows 2000

VragenVragen

Algemene vragen over deze Algemene vragen over deze presentatie kunnen nu gesteld worden.presentatie kunnen nu gesteld worden.

Page 76: Het schrijven van een device driver voor Windows 2000

EindeEinde

Deze PowerPoint presentatie is Deze PowerPoint presentatie is desgewenst te downloaden vanaf:desgewenst te downloaden vanaf:

stage.sools.comstage.sools.com


Recommended