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

Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése előadás dr.

Hasonló előadás


Az előadások a következő témára: "Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése előadás dr."— Előadás másolata:

1 Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése előadás dr. Robu Judit szeminárium drd. Lukács Sándor

2 CRK 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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]

3 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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)

4 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

5 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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 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

6 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

7 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

8 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

9 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 9 Objektumok az Object Manager kezeli őket Driver 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

10 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

11 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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 !!!

12 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

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

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

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

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

17 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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...

18 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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, …

19 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

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

21 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

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

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

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

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

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

27 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

28 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

29 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 29 Driverek fordítása 2 DIRS DIRS= \ 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

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

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

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

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

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

35 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

36 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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ő

37 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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;

38 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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 return status;

39 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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")); }

40 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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 ==========

41 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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

42 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 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)

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


Letölteni ppt "Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Windows NT driverek fejlesztése előadás dr."

Hasonló előadás


Google Hirdetések