Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Windows NT driverek fejlesztése

Hasonló előadás


Az előadások a következő témára: "Windows NT driverek fejlesztése"— Előadás másolata:

1 Windows NT driverek fejlesztése
8 előadás dr. Robu Judit szeminárium drd. Lukács Sándor 2006

2 Copyright / Felhasznált anyag
a prezentáció részben felhasználja a Windows Operating System Internals Curriculum Resource Kit-ben található prezentációkat az eredeti anyagot David A. Solomon, Mark E. Russinovich és Andreas Polze készítették a Microsoft licenszelte az anyagot és szabadon felhasználhatóvá tette akadémiai környezetben a MSDNAA / CRK keretében a teljes licensz megtalálható a következő címen: ebben a prezentációban külön meg vannak jelölve azok a slide-ok, amelyek a CRK felhasználásával készültek az egyetem (BBTE) keretében a CRK és WRK szabadon elérhető és letölthető a diákok számára [ide utólag, amikor felkerül a CRK a hálózatra link kerül] BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

3 Driver fejlesztői eszközök 1
Visual Studio 6 / 2005 csak a C/C++ IDE fontos, a kompiler más driver fejlesztői és tesztelési kitek Driver Development Kit (DDK, 3790) Windows 2000, XP (32 / 64 bit) , 2003 (32 / 64 bit) szabadon letölthető a Microsoft weblapjáról Visual Studio 6 SP5-öt igényel tartalmazza a driverek fordításához szükséges C/C++ kompilert Installabel File System Kit (IFSK, 3790) állományrendszerek és file sytem filterek fejlesztését teszi lehetővé nem ingyenes (körülbelül 110 USD a Windows 2003 SP1 számára) Hardware Compatibility Test Kit (HCT, 12.1) Windows XP (32 / 64 bit) , 2003 (32 / 64 bit) nagyon sok standard tesztet tartalmaz, amelyek segítségével „Designed for Windows” logo-kat lehet szerezeni (ez jelzi, hogy egy driver minőségileg megfelel a Microsoft elvárásainak) szabadon letölthető Windows Driver Kit (WDK, 6000RTM) Windows 2000, XP, 2003, 2003 R2, Vista, Longhorn (egyelőre) nem tölthető le ingyen, de elérhető a connect.microsoft.com alatt Beta programok keretében Visual Studio 2005-öt igényel tartalmazza az új IFS kitet, tartalmazza a DTM-et (Driver Test Manager, ez helyettesíti a HCT-t) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

4 Driver fejlesztői eszközök 2
DDKBUILD.BAT megkönnyíti a driverek fordítását különböző platformok számára OsrLoader lehetővé teszi a driverek gyors regisztrálását és indítását/leállítását PoolTag nyomon követi a paged/non-paged kernel memória allokálását ProcessExplorer egy, a Task Manager-t helyettesitő, sokkal erőteljesebb processz manager DbgView lehetővé teszi a debug / trace üzenetek nyomon kötevését, akár remote számítógépről is PreFAST a WDK része, statikus C forráskód ellemző erőteljesebbek szűri ki a hibákat, mint a C fordító DeviceTree a device és driver objektumokat és azok hierarchikus kapcsolatát lehet böngészni vele WinObj a teljes NT objktum névteret (objet namespace) láthatóvá teszi RegMon / FileMon nyomon követi a Windows Registry és a Windows FS I/O műveleteit Windows Debugging Tools – WinDBG kernel módbeli debugger, akár remote számítógépek számára is BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

5 Driver fejlesztési dokumentációk
a DDK / WDK help kitűnő referencia rengeteg kész példát is tartalmaz prezentációk, cikkek NT Insider, példák, cikkek NTDEV, NTFSD, WINDBG fórumok fejlesztői eszközök Mark Russinovich, David Solomon – Microsoft Windows Internals, 4th edition, Microsoft Press, 2004 Walter Oney – Programming the Windows Driver Model, 2nd edition, Microsoft Press, 2003 BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

