Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Při implementaci rutiny DispatchRead, DispatchWrite nebo DispatchReadWrite mějte na paměti následující body:
Je zodpovědností ovladače nejvyšší úrovně v řetězu vrstvených ovladačů zkontrolovat platnost parametrů příchozích IRP čtení/zápisu, než nastaví umístění zásobníku I/O pro ovladač nižší úrovně v IRP.
Ovladače střední a nejnižší úrovně obecně mohou spoléhat na ovladač nejvyšší úrovně ve svém řetězci, že předá žádosti o přenos s platnými parametry. Každý ovladač ale může provádět kontrolu správnosti parametrů na umístění ve zásobníku I/O IRP a každý ovladač zařízení by měl zkontrolovat parametry, které by mohly porušit jakékoli omezení stanovená jeho zařízením.
Pokud rutina DispatchReadWrite dokončí IRP s chybou, měla by nastavit Status člena ve vrstvě zásobníku I/O s odpovídající hodnotou typu NTSTATUS, nastavit člena Information na nulu a volat IoCompleteRequest s IRP a PriorityBoost IO_NO_INCREMENT.
Pokud ovladač používá vstupně-výstupní operace ve vyrovnávací paměti, může být potřeba definovat strukturu obsahující data, která se mají přenášet, a může být potřeba ukládat určitý počet těchto struktur interně do vyrovnávací paměti.
Pokud ovladač používá přímé I/O, může být potřeba zkontrolovat, zda MDL v Irp-MdlAddress> popisuje vyrovnávací paměť obsahující příliš mnoho dat (nebo příliš mnoho konců stránek), aby to podkladové zařízení zvládlo zpracovat v rámci jedné přenosové operace. Pokud ano, ovladač musí původní žádost o převod rozdělit do posloupnosti menších přenosových operací.
Úzce propojený ovladač třídy může takový požadavek rozdělit v rutině DispatchReadWrite pro příslušný ovladač portu. K tomu jsou potřeba ovladače třídy SCSI, zejména pro velkokapacitní zařízení. Další informace o požadavcích na ovladače SCSI najdete v tématu Ovladače úložiště.
Rutina DispatchReadWrite ovladače zařízení nižší úrovně by měla odložit rozdělení velké žádosti o převod do částečných přenosů, dokud jiná rutina ovladače neodstraní kód IRP k nastavení zařízení pro přenos.
Pokud ovladač zařízení nižší úrovně zařadí do fronty čtení/zápis IRP pro další zpracování vlastními rutinami, musí před jeho zařazením do fronty volat IoMarkIrpPending. Procedura DispatchReadWrite musí v těchto případech také vrátit řízení se STATUS_PENDING.
Pokud rutina DispatchReadWrite předává IRP do nižších ovladačů, musí nastavit umístění zásobníku vstupně-výstupních operací pro další nižší ovladač v IRP. Zda ovladač vyšší úrovně také nastaví rutinu IoCompletion v IRP před jeho předáním pomocí IoCallDriver závisí na návrhu ovladače a těch vrstvených pod ním.
Ovladač vyšší úrovně však musí volat IoSetCompletionRoutine před tím, než zavolá IoCallDriver, pokud přiděluje nějaké prostředky, jako jsou IRPs nebo paměť. Jeho rutina IoCompletion musí uvolnit všechny prostředky přidělené ovladači, když nižší ovladače dokončí požadavek, ale než rutina IoCompletion zavolá funkci IoCompleteRequest s původní IRP.
Pokud ovladač vyšší úrovně přiděluje IRP pro nižší ovladače, které mohou zahrnovat ovladač zařízení s vyměnitelnými médii, musí přidělující ovladač vytvořit kontext vlákna v každém IRP, které přidělí.