Udostępnij przez


Funkcja BuildRequest sterownika dla klasy pamięci

Podobnie jak wszystkie wyższopoziomowe sterowniki trybu jądra, sterownik klasy nośników danych musi skonfigurować lokalizację stosu we/wy protokołu IRP na kolejnym niższym sterowniku podczas obsługi żądań do urządzeń peryferyjnych nośników danych. W IRP, które sterownik klasy konfiguruje z SRB dla udostępnionego przez system sterownika portu, lokalizacja stosu we/wy sterownika portu jest ustawiona w następujący sposób:

  • MajorFunction zawiera IRP_MJ_SCSI

  • Parametr.Scsi.Srb zawiera wskaźnik do SRB

Każdy sterownik klasy jest odpowiedzialny za przydzielanie pamięci dla bloków żądań pamięci (SRB) oraz za konfigurowanie ich z CDB dla bazowego sterownika portu pamięci masowej. Sterownik klasy może skonfigurować listę lookaside dla swoich SRB za pomocą ExInitializeNPageLookasideList lub wywołać ExAllocatePool dla pamięci niestronicowanej. Aby uzyskać więcej informacji na temat korzystania z list lookaside i niestronicowanej puli, zobacz Korzystanie z list lookaside .

Niezależnie od tego, czy przydziela pamięć z puli, czy z listy przeszukiwania utworzonej przez sterownik, każdy sterownik klasy magazynu jest odpowiedzialny za zwalnianie pamięci przydzielanej dla SRB. Procedury IoCompletion sterowników klasy magazynu, opisane w sekcji Procedury IoCompletion sterownika klasy magazynu, zwykle zwalniają pamięć przydzieloną dla SRBs do listy odsyłaczy.

Procedura BuildRequest sterownika klasy musi ustawić odpowiednie wartości w składowych SRB, w tym długość skonfigurowanego przez nią CDB, aby komunikować się z urządzeniem. W przypadku żądań zwracających informacje o sensie żądania i/lub wymagających, aby sterownik ponowił próbę, ustawia procedurę IoCompletion w IRP. W przypadku żądań odczytu lub zapisu łączy SrbFlags z odpowiednim kierunkiem transferu: SRB_FLAGS_DATA_IN lub SRB_FLAGS_DATA_OUT.

Rutyna BuildRequest może współdzielić odpowiedzialność za skonfigurowanie protokołu SRB przy użyciu pary procedur SendSrbSynchronous i SendSrbAsynchronous . Oznacza to, że procedura BuildRequest może skonfigurować elementy członkowskie SRB, które są zwykle konfigurowane dla wszystkich żądań, podczas gdy procedury SendSrbXxx ustawiają wartości SRB istotne tylko dla każdego typu żądania. Po przekazaniu protokołu IRP do sterownika portu z procedury SendSrbAsynchronous należy skonfigurować protokół IRP przy użyciu procedury IoCompletion dostarczonej przez sterownik.

Po załadowaniu sterownika klasowego konfiguruje on większość SRB z funkcją Function ustawioną na SRB_FUNCTION_EXECUTE_SCSI, co oznacza żądanie I/O urządzenia do przesłania przez magistralę.

Aby uzyskać więcej informacji na temat składowych SRB zdefiniowanych przez system i ich wartości, zobacz SCSI_REQUEST_BLOCK.

Konfigurowanie SRBs dla Request Sense

Sterownik klasy może zażądać, aby sterownik portu zwracał sens żądania SCSI lub równoważne informacje, gdy kontroler docelowy zwraca warunek sprawdzania. Aby to zrobić, sterownik klasy konfiguruje wskaźnik SenseInfoBuffer i SenseInfoBufferLength w SRB, aby sterownik portu mógł zwrócić informacje o sensie żądania, jeśli wystąpi warunek sprawdzania. Sterownik portu wskazuje, że zwrócił informacje o stanie żądania, ustawiając członka SrbStatus z SRB_STATUS_AUTOSENSE_VALID, gdy zwraca IRP. Aby uzyskać więcej informacji na temat procedur InterpretSenseInfo, zobacz procedury InterpretRequestSense sterownika klasy magazynu.

Ponowienia

Sterowniki klasy pamięci masowej są odpowiedzialne za ponawianie żądań, które kończą się niepowodzeniem z powodu błędów obiektu docelowego/kontrolera, resetów magistrali lub przekroczenia limitu czasu żądania. W związku z tym wiele sterowników klas utrzymuje licznik ponownych prób we własnej lokalizacji stosu we/wy IRP. Taka procedura BuildRequest sterownika klasy może również zainicjować limit ponawiania dla danego żądania, zanim skonfiguruje procedurę IoCompletion i wysyła protokół IRP do sterownika portu. Aby uzyskać więcej informacji na temat rutyn RetryRequest, zobacz Rutyny RetryRequest sterownika klasy magazynu.