6 Windows driver modellek, kategóriák
Legacy NT driver modell NT4-ben is használatos nem igényli a PnP és PM támogatást a file-system driverek is ebben iródnak WDM modell (Windows Driver Modell) Win 9x és 2000/XP támogatás teljes mértékű PnP és PM támogatás konkrét hardvereszközök számára írnak WDM drivereket több miniport modell NDIS, SCSI, Storage etc. számára általában jóval kevesebb kódot igényelnek mint a legacy driverek minifilter modell (File System Mini-filters) FS, FS filter, registry filter driverek írását teszi lehetővé kriptográfiai szoftverek, anti-virus filterek, on-the-fly tömörítés WDF (Windows Driver Foundation) bizonyos WDM driverek egyszerűbb megírását teszi lehetővé, Vista-tól kezdődően KMDF (Kernel Mode Driver Framework), UMDF (User Mode DF) megengedi pl. a C++-ban, user módban írt USB vagy printer drivereket BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

7 Windows driver típusok
highest level drivers file system drivers (NTFS, FAT, CDFS, UDFS) intermediate level drivers function drivers megadott hardver/virtuális eszközöket vezérélnek filter drivers a fukció driverek fölé vagy alá szúrják be maguakt módosítják a bus vagy funkció driverek szerepét software bus drivers egy sor child eszközt nyújt a fukció driverek számára class drivers for class/miniport pairs egy class driver egy teljes általános eszköz családot vezérel (pl. SCSI, NDIS) minden effektív eszköz számára egy-egy miniport driver iródik, amely hardver specifikus lowest level drivers hardware bus drivers a fizikai hardver buszokat (PCI, PCI Express, ISA etc.) vezérelik legacy drivers klasszikus driverek, amelyek közvetlenül egy-egy hardvereszközt vezérelnek BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

8 Általános NT kernel driver elvárások
hordozhatóság szinte kivétel nélkül 100%-an C-ben íródnak a Windows-al csak a DDK általá támogatott interfészeken keresztül kommunikálnak konfigurálhatóság dinamikusan reagál a hardver változásaira független attól, hogy altta / fölötte hány más filter driver helyezkedik el always preemtible, always interruptible minden szál megszakítható minden ISR megszakítható egy nagyobb IRQL szinten lévő ISR által multiprocessor safe objektum alapú architektúra driver, device, file stb. objektumok csomag / kérés (packet) alapú I/O nagy mértékű aszinkron I/O támogatás BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

9 Objektumok az Object Manager kezeli őket Driver Object Device Object
minden egyes driver egy-egy objektum által van reprezentálva driver stack-et alkotnak Device Object minden egyes fizikai hardver eszköz egy-egy PDO (Physical DO, a bus driverek hozzák létre), minden egyes funkció egy-egy FDO (Functional DO) által van reprezentálva vannak Filter DO-k device stack-et alkotnak (pl. az NTFS-től a fizikai lemezig) File Object állományokat, könyvtárakat vagy olyan eszközöket reprezentálnak, amelyek támogatják a file jellegű I/O-t (read, write etc.) event, mutex, semaphore etc. szinkronizációs objektumok BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

10 IRP csomagok az I/O műveletek rétegezett modell szerint működnek
IRP (I/O Request Packet) egy-egy I/O kérést reprezentálnak egy IRP csomagot több driver dolgozhat fel minden driver számára külön egy-egy IRP Stack Location (vagy I/O stack location) van fenntartva – ez driver specifikus információkat tartalmaz az IRP csomagokat tipikusan az I/O manager hozza létre de létre hozhatja őket egy driver is az IRP csomagoknak két irányú feldolgozása van dispatch / pre-processing – mielőtt az IRP-et effektíven végre hajtanánk completion / post-processing – miután az IRP végre hajtódott létezik nem IRP alapú I/O is, pl. a fast I/O path, amely esetén a FS driverek a cache manager és memory manager segítségével fizikai I/O kérés nélkül végezik el az adatok írását / olvasását BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

11 Standard driver rutinok (legacy)
DriverEntry egy driver belépési pontja elvégzi a driver és hardver specifikus inicializálásokat dispatch rutinok – pre-processing egy-egy függvény amely végrehajtja az I/O managertől kapott IRP kéréseket IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_WRITE… általában miután egy IRP végrehajtása során egy driver-t megfelelő dispatch függvényét meghívta a rendszer, az IRP feldolgozása átkerül a következő (a hardverhez közelebb lévő, alsóbb szintű) driverhez tipikusan PASSIVE_LEVEL IRQL szinten hívódnak meg, a hívó szál / processz kontextusában, de van jópár kivétel is I/O completion rutinok – post-processing miután egy IRP-et egy driver véglegesen végrehajt (azaz nem küldi tovább egy alsóbb szintű driverhez), az I/O manager sorra meghívja, a legalsóbb szintű drivertől a legfelsőbb szintűig minden egyes driver esetén az I/O completion rutint rendszerint tetszőleges szál / processz kontextusban és akár DPC_LEVEL szinten hivódnak meg DriverUnload egy driver leállítása során hívódik meg tipikusan deinicializálást, a lefoglalt erőforrások felszabadítását végezi el !!! ez egy nagyon minimális lista !!! BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

12 DPC és APC rutinok DPC – Deferred Procedure Call
a megszakítás-kiszolgáló ISR rutinok kezdeményezik, mivel az ISR magas IRQL szinten fut és ezért minimális műveleteket végzi el egy DPC tetszőleges szál kontextusban fut DISPATCH_LEVEL szinten hajtja végre őket a rendszer minden processzor számára egy-egy külön DPC lista van APC – Asynchronous Procedure Call akárcsak a DPC, ez is késleltetett eljáráshívás a DPC kezdeményezésére az I/O manager hívja meg őket egy APC egy megadott szál és processz kontextusban fut minden szál esetén van egy-egy lista BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

13 Szinkron IRP kérés végrehajtása
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

14 Hardver megszakítás kiszolgálása
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

15 I/O kérések befelyezése (completion)
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

16 Aszinkron IRP kérés végrehajtása
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

17 Driver support függvények
Executive – ExXXX... Hal – HalXXX... I/O Manager – IoXXX... Kernel – KeXXX... Memory Manager – MmXXX... Cache Manager – CcXXX... Object Manager – ObXXX... Power Management – PoXXX... Process Structure – PsXXX... Run-Time Library – RtlXXX... Safe String – RtlStringXXX... Security Reference Monitor – SeXXX... NT Native API driverek számára – ZwXXX... BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

18 NT státusz kódok 32 bites DWORD értékek, az NT kernel függvények jó része ezt téríti vissza a legrangosabb két bit határozza meg a státusz osztályát (severity) 00 – success 01 – informational 10 – warning 11 – error NT_SUCCESS(status) makró, TRUE ha sikeres végreahajtás nagyon sok státusz kód van (NTSTATUS.H), pl: STATUS_SUCCESS, STATUS_TIMEOUT, STATUS_PENDING, STATUS_REPARSE, … STATUS_OBJECT_NAME_EXISTS, STATUS_THREAD_WAS_SUSPENDED, … STATUS_NO_MORE_ENTRIES, … STATUS_UNSUCCESFULL, STATUS_NOT_IMPLEMENTED, STATUS_INVALID_HANDLE, STATUS_INVALID_PARAMETER, STATUS_ACCESS_DENIED, STATUS_INSUFFICIENT_RESOURCES, … BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

19 NT kernel unicode karakterláncok
typedef struct _UNICODE_STRING {   USHORT   Length;   USHORT   MaximumLength;   PWSTR   Buffer; } UNICODE_STRING *PUNICODE_STRING; a kernel leginkább UNICODE_STRING karakterláncokkal dolgozik a karakterlánc mérete bájtokban van megadva különbséget kell tenni a karakterláncra mutató pointer (PUNICODE_STRING) és a karaktereket tartalmazó tömbre mutató pointer (PWSTR Buffer) között mind a kettő lehet dinamikusan allokált, sőt folytonos is az RTL taltamaz egy egész szett speciális feldolgozó függvényt BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

20 Executive függvények ExAllocatePool, ExAllocatePoolWithTag
ExFreePool, ExFreePoolWithTag ExInitializeWorkItem, ExQueueWorkItem ExIsProcessorFeaturePresent BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

