Udostępnij przez


Opcjonalne obowiązki DriverEntry

W zależności od pozycji określonego sterownika w łańcuchu sterowników warstwowych, charakter urządzenia bazowego i projekt sterownika, procedura DriverEntry może być również odpowiedzialna za następujące zadania:

  • Wywołanie IoAllocateDriverObjectExtension w celu utworzenia i zainicjowania rozszerzenia obiektu sterownika, jeśli sterownik wymaga przechowywania danych w skali całego sterownika. Rozszerzenie obiektu sterownika to struktura danych specyficzna dla sterownika. Na przykład sterownik może użyć rozszerzenia obiektu sterownika do przechowywania ścieżki rejestru lub innych informacji globalnych.

  • Wywołanie funkcji PsCreateSystemThread w celu utworzenia wątków roboczych dla menedżera wykonawczego, jeżeli sterownik jest sterownikiem najwyższego poziomu (takim jak sterownik systemu plików), który używa takich wątków. W takim przypadku sterownik musi również mieć procedurę wywołania zwrotnego typu WORKER_THREAD_ROUTINE, która przyjmuje jako jedyny parametr PVOID Parameter.

  • Rejestrowanie procedury Reinitialize . (Zobacz Pisanie procedury ponownej inicjalizacji.)

  • Obsługa wymagań inicjalizacji specyficznych dla klasy, które różnią się od omówionych tutaj, takich jak te, które może mieć sterownik miniportu lub miniklasy specyficzny dla urządzenia, współpracujący z portem lub sterownikiem klasy. Aby uzyskać szczegółowe informacje, zobacz dokumentację specyficzną dla typu urządzenia w zestawie sterowników systemu Windows (WDK).

Zapewnianie magazynu dla zasobów systemowych

Przydziel obiekty dla poszczególnych urządzeń w procedurze AddDevice lub w procedurze Dispatch, która obsługuje żądanie pnP IRP_MN_START_DEVICE , a nie w DriverEntry.

Sterownik może jednak wymagać przydzielenia dodatkowej pamięci w przestrzeni systemowej na inne potrzeby całego sterownika. Jeśli tak, procedura DriverEntry może wywołać jedną (lub więcej) z następujących procedur:

Każda procedura DriverEntry działa w kontekście wątku systemowego na poziomie IRQL równym PASSIVE_LEVEL. W związku z tym każda pamięć przydzielona exAllocatePoolWithTag do użytku wyłącznie podczas inicjowania może pochodzić ze stronicowanej puli, o ile sterownik nie kontroluje urządzenia, które przechowuje plik strony systemu. Przydzielona pamięć musi zostać zwolniona z ExFreePool, zanim DriverEntry zwróci kontrolę. Jednak sterownik, który ustawia procedurę Reinitialize, może przekazać wskaźnik do tej pamięci, gdy wywołuje IoRegisterDriverReinitialization, co sprawia, że procedura Reinitialize jest odpowiedzialna za zwolnienie alokacji pamięci.

Przejmowanie zasobów sprzętowych

Starsze sterowniki nie-PnP rezerwowały zasoby z rejestru. Z drugiej strony sterowniki PnP nie zgłaszają zasobów urządzeń z rejestru ani bezpośrednio zapisują wymagania dotyczące zasobów w rejestrze. Zamiast tego sterowniki zgłaszają żądania w odpowiedzi na niektóre IRP PnP w ramach procesu enumeracji menedżera PnP. Sterownik PnP odbiera przydzielone zasoby w żądaniu PnP IRP_MN_START_DEVICE.

Sterowniki, które nie wchodzą bezpośrednio w interakcje z menedżerem PnP, takie jak niektóre sterowniki miniportu, mogą mieć różne wymagania dotyczące raportowania nałożone przez klasę lub sterownik portu, który współdziała z menedżerem PnP. Takie wymagania są specyficzne dla klasy urządzenia. Aby uzyskać szczegółowe informacje specyficzne dla urządzenia i specyficzne dla klasy, zobacz dokumentację odpowiedniej klasy urządzeń w zestawie Sterowników systemu Windows (WDK).

Korzystanie z rejestru

Procedura DriverEntry może użyć rejestru, aby uzyskać niektóre informacje potrzebne do zainicjowania sterownika lub może ustawić informacje w rejestrze dla innych sterowników lub podsystemów chronionych do użycia. Charakter informacji zależy od typu urządzenia. Sterowniki mogą uzyskiwać dostęp do rejestru przy użyciu procedur ZwXxx i RtlXxx . Parametr RegistryPath procedury DriverEntry wskazuje zliczany ciąg Unicode, który określa ścieżkę do klucza rejestru sterownika, \Registry\Machine\System\CurrentControlSet\Services\DriverName. Procedura powinna zapisać kopię ciągu, a nie sam wskaźnik, ponieważ wskaźnik nie jest już prawidłowy po powrocie DriverEntry .