Sdílet prostřednictvím


DispatchReadWrite s využitím bufferovaného I/O

Jakýkoli ovladač zařízení nejnižší úrovně, který nastaví objekty zařízení pro vstupně-výstupní operace ve vyrovnávací paměti, splňuje požadavek na čtení vrácením dat přenesených ze zařízení do uzamčené vyrovnávací paměti systémového prostoru v Irp-AssociatedIrp.SystemBuffer>. Splňuje požadavek na zápis přenosem dat ze stejné vyrovnávací paměti do svého zařízení.

V důsledku toho rutina DispatchReadWrite takového ovladače zařízení obvykle při přijetí žádosti o převod provede následující:

  1. Volá IoGetCurrentIrpStackLocation a určuje směr žádosti o převod.

  2. Zkontroluje platnost parametrů požadavku.

    • U požadavku na čtení rutina obvykle kontroluje hodnotu IoStackLocation-Parameters.Read.Length> ovladače a zjišťuje, jestli je vyrovnávací paměť dostatečně velká pro příjem dat přenášených ze zařízení.

      Například ovladač třídy klávesnice systému zpracovává požadavky na čtení, které pocházejí pouze z uživatelského vstupního vlákna Win32. Tento ovladač definuje strukturu KEYBOARD_INPUT_DATA, ve které se mají ukládat úhozy kláves ze zařízení, a v libovolném okamžiku drží určitý počet těchto struktur v interním kruhovém vyrovnávacím bufferu, aby uspokojil požadavky na čtení při jejich přijetí.

    • V případě požadavku na zápis rutina obvykle zkontroluje hodnotu parametru Parameters.Write.Length a v případě potřeby zkontroluje data v souboru Irp-AssociatedIrp.SystemBuffer>: to znamená, že pokud jeho zařízení přijímá pouze strukturované datové pakety obsahující členy s definovanými rozsahy hodnot.

  3. Pokud jsou některé parametry neplatné, rutina DispatchReadWrite okamžitě dokončí IRP, jak je popsáno v části Dokončení irPs. V opačném případě rutina předává IRP pro další zpracování jinými rutinami ovladačů, jak je popsáno v části Předávání irPs do zásobníku ovladačů.

Ovladače zařízení nejnižší úrovně, které používají vyrovnávací I/O operace, obvykle musí splnit požadavek na přenos čtením nebo zápisem dat o velikosti určené původcem žádosti. Takový ovladač pravděpodobně definuje strukturu pro data přicházející z jeho zařízení i odesílaná do něj a pravděpodobně bude ukládat strukturovaná data interně do vyrovnávací paměti, stejně jako to dělá ovladač systémové třídy klávesnic.

Ovladače, které interně ukládají data do vyrovnávací paměti, by měly podporovat požadavky IRP_MJ_FLUSH_BUFFERS a mohou také podporovat požadavky IRP_MJ_SHUTDOWN.

Ovladač nejvyšší úrovně v řetězu je obvykle zodpovědný za kontrolu parametrů vstupního protokolu IRP před předáním požadavku na čtení/zápis nižším ovladačům. V důsledku toho může mnoho ovladačů nižší úrovně předpokládat, že jejich umístění zásobníku vstupně-výstupních operací v protokolu IRP pro čtení a zápis mají platné parametry. Pokud je ovladač na nejnižší úrovni v řetězu informován o omezeních přenosů dat specifických pro zařízení, je tento ovladač nutný ke kontrole platnosti parametrů v umístění zásobníku vstupně-výstupních operací.