21 Kernel függvények KeInitializeSpinLock, KeAcquireSpinLock, KeReleaseSpinLock KeInitializeMutex, KeReadStateMutex, KeReleaseMutex KeWaitForSingleObject, KeWaitForMultipleObjects KeInitializeEvent, KeSetEvent, KeResetEvent KeInitializeSemaphore, KeReleaseSemaphore KeSetPriorityThread, KeGetCurrentThread KeRaiseIrql, KeLowerIrql, KeGetCurrentIrql KeQuerySystemTime, KeQueryTickCount KeGetCurrentProcessorNumber BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

22 I/O manager függvények
IoGetRequestorProcess, IoGetRequestorProcessId IoIsOperationSynchronous IoCreateDevice, IoDeleteDevice IoCreateSymbolicLink IoQueryFileDosDeviceName IoCancelFileOpen IoGetAttachedDevice, IoGetLowerDeviceObject IoGetDiskDeviceObject IoAllocateMdl, IoFreeMdl BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

23 Memory manager függvények
MmIsAddressValid MmProbeAndLockPages, MmUnlockPages MmMapLockedPages, MmUnmapLockedPages MmQuerySystemSize BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

24 Object manager függvények
ObOpenObjectByPointer ObQueryNameString ObDereferenceObject, ObReferenceObject, ObReferenceObjectByHandle InitializeObjectAttributes BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

25 Process management függvények
PsGetCurrentThread, PsGetCurrentThreadId PsGetCurrentProcess, PsGetCurrentProcessId PsImpersonateClient PsLookupProcessByProcessId PsLookupThreadByThreadId PsCreateSystemThread, PsTerminateSystemThread PsSetCreateProcessNotifyRoutine, PsSetCreateThreadNotifyRoutine, PsSetLoadImageNotifyRoutine BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

26 Run-time library függvények
RtlCompareMemory, RtlCopyMemory, RtlFillMemory RtlCreateUnicodeString, RtlInitUnicodeString, RtlCopyUnicodeString, RtlFreeUnicodeString, RtlAppendUnicodeToString RtlAnsiStringToUnicodeString, RtlUpcaseUnicodeString, RtlUnicodeStringToInteger RtlCreateRegistryKey, RtlWriteRegistryValue RtlGetVersion, RtlIsServicePackVersionInstalled BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

27 NT native API kernel függvények
ZwCreateFile, ZwClose, ZwReadFile, ZwWriteFile ZwQueryInformationFile, ZwSetInformationFile ZwDeleteFile, ZwDeviceIoControlFile ZwCreateSection, ZwMapViewOfSection, ZwUnmapViewOfSection ZwLoadDriver, ZwUnloadDriver ZwCreateKey, ZwQueryValueKey, ZwSetValueKey, ZwDeleteKey BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

28 Driverek fordítása 1 hagyományosan parancssorból fordítjuk
a DDK/WDK alatt minden támogatott Windows verzió és minden platform (x86, x64, IA64) számára két fordítási környezet, pl. Windows XP x86 Checked Build Environment Windows XP x86 Free Build Environment parancssorból a build utasítással fordíthatunk build . – normal build build . -cZ – rebuild all a fordítás számára szükségünk van három speciális állományra DIRS – meghatározza, hogy milyen könyvtárakat kell bejárni a fordítás során SOURCES – minden könyvtárban egy-egy; meghatározza, hogy milyen állományokat kell lefordítani és a fordítás paramétereit MAKEFILE – standard makefile a DDK-ból BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

29 Driverek fordítása 2 DIRS SOURCES
src SOURCES TARGETPATH=..\bin MSC_WARNING_LEVEL=/W4 /WX /FR TARGETNAME=sumdriver TARGETTYPE=DRIVER C_DEFINES=$(C_DEFINES) -DUNICODE -D_UNICODE SOURCES=driver.c \ irpmj.c \ debug.c \ sumdriver.rc gyakran a fordítást a Visual Studio-ba integráljuk, mint makefile projekt – ilyen esetben jól fog a DDKBUILD.BAT is BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

30 Driver projekt készítése VS2005 alatt 1
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

31 Driver projekt készítése VS2005 alatt 2
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

32 Driver projekt készítése VS2005 alatt 3
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

33 Driver projekt készítése VS2005 alatt 4
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

34 Driver projekt készítése VS2005 alatt 5
BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

