Udostępnij przez


Używanie interfejsów urządzeń w sterownikach UMDF

Ostrzeżenie

UMDF 2 jest najnowszą wersją UMDF i zastępuje UMDF 1. Wszystkie nowe sterowniki UMDF powinny być zapisywane przy użyciu funkcji UMDF 2. Do usługi UMDF 1 nie są dodawane żadne nowe funkcje, a obsługa UMDF 1 na nowszych wersjach systemu Windows 10 jest ograniczona. Sterowniki uniwersalne systemu Windows muszą używać funkcji UMDF 2.

Zarchiwizowane przykłady UMDF 1 można znaleźć w Windows 11, wersja 22H2 - Maj 2022 aktualizacja przykładów sterowników.

Aby uzyskać więcej informacji, zobacz Wprowadzenie do usługi UMDF.

Interfejs urządzenia to symboliczny link do urządzenia Plug and Play (PnP), którego aplikacja może używać do uzyskiwania dostępu do urządzenia. Aplikacja w trybie użytkownika może przekazać nazwę linku symbolicznego interfejsu do elementu interfejsu API, takiego jak funkcja CreateFile platformy Microsoft Win32. Aby uzyskać nazwę linku symbolicznego interfejsu urządzenia, aplikacja trybu użytkownika może wywoływać funkcje SetupDi . Aby uzyskać więcej informacji na temat funkcji SetupDi, zobacz SetupDi Device Interface Functions (Funkcje interfejsu urządzenia SetupDi).

Każdy interfejs urządzenia należy do klasy interfejsu urządzenia. Na przykład stos sterowników dla urządzenia CD-ROM może zapewnić interfejs należący do klasy GUID_DEVINTERFACE_CDROM. Jeden z sterowników urządzenia CD-ROM zarejestrowałby wystąpienie klasy GUID_DEVINTERFACE_CDROM w celu poinformowania systemu i aplikacji o dostępności urządzenia CD-ROM. Aby uzyskać więcej informacji na temat klas interfejsów urządzeń, zobacz Wprowadzenie do interfejsów urządzeń.

Rejestrowanie interfejsu urządzenia

Aby zarejestrować wystąpienie klasy interfejsu urządzenia, sterownik oparty na UMDF może wywołać IWDFDevice::CreateDeviceInterface z poziomu funkcji zwrotnej IDriverEntry::OnDeviceAdd. Jeśli sterownik obsługuje wiele wystąpień interfejsu, może przypisać unikatowy ciąg odwołania do każdego wystąpienia.

Włączanie i wyłączanie interfejsu urządzenia

Jeśli tworzenie zakończy się pomyślnie, platforma automatycznie włącza i wyłącza interfejs na podstawie stanu pnP urządzenia.

Ponadto sterownik może wyłączyć i ponownie włączyć interfejs urządzenia w razie potrzeby. Jeśli na przykład sterownik ustali, że jego urządzenie przestało odpowiadać, sterownik może wywołać funkcję IWDFDevice::AssignDeviceInterfaceState , aby wyłączyć interfejsy urządzenia i uniemożliwić aplikacjom uzyskanie nowych dojść do interfejsu. (Nie ma to wpływu na istniejące dojścia do interfejsu). Jeśli urządzenie będzie później dostępne, sterownik może ponownie wywołać element IWDFDevice::AssignDeviceInterfaceState , aby ponownie włączyć interfejsy.

Odbieranie żądań dostępu do interfejsu urządzenia

Gdy aplikacja żąda dostępu do interfejsu urządzenia sterownika, platforma wywołuje funkcję callback IQueueCallbackCreate::OnCreateFile. Sterownik może wywołać metodę IWDFFile::RetrieveFileName , aby uzyskać nazwę urządzenia lub pliku, do którego uzyskuje dostęp aplikacja. Jeśli sterownik określił ciąg odwołania podczas rejestrowania interfejsu urządzenia, system operacyjny zawiera ciąg odwołania w pliku lub nazwie urządzenia, który zwraca IWDFFile::RetrieveFileName .

Tworzenie zdarzeń urządzenia

Sterownik oparty na usłudze UMDF może tworzyć zdarzenia niestandardowe specyficzne dla urządzenia (nazywane zdarzeniami urządzenia), wywołując metodę IWDFDevice::P ostEvent. Sterownik zarejestrowany do korzystania z dowolnego interfejsu urządzenia może odbierać powiadomienia o zdarzeniach niestandardowych urządzenia. Sterowniki oparte na frameworku UMDF otrzymują takie powiadomienia, implementując funkcję wywołania zwrotnego IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent.

Zdarzenia niestandardowe są unikatowe dla urządzenia. Zarówno deweloper sterownika, który tworzy zdarzenie, jak i deweloper sterownika, który odbiera zdarzenie, musi zrozumieć znaczenie zdarzenia.

Uzyskiwanie dostępu do interfejsu urządzenia innego sterownika

Jeśli chcesz, aby sterownik oparty na UMDF wysyłał żądania we/wy do interfejsu urządzenia udostępnianego przez inny sterownik, możesz utworzyć zdalny element docelowy we/wy reprezentujący interfejs urządzenia.

Najpierw sterownik musi zarejestrować się, aby otrzymywać powiadomienie, gdy interfejs urządzenia jest dostępny. Wykonaj następujące kroki:

  1. Gdy sterownik wywołuje metodę IWDFDriver::CreateDevice, może udostępnić interfejs IPnpCallbackRemoteInterfaceNotification. Funkcja wywołania zwrotnego IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival tego interfejsu informuje Twój sterownik o dostępności interfejsów urządzeń.

  2. Po tym, jak sterownik wywoła IWDFDriver::CreateDevice, może wywołać metodę IWDFDevice2::RegisterRemoteInterfaceNotification dla każdego interfejsu urządzenia, który będzie używany przez sterownik.

Następnie platforma wywołuje funkcję zwrotną IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival za każdym razem, gdy określony interfejs urządzenia stanie się dostępny. Funkcja wywołania zwrotnego może wywołać metodę IWDFRemoteInterfaceInitialize::GetInterfaceGuid i IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink, aby określić, który interfejs urządzenia dotarł.

Funkcja wywołania zwrotnego IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival powinna zwykle wykonywać następujące czynności:

  1. Wywołaj metodę IWDFDevice2::CreateRemoteInterface, aby utworzyć obiekt interfejsu zdalnego, opcjonalnie podając interfejs IRemoteInterfaceCallbackEvent oraz interfejs IRemoteInterfaceCallbackRemoval.

  2. Wywołaj metodę IWDFDevice2::CreateRemoteTarget, aby utworzyć obiekt zdalny, opcjonalnie podając interfejs IRemoteTargetCallbackRemoval.

  3. Wywołaj metodę IWDFRemoteTarget::OpenRemoteInterface, aby połączyć interfejs urządzenia z zdalnym obiektem docelowym.

    Jeśli interfejs urządzenia jest taki, który tworzy moduł wyliczający urządzenia oprogramowania SWENUM, sterownik musi wywołać metodę OpenRemoteInterface z elementu roboczego. (Na przykład zobacz funkcję QueueUserWorkItem w zestawie WINDOWS SDK).

Teraz sterownik może formatować i wysyłać żądania I/O do zdalnego obiektu docelowego I/O.

Oprócz funkcji wywołania zwrotnego IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival sterownik oparty na UMDF może zapewnić dwie dodatkowe funkcje wywołania zwrotnego w celu odbierania powiadomień o zdarzeniach interfejsu urządzenia: