Přenos ovladačů miniportu NDIS do NetAdapterCx
Tato stránka popisuje, jak převést ovladač miniportu NDIS 6.x na klientský ovladač NetAdapterCx.
Obecné informace o WDF naleznete v WDF Driver Development Guide.
Nastavení kompilace
Otevřete existující projekt ovladače miniportu NDIS v sadě Visual Studio a pomocí následujících kroků ho převeďte na projekt KMDF.
Nejprve přejděte na Vlastnosti konfigurace –>Nastavení ovladače –>Model ovladače a ověřte, že Typ ovladače je nastavený na KMDF a že Hlavní verze KMDF a Vedlejší verze KMDF jsou obě prázdné.
Ve vlastnostech projektu otevřete Nastavení ovladače –>ovladač síťového adaptéru a nastavte Link na rozšíření třídy síťových adaptérů na Ano.
- Pokud převedený ovladač bude stále volat rozhraní API NDIS, pokračujte v propojení s
ndis.lib
.
- Pokud převedený ovladač bude stále volat rozhraní API NDIS, pokračujte v propojení s
Odeberte makra preprocesoru NDIS, například
NDIS650_MINIPORT=1
.Do každého zdrojového souboru (nebo do společné nebo předkompilované hlavičky) přidejte následující hlavičky:
#include <ntddk.h> #include <wdf.h> #include <netadaptercx.h>
Přidejte standardní dekorace WDF do INF:
[Yourdriver.Wdf] KmdfService = Yourdriverservice, Yourdriver.wdfsect [Yourdriver.wdfsect] KmdfLibraryVersion = <insert here>
Do části NT inf přidejte nová požadovaná síťová klíčová slova:
*IfConnectorPresent
*ConnectionType
*DirectionType
*TypPřístupu
*HardwareLoopback
Další informace o těchto klíčových slovech a příkladu najdete v části INF soubory pro klientské ovladače NetAdapterCx.
Inicializace ovladačů
Odeberte volání NdisMRegisterMiniportDriver z DriverEntrya přidejte následující:
WDF_DRIVER_CONFIG_INIT(&config, EvtDriverDeviceAdd);
status = WdfDriverCreate(. . . );
if (!NT_SUCCESS(status)) {
return status;
}
Pokud je nastaven, odeberte příznak WdfDriverInitNoDispatchOverride z volání WdfDriverCreate.
DriverUnload je volitelná rutina síťového ovladače WDF, takže ji můžete odebrat, pokud chcete. Nevolejte NdisMDeregisterMiniportDriver z DriverUnload.
Inicializace zařízení
Dále distribuujete kód z MiniportInitializeEx do příslušných obslužných rutin zpětného volání událostí WDF, z nichž několik je volitelné. Podrobnosti o sekvenci zpětného volání najdete v sekci Power-Up Sekvence pro klientský ovladač WDF síťového adaptéru.
Zavoláte metody ekvivalentní NdisMSetMiniportAttributes při spuštění síťového adaptéru, ale před voláním NetAdapterStart. Místo volání jedné rutiny s obecnou strukturou NDIS_MINIPORT_ADAPTER_ATTRIBUTES však ovladač klienta volá různé funkce pro nastavení různých typů funkcí.
Informace o zpětných voláních, které budete muset poskytnout a kdy spustit síťový adaptér, najdete v tématu inicializace zařízení a adaptéru.
Čtení konfigurace z registru
Dále nahraďte volání NdisOpenConfigurationEx a souvisejících funkcí metodami NetConfiguration*
.
NetConfiguration*
metody jsou podobné funkcím Ndis*Configuration*
a nebudete muset restrukturalizovat kód.
Další informace najdete v tématu Přístup k informacím o konfiguraci.
Příjem vstupně-výstupních řídicích kódů (IOCTLs) z uživatelského režimu
Přečtěte si tuto část, pokud ovladač NDIS volá NdisRegisterDeviceEx, rutina použitá k vytvoření objektu řídicího zařízení (CDO) pro příjem ioCTLs z uživatelského režimu.
Tady jsou dva způsoby, jak to udělat v síťovém ovladači klienta WDF.
Nejjednodušším portem je vytvořit řídicí objekt zařízení voláním WdfControlDeviceInitAllocate z zpětného volání klienta EVT_WDF_DRIVER_DEVICE_ADD. Další informace najdete v tématu Použití řídicích objektů zařízení.
Doporučujeme však vytvořit rozhraní zařízení, jak je popsáno v Použití rozhraní zařízení.
Dokončení inicializace zařízení
V tomto okamžiku, v EVT_WDF_DRIVER_DEVICE_ADD, můžete udělat jakékoli další kroky k inicializaci vašeho zařízení, například přidělit přerušení.
Zpracování oznámení o změnách stavu napájení
Klientský ovladač WDF neobdrží OID_PNP_SET_POWER pro změny stavu napájení.
Místo toho klient WDF zaregistruje volitelné funkce zpětného volání pro příjem oznámení o změně stavu napájení. Přehled najdete v tématu Podpora PnP a Řízení spotřeby v ovladačích funkcí.
Kód v obslužné rutině OID_PNP_SET_POWER se obvykle přesune na EVT_WDF_DEVICE_D0_EXIT a EVT_WDF_DEVICE_D0_ENTRY.
Vzhledem k tomu, že se počítač stavu napájení WDF mírně liší, budete možná muset provést menší úpravy kódu.
Konkrétně ve zpětné volací funkci MiniportInitializeEx ovladač miniportu NDIS provádí jednorázové inicializační úkony a také práci potřebnou k přepnutí zařízení do stavu D0. Pak zopakuje postup, aby přešel do D0 v jeho obslužné rutině OID_PNP_SET_POWER.
Naproti tomu klient WDF provádí jednorázové úlohy inicializace v zpětných voláních událostí před EVT_WDF_DEVICE_D0_ENTRY, během kterých je zařízení ve stavu nízkého výkonu. Pak se provede práce k přechodu na D0 v EVT_WDF_DEVICE_D0_ENTRY.
Abychom to shrnuli, v rámci WDF umístíte kód "go to D0" na jedno místo místo dvou.
Podrobnosti o sekvenci zpětného volání najdete v Power-Up posloupnosti pro klientský ovladač NetAdapterCx.
Dotazování a nastavení možností řízení spotřeby
Podobně klientský ovladač WDF neobdrží OID_PM_PARAMETERS k dotazování nebo nastavení hardwarových schopností řízení spotřeby síťového adaptéru.
Místo toho ovladač dotazuje potřebnou konfiguraci wake-on-LAN (WoL) z objektu NETPOWERSETTINGS. Další informace najdete v tématu Konfigurace řízení spotřeby.
Skutečné příznaky, které dostanete zpět, mají stejnou sémantiku jako pro miniport NDIS 6, takže nemusíte provádět hloubkové změny logiky. Hlavní rozdíl spočívá v tom, že teď můžete tyto příznaky dotazovat během sekvence vypínání. Viz pořadí power-down pro klientský ovladač NetAdapterCx.
Jakmile tento kód přesunete, můžete odstranit obslužné rutiny OID pro OID_PNP_SET_POWER a OID_PM_PARAMETERS.
Vzhledem k tomu, že rozhraní NetAdapter udržuje vaše zařízení v D0, zatímco hostitel používá síťové rozhraní, klient obvykle neimplementuje logiku napájení; Výchozí chování napájení NetAdapter je dostatečné.
Cesta k datům
Programovací model datových cest se výrazně změnil. Tady jsou některé klíčové rozdíly:
- V modelu NetAdapter už síťový provoz není pro adaptér, jako v NDIS, ale spíše pro frontu WDF. Viz Vytváření Vstupně-Výstupních Front.
- Místo fondů NET_BUFFER_LIST a NET_BUFFER NetAdapterCx zavádí vyrovnávací paměť typu kroužkového buffru, která se skládá ze síťových paketů, které se mapují na NDIS následujícím způsobem:
- NET_PACKET podobá se NET_BUFFER_LIST + NET_BUFFER.
- NET_PACKET_FRAGMENT je podobný seznamu popisovačů paměti (MDL). Každá NET_PACKET obsahuje jeden nebo více těchto prvků.
- Podrobnosti o náhradních strukturách a jejich použití najdete v popisovačích paketů a v rozšířeních.
- V NDIS 6.x musí miniport zpracovat sémantiku spuštění a pozastavení. V modelu NetAdapterCx už tomu tak není.
- Zpětné volání EVT_RXQUEUE_ADVANCE se podobá MINIPORT_RETURN_NET_BUFFER_LISTS v NDIS 6.x.
- Zpětné volání EVT_TXQUEUE_ADVANCE se podobá MINIPORT_SEND_NET_BUFFER_LISTS v NDIS 6.x.
Odebrání zařízení
Odebrání zařízení pro ovladač WDF pro NIC je stejné jako u jakéhokoli jiného ovladače zařízení WDF bez potřeby specifického zpracování pro sítě. Nejprve se vypne síťová datová cesta, poté zařízení WDF. Informace o vypnutí služby WDF najdete v tématu Uživatel odpojí zařízení.
Obslužná rutina MiniportHaltEx bude pravděpodobně rozdělena mezi EVT_WDF_DEVICE_D0_EXIT a EVT_WDF_DEVICE_RELEASE_HARDWARE.
Klient služby WDF nemusí odstranit NetAdapter ani žádnou frontu datové cesty, které vytvořil. Služba WDF tyto objekty odstraní automaticky.
Můžete odstranit MiniportShutdownEx, MiniportResetEx a MiniportCheckForHangEx. Tyto zpětná volání se už nepodporují.
ekvivalenty funkce NDIS-WDF
Většinu NdisXxx
funkcí je možné nahradit ekvivalentem WDF. Obecně byste měli zjistit, že potřebujete velmi málo funkcí, které jsou importovány z NDIS.SYS
.
Seznam ekvivalentů funkce najdete v tématu NDIS-WDF ekvivalenty funkce.
Ladění
Viz Ladění klientského ovladače NetAdapterCx.
Rozšíření ladicího programu !ndiskd.netadapter ukazuje výsledky podobné tomu, co !ndiskd.miniport ukazuje pro ovladač NDIS 6.
Závěr
Pomocí kroků v tomto tématu byste měli mít funkční ovladač, který se spustí a zastaví zařízení.
Poznámka: NetAdapterCx v současné době nepodporuje spouštění iSCSI.