35 Debug üzenetek kiíratása
// debug log related macros #define ExKdPrint(what) { \ KdPrint(("%15s, %4d, %s: ", (strlen(__FILE__)<15)? (__FILE__):(&__FILE__[strlen(__FILE__)-15]), __LINE__, __FUNCTION__)); \ KdPrint(what); \ } DbgView-el lehet figyelni őket háttérben a DDK által nyújtott DbgPrint() függvény áll nagyon hasonlít a printf() függvényre, csak nem konzolra ír BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

36 Egy minimális driver szerkezete
csak DriverEntry és DriverUnload initializálás és deinicializálás jó kezdeti példa egyszerű forráskód szerkezet driverver.h – driver verzió konstansok, külön állományban; leegyszerűsíti a build number increment megoldásokat driver.h – általános definíciók prototypes.h – függvény prototipusok driver.c – általános driver függvények ez a szerkezet könnyen bővíthető BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

37 Globális adatok typedef struct _DRV_GLOBAL_DATA {
// DRV specific fields PDRIVER_OBJECT DriverObject; PDEVICE_OBJECT DeviceObject; UNICODE_STRING DeviceName; } DRV_GLOBAL_DATA, *PDRV_GLOBAL_DATA; extern DRV_GLOBAL_DATA DrvGlobalData; BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

38 DriverEntry NTSTATUS DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath) { ExKdPrint(("try to load driver %d.%d.%d build %d\n", DRV_HIVERSION, DRV_LOVERSION, ... )); RtlZeroMemory(&DrvGlobalData, sizeof(DRV_GLOBAL_DATA)); DrvGlobalData.DriverObject = DriverObject; // get DriverObject into global data RtlInitUnicodeString(&(DrvGlobalData.DeviceName), DEVICE_NAME); // create the main device object status = IoCreateDevice( DriverObject, 0, &DrvGlobalData.DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DrvGlobalData.DeviceObject ); if (!NT_SUCCESS(status)) ExKdPrint((" DriverEntry - error loading driver\n")); return status; } DrvGlobalData.DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; // clear DO_DEVICE_INITIALIZING DrvGlobalData.DriverObject->DriverUnload = DriverUnload; // setup unload routine BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

39 DriverUnload VOID DriverUnload(__in PDRIVER_OBJECT DriverObject) {
PAGED_CODE(); UNREFERENCED_PARAMETER(DriverObject); ExKdPrint(("try to unload driver\n")); // delete main device object IoDeleteDevice(DrvGlobalData.DeviceObject); ExKdPrint(("...GAME OVER!\n")); } BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

40 A driver fordítása Rebuild All started: Project: emptydriver, Configuration: Debug Win Performing Makefile project actions OSR DDKBUILD.BAT V6.9 - OSR, Open Systems Resources, Inc. WLH 32 BIT BUILD using WLH DDK build in directory . with arguments -cZ (basedir C:\DDK.5384) run build -Ze -cZ for checked version in . BUILD: Compile and Link for x86 ... build complete building browse information files POSTBUILD - XP x86 32 bit build with Longhorn WDK... 1 file(s) copied. Build log was saved at "file://c:\Projects\phd\asm 2 kurzus\11. Windows NT driverek fejlesztese I\emptydriver\Debug\BuildLog.htm" emptydriver - 0 error(s), 0 warning(s) ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ========== BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

41 A driver regisztálása és indítása
előzőleg be kell másolni a System32\Drivers könyvtárba ezt lokális rendszeren elvégez-heti egy post-build szkript is az OSR Loader-el lehet... egy driver-t regisztrálni, deregisztrálni a registry-be Service start: DEMAND egy, már regisztált drivert indítani illetve leállítani megnézni a futó driverek / servic-ek listáját BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

42 A driver végrehajtásának követése
DbgView-el könnyen elvégezhető indítsuk el mielőtt a drivert indítanánk jól fog az Options | Force Carriage Returns opció lehet az üzeneteket filterelni és szinezni (highlight) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006

43 Köszönöm a figyelmet! BBTE, Alkalmazások és operációs rendszerek optimizálása 2006


Letölteni ppt "Windows NT driverek fejlesztése"

Hasonló előadás


Google Hirdetések