DispatchReadWrite pufferelt I/O használatával

Minden olyan legalacsonyabb szintű eszközillesztő, amely beállítja az eszközobjektumait a pufferelt I/O-hoz, az olvasási kérést úgy teljesíti, hogy az eszközről átvitt adatokat egy zárolt rendszertérpufferbe adja vissza az Irp-AssociatedIrp.SystemBuffer> webhelyen. Megfelel egy írási kérésnek azáltal, hogy adatokat továbbít ugyanabból a pufferből az eszközére.

Következésképpen az ilyen eszközillesztők DispatchReadWrite rutinja általában az alábbiakat végzi egy átviteli kérelem beérkezésekor:

  1. Meghívja az IoGetCurrentIrpStackLocation parancsot , és meghatározza az átviteli kérelem irányát.

  2. Ellenőrzi a kérelem paramétereinek érvényességét.

    • Olvasási kérés esetén a rutin általában ellenőrzi az illesztőprogram IoStackLocation-Parameters.Read.Length> értékét annak megállapításához, hogy a puffer elég nagy-e az eszközről átvitt adatok fogadásához.

      A rendszer billentyűzetosztály-illesztőprogramja például olyan olvasási kéréseket dolgoz fel, amelyek csak a Win32 felhasználói beviteli szálából származnak. Ez az illesztőprogram egy olyan struktúrát határoz meg, KEYBOARD_INPUT_DATA, amelyben kulcsleütéseket tárolhat az eszközről, és bármely pillanatban tárol néhány ilyen szerkezetet egy belső gyűrűpufferben, hogy kielégítse az olvasási kéréseket, amint bejönnek.

    • Írási kérés esetén a rutin rendszerint ellenőrzi a Parameters.Write.Length hosszat, és szükség esetén ellenőrzi az Irp->AssociatedIrp.SystemBuffer adatait a helytállóság érdekében, ha pedig az eszköz csak a meghatározott értéktartományú tagokat tartalmazó strukturált adatcsomagokat fogadja el.

  3. Ha bármelyik paraméter érvénytelen, a DispatchReadWrite rutin azonnal befejezi az IRP-t, ahogy azt az IRP-k befejezése című cikkben már leírtuk. Ellenkező esetben a rutin továbbadja az IRP-t a többi illesztőprogram-rutin további feldolgozásához, amint az a Driver Stack mentén való IRP átadás részben szerepel.

A pufferelt I/O-t használó legalacsonyabb szintű eszközillesztőknek általában a kérés kezdeményezője által meghatározott méretű adatok olvasásával vagy írásával kell teljesíteniük az átviteli kérelmet. Az ilyen illesztőprogramok valószínűleg meghatároznak egy struktúrát az eszközről érkező vagy az eszközére küldött adatokhoz, és valószínűleg belsőleg pufferelik a strukturált adatokat, ahogyan a rendszer billentyűzetosztály-illesztőprogramja teszi.

A belsőleg adatot pufferelő illesztőprogramoknak támogatniuk kell az IRP_MJ_FLUSH_BUFFERS kéréseket, és támogathatják az IRP_MJ_SHUTDOWN kéréseket is.

A lánc legmagasabb szintű illesztőprogramja általában a bemeneti IRP paramétereinek ellenőrzéséért felelős, mielőtt olvasási/írási kérelmet ad át az alacsonyabb illesztőprogramoknak. Emiatt számos alacsonyabb szintű illesztőprogram feltételezheti, hogy az írási/olvasási IRP-ben lévő I/O-verem helye érvényes paraméterekkel rendelkezik. Ha egy lánc legalacsonyabb szintű illesztőprogramja tisztában van az adatátvitel eszközspecifikus korlátozásaival, az illesztőprogramnak ellenőriznie kell a paraméterek érvényességét az I/O-verem helyén.