Készítsen egy dll-könyvtárat a vezetővel való interakció érdekében

Ha oroszul beszélünk, akkor azt jelenti, hogy a program bármikor betöltheti a dll-könyvtárat. kapjon mutatókat a könyvtár funkcióihoz és adataihoz. Ezután az alkalmazás valahogy a könyvtári funkciókat és adatokat használja, és ha már nincs szükségük rá, a könyvtárat kirakodja.

A DLL könyvtár kétféle funkciót tartalmaz: külső és belső. A belső funkciókat csak a dll hívhatja meg, és a külső funkciókat a könyvtárat összekapcsoló alkalmazás is hívhatja. Ebben az esetben a dll könyvtárat exportálják funkciók és adatok.

Mint korábban említettük, jelenleg az alkalmazás az Application -> Library dll -> Driver programot használja a sofőrhöz való kommunikációhoz. Ilyen architektúra használatakor az I / O művelet alkalmazáskérelme beilleszkedik a dll-könyvtárba, ott előfeldolgozik, és továbbítja a meghajtónak. Az eredményt a meghajtó visszaadja a DLL könyvtárnak. Szintén feldolgozva és átküldve az alkalmazásnak. Ennek a megközelítésnek az előnyei nyilvánvalóak:

  • Rengeteg különböző perifériaeszköz áll rendelkezésre, és ennek megfelelően minden eszközön egy illesztőprogram jön létre. A programozó nehezen tudja megérteni az eszközillesztő összes bonyolultságát: az olvasási / írási adatformátum, az érthetetlen IOCTL kódok memorizálása. Sokkal jobb, ha gondoskodik arról, hogy az API-funkciók világos kezelőfelülete legyen az eszközzel való munkavégzéshez. Még jobb, ha egy ilyen interfész egységes minden ilyen eszközre. A DLL-könyvtár feladata. a meghajtóval együtt szállítjuk - az alkalmazási programhoz adott szabványos interfészek csatlakoztatásához speciális illesztőprogram algoritmusokkal.
  • ha a jövőben az alkalmazás és az illesztőprogram közötti kölcsönhatás algoritmusa megváltozik, akkor a felhasználónak csak frissítenie kell a DLL-t az új illesztőprogrammal való együttműködésre. Az összes korábban kifejlesztett program ugyanaz marad.

Természetesen ennek a megközelítésnek hátrányai vannak. Ebben az esetben a rendszer teljesítményének csökkenése miatt az I / O-kérelemen áthaladó hívások nagyobb száma miatt.

Esetünkben olyan dll-könyvtárat kell kifejlesztenünk, amely három funkcióval rendelkezik: az olvasás memóriája, a memória írása és a teljes memóriaméret elérése. Természetesen egy Visual C ++ környezetben egy DLL-könyvtárat is tervezünk.

Indítsa el a VC ++ környezetet, és hozzon létre egy új, az XDSPInter nevű projektet. A projekt típusához válassza a Win32 Dynamic-Link könyvtárat. Következőként, mint a projekt típusát, válassza az Egyszerű DLL (egyszerű dll-könyvtár) lehetőséget. A VC ++ környezet egy üres projektet hoz létre Önnek egy DllMain () funkcióval.

DllMain () funkció aktiválódik, ha csatlakoztatása vagy leválasztása folyamat dll. DllMain () visszatérési értékkel BOOL APIENTRY (tulajdonképpen visszatér BOOL érték típusú) és három paraméter - FOGANTYÚ hModule, DWORD ul_reason_for_call, LPVOID lpReserved.

  • HANDLE hModule - dll leírásának (fogantyúja);
  • DWORD ul_reason_for_call - flag jelzi, hogy miért nevezték a függvényt. Értékeket vehet fel:
    • DLL_PROCESS_ATTACH vagy DLL_THREAD_ATTACH - a könyvtár kapcsolódik a folyamathoz;
    • DLL_PROCESS_DETACH vagy DLL_THREAD_DETACH - a könyvtár lekapcsolódik a folyamattól.
  • LPVOID lpFenntartva - fenntartva.

A DllMain () függvény az egyetlen olyan funkció, amelyet a könyvtárban kell megjeleníteni. A többi funkciót és változót a programozó a megoldandó feladatnak megfelelően adja hozzá.

Esetünkben a dll - könyvtár exportálja a következő funkciókat: bool IsDriverPresent (void). A funkció meghatározza, hogy a szükséges illesztőprogram jelen van-e a rendszerben, és megpróbál csatlakozni hozzá. Ha ez sikeres lesz, a függvény igaz, egyébként hamis.

Tekintsük át az eredeti könyvtár cpp fájlt.

Így könyvtárunk csak négy funkciót exportál az eszközzel való munkához. Mindegyiknek egyszerű szintaxisa van, és könnyen használható. A dll használata a mi esetünkben lehetővé teszi a programozó számára, hogy ne gondoljon az összetett rendszerhívásokra, amelyek szükségesek a vezetővel való kommunikációhoz, az átadott adatok formátumához, és az alkalmazási problémák megoldására összpontosítanak.

2.5 A DLL csatlakoztatása az alkalmazáshoz.

Miután írta az illesztőprogramot és a DLL-könyvtárat, hogy működjön együtt vele, itt az ideje, hogy írjon egy felhasználói alkalmazást, amely működik az eszközzel. A dll-könyvtáron keresztül fog működni a vezetővel. Természetesen a Visual C ++ környezetben is megírják. Elvileg megvalósítható egy Visual Basic, Delphi vagy CVuilder környezetben, de ez bizonyos nehézségeket okoz, különösen a rendszerhívások és az adatstruktúrák használatában. Ebben a részben, az előzőektől eltérően, nem tekintünk semmilyen konkrét alkalmazást, hanem általános ajánlásokat adunk egy ilyen program elkészítésére.

A könyvtár csatlakoztatása az alkalmazáshoz nem igényel sok erőfeszítést. A könyvtár a HMODULE LoadLibrary rendszer hívása (char * LibraryName) segítségével kapcsolódik, ahol a LibraryName a dll könyvtár nevével rendelkező string. A visszatérési érték a könyvtár nyél (leíró). Ha a függvény visszaadta a NULL értéket, hiba történt a könyvtár csatlakoztatása közben.

A könyvtár csatlakoztatását követően importálhat funkciókat. A funkciót rendszerhívás segítségével importálják

  • hModule - könyvtárfogantyú, amit a LoadLibrary visszaküldött;
  • ProcName - az importált függvény neve.

Négy függvényt importálunk a könyvtárból, ezért meg kell határoznunk a típusukat: a függvénynek átadott paramétereket, a visszatérési értéket. Ezt a typedef irányelvvel lehet elvégezni:

Itt az ideje, hogy maguk készítsék el a funkciómutatókat:

Most vegye figyelembe azt a funkciót, amely összeköti a dll-könyvtárat az alkalmazással. A dll-könyvtárat az alkalmazáshoz fogja csatlakoztatni, és megpróbálja létrehozni a kapcsolatot a meghajtóval. A funkció visszatér a sikerhez és hamis hiba esetén. mert A VC ++ egy objektumorientált környezet, akkor ez a függvény az egyik alkalmazási osztály egyik módszere (esetünkben a bemutató osztály).

Célszerű a ConnectToDriver () metódus hívása az osztály konstruktorban. Itt kell végrehajtani és ellenőrizni kell, van-e meghajtó a rendszerben. Ezután minden szükséges inicializálás akkor is megtörténik, amikor az alkalmazás elindul.

Az eszköz memóriáját olvassa el a következőképpen:

Hasonlóképpen a memóriaeszközre történő írás módja a következőképpen néz ki:

Mutass be egy másik hasznos módszert is. Törli a készülék memóriáját.

Természetesen az általunk írt alkalmazás és a DLL-könyvtár teljesen tökéletlen. Például, ha több alkalmazás letölti a hibákat. Ezután egyidejűleg ugyanazt a DLL-t fogják használni és együtt dolgozni a készülékkel. Ez sok hibát okozhat. A legjobb esetben az általuk kapott adatok nem megfelelőek. A legrosszabb esetben a rendszer lefagy. Ez a hátrány azonban kiküszöbölhető úgy, hogy a járművezetőt a fent leírt módon módosítja. Alkalmazásunkban csak az eszköz memóriájának első 1024 bájtjaival dolgozunk.

Természetesen az ilyen rendszer kereskedelmi értéke nulla. De ez jó tanulási példa lehet a Windows és a DriverStudio WDM illesztőprogramjainak programozásához.

2.6 A meghajtók hibakeresése

A járművezetőkről beszélni nem lenne teljes, ha nem említik a hibakereső meghajtókat. mert az illesztőprogramok a processzorvédelem zéró gyűrűjével együtt járnak az összes következményes következménnyel, a szokásos felhasználói alkalmazások hibakeresései nem alkalmasak a meghajtók hibakeresésére.

Ha például egy illesztőprogramot fejleszt a Linux operációs rendszerhez. akkor a helyzet enyhén rosszabb lehet: ebben az operációs rendszerben általában nincs lehetőség a meghajtó hibakeresésére, kivéve a gdb debugger használatát. De ebben az esetben a rendszernek speciális módon kell újrafordítani, és néhány hasonló táncot tamburinnal táncolni. Ezért a hibakeresés gyakran csökkenti a nyomtatási funkciók hívását, amelyek nagy számban szétszóródnak a rendszer magjában.

Miután telepítve van a Win98-ban, a SoftIce a következő sort írja az Autoexec.bat: c: \ Progra programba

Ie A SoftIce a DOS betöltése után betöltődik és maga a Windows betöltődik. A Windows SoftIce futtatásakor csak bizonyos rendszertörvény vagy a programozó programozó által megadott illesztési pontján aktiválódik. A SoftIce-t a Ctrl + D billentyűk megnyomásával is hívhatja. Egy hibakereső ablak jelenik meg a képernyőn.

Míg a SoftIce ablak aktív, az operációs rendszer összes tevékenysége lefagy; most már fájdalommentesen lehet hibakeresni a vezetőt.

A SoftIce ablak több ablakra oszlik. Általában a központban láthatjuk a kód ablakot, fölötte - a processzor regisztrálja az ablakot és alul - az üzenetek ablakát. A nyílbillentyűkkel vagy az egérrel az ablakon belül mozoghat.

A SoftIce ablak alján a parancssor. A SoftIce-nak nincs grafikus felülete, és az összes hibakereső vezérlőparancs be van írva a parancssorba. A SoftIce-nek nagyon jó segítségnyújtási rendszere van. A parancsok listáját a help parancs adja meg. Talán a legfontosabb parancs a SoftIce-ból való kilépés parancs. Ehhez nyomja meg az F5 billentyűt vagy adja meg az X parancsot (a regiszter nem számít).

Figyelembe véve az üzenetablakot, különféle rendszerüzeneteket és üzeneteket fogunk látni, amelyeket illesztőprogramunk a nyomkövetési objektumon keresztül továbbít. Így megtekintheti az összes olyan fontos információt, amelyet a járművezető meg akar mondani. Ha azt szeretnénk, hogy az illesztőprogram ne jelenítsen meg semmilyen üzenetet, vagy ne jelenjen meg más üzenetek, új illesztőprogramok hozzáadásával vagy a meglévő nyomkövetési üzenetek törlésével módosítani kell a meghajtó szövegét. Ezután újra kell fordítani a meghajtót, és újra kell indítani.

Az univerzális töréspont az INT 3 megszakítás használata, mint az MS-DOS esetében. a Windows INT 3-ban szintén megszakítja a hibakeresést. Ehhez az illesztőprogram szövegében, ahol meg kell adni a töréspontot, be kell illesztenie a következő kódot:

Ez egy INT 3 megszakítási hívást eredményez.

De alapértelmezés szerint a SoftIce nem válaszol az INT 3-ra. Ahhoz, hogy a hibakereső aktiválódjon ezen a megszakításon, szükséges a SoftIce hívása és a következő parancs kiadása:

Most, amikor az INT 3-at hívják, <всплывание> ez a kód a debuggerben. Az INT 3 hibakeresési módjának letiltásához a SET I3HERE OFF parancsot adja ki.

Után a vezető <всплыл> A SoftIce programban a következő parancsokkal vezérelhetjük a program végrehajtását:

Ha az illesztőprogram hibakeresési konfigurációban lett összeállítva, akkor a C + + -on írt illesztőprogram szövege látható lesz a képernyőn.

Ezek az alapvető parancsok. A SoftIce hibakereső eszközvezérlőire vonatkozik. De általában, a hibakereső hatalmas mennyiségű funkciók és teljes leírását poslavlyaetsya programot, és körülbelül kétszáz oldalon. Remélem, ez az útmutató érdekes volt számodra. Ha még nem is érdekes - akkor remélem, hogy megtudtál valami újat magadnak.

Kapcsolódó cikkek