Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Po tym, jak IoCreateDevice zwróci wskaźnik wywołującemu do DeviceObject zawierającego wskaźnik do rozszerzenia urządzenia , sterowniki muszą skonfigurować określone pola w obiektach urządzenia dla odpowiednich urządzeń fizycznych, logicznych i/lub wirtualnych.
IoCreateDevice ustawia pole StackSize nowo utworzonego obiektu urządzenia na jeden. Sterownik najniższego poziomu może zignorować to pole. Gdy sterownik wyższego poziomu wywołuje IoAttachDeviceToDeviceStack, aby dołączyć się do następnego, niższego sterownika, procedura ta automatycznie ustawia pole StackSize w obiekcie urządzenia tak, aby odpowiadało obiektowi urządzenia następnego, niższego sterownika powiększonemu o jeden. Jednak w przypadku niektórych typów urządzeń sterownik wyższego poziomu może wymagać ustawienia pola StackSize na większą wartość, jak wspomniano w dokumentacji specyficznej dla urządzenia. Ustawienie rozmiaru stosu zapewnia, że IRP-y wysyłane do sterownika wyższego poziomu będą zawierać specyficzną dla sterownika lokalizację stosu we/wy, a także odpowiednią liczbę lokalizacji stosu we/wy dla wszystkich sterowników niższego poziomu w łańcuchu.
IoCreateDevice ustawia pole AlignmentRequirement nowo utworzonego obiektu urządzenia na rozmiar linii pamięci podręcznej danych procesora minus jeden, aby upewnić się, że bufory używane w bezpośrednim we/wy są prawidłowo wyrównane. Po powrocie IoCreateDevice sterowniki urządzeń fizycznych najniższego poziomu muszą wykonać następujące czynności:
Odejmij jeden od wymagania dotyczącego wyrównania urządzenia.
Porównaj wynik kroku 1 z bieżącą wartością AlignmentRequirement obiektu urządzenia.
Jeśli wymaganie wyrównania urządzenia jest większe, ustaw AlignmentRequirement na wynik z kroku 1. W przeciwnym razie pozostaw wartość AlignmentRequirement ustawioną przez IoCreateDevice.
Po tym, jak sterownik wyższego poziomu łączy się nad innym sterownikiem, wywołując IoGetDeviceObjectPointer, sterownik wyższego poziomu musi ustawić pole AlignmentRequirement swojego nowo utworzonego obiektu urządzenia tak, aby odpowiadało wymaganiom obiektu urządzenia sterownika następnego, niższego poziomu. Ogólnie rzecz biorąc, sterownik wyższego poziomu nie powinien zmieniać tej wartości. Jeśli sterownik wyższego poziomu wywołuje IoAttachDevice lub IoAttachDeviceToDeviceStack, te procedury automatycznie ustawiają Wymóg wyrównania pola w obiekcie urządzenia na wartość obiektu urządzenia sterownika niższego poziomu.
IoGetDeviceObjectPointer zwraca wskaźniki zarówno do obiektu urządzenia sterownika niższego poziomu, jak i do skojarzonego obiektu pliku. Tylko fsD (lub, ewentualnie, inny sterownik najwyższego poziomu) może używać zwróconego wskaźnika obiektu pliku. Sterownik pośredni, który wywołuje IoGetDeviceObjectPointer, powinien zapisać ten wskaźnik obiektu pliku, aby można było go wyłuszczyć, wywołując ObDereferenceObject, gdy sterownik zostanie zwolniony.
Po zamontowaniu woluminu zawierającego obiekt pliku, który reprezentuje obiekt urządzenia niższego sterownika, pośredni sterownik nie może ustawić się między systemem plików a niższym sterownikiem przez wywołanie IoAttachDevice lub IoAttachDeviceToDeviceStack. Ponadto FSD może ustawić członkowski komponent SectorSize obiektu urządzenia na podstawie geometrii bazowego sprzętu woluminu podczas montowania. Aby uzyskać więcej informacji, zobacz DEVICE_OBJECT.
Sterownik pośredniego lub najniższego poziomu ustawia również nieco w flagi urządzenia przez ORing go z DO_DIRECT_IO lub DO_BUFFERED_IO w każdym tworzonym obiekcie urządzenia. Sterowniki najwyższego poziomu dla urządzeń logicznych lub wirtualnych mogą uniknąć ustawienia Flagi dla operacji we/wy buforowanych lub bezpośrednich, jeśli projektant sterowników zdecyduje, że dodatkowa praca przyniesie korzyści w postaci lepszej wydajności sterownika. Sterownik pośredni musi skonfigurować pole Flags swojego obiektu urządzenia, aby było zgodne z obiektem urządzenia sterownika na niższym poziomie.
Skonfigurowanie pola Flags w obiekcie urządzenia z użyciem DO_DIRECT_IO lub DO_BUFFERED_IO określa, w jaki sposób menedżer we/wy przekazuje dostęp do buforów użytkownika we wszystkich żądaniach transferu danych wysyłanych następnie do sterownika.
Sterownik może następnie ustawić inne wartości zależne od urządzenia w obiekcie urządzenia. Na przykład, sterowniki inne niż WDM (non-WDM) dla urządzeń o wymienialnych nośnikach muszą oznaczyć bit członka Flags obiektu urządzenia jako DO_VERIFY_VOLUME, jeśli wykryją (lub podejrzewają) zmianę nośnika podczas operacji we/wy. (Aby uzyskać więcej informacji, zobacz Obsługa nośnika wymiennego). Sterowniki urządzeń, które wymagają zasilania inrush, muszą OR flagi członka z DO_POWER_INRUSH, a sterowniki urządzeń, które nie znajdują się na ścieżce stronicowania systemu, muszą OR flagi członka z DO_POWER_PAGABLE. Sterowniki funkcji i filtru muszą wyczyścić flagę DO_DEVICE_INITIALIZING.
Po inicjalizacji obiektu urządzenia, sterownik urządzenia może również zainicjować dowolne obiekty zdefiniowane przez jądro i inne struktury danych zdefiniowane przez system, dla których zapewnił przestrzeń w rozszerzeniu urządzenia. Dokładnie wtedy, gdy sterownik wykonuje te zadania, zależy od jego urządzenia, typu obiektu i/lub charakteru danych. Ogólnie rzecz biorąc, wszystkie obiekty lub struktury danych, które mogą być utrwalane za pośrednictwem żądań uruchamiania i zatrzymywania pnP, można zainicjować w procedurze AddDevice. Te, które wymagają informacji o zasobach dostarczone z żądaniem pnP IRP_MN_START_DEVICE lub które mogą wymagać zmian po zatrzymaniu urządzenia i/lub ponownym uruchomieniu, powinny zostać zainicjowane, gdy sterownik obsługuje żądanie IRP_MN_START_DEVICE. Aby uzyskać więcej informacji na temat procedur AddDevice, zobacz Pisanie procedury addDevice.