Udostępnij przez


Pojedyncza procedura DispatchCreateClose

Wiele sterowników, szczególnie sterowników niższego poziomu w łańcuchu sterowników warstwowych, musi jedynie ustalić swoje istnienie po otrzymaniu żądania utworzenia i muszą jedynie potwierdzić otrzymanie żądania zamknięcia.

Na przykład sterownik portu dla kontrolera urządzenia z jednym lub większą liczbą ściśle powiązanych sterowników klasowych, które wywołują IoGetDeviceObjectPointer, może mieć minimalną procedurę DispatchCreateClose. Rutyna może nie robić nic więcej poza ukończeniem IRP w następujący sposób:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

Ta minimalna procedura DispatchCreateClose ustawia element członkowski Informacja bloku stanu we/wy na zero, wskazując, że obiekt pliku jest otwarty na potrzeby żądania utworzenia; Informacja nie ma znaczenia dla żądania zamknięcia. Rutyna ustawia członka Statusu na STATUS_SUCCESS i jednocześnie zwraca tę wartość stanu, wskazując, że sterownik jest gotowy do akceptowania żądań wejścia/wyjścia.

Ta minimalna rutyna DispatchCreateClose kończy tworzenie IRP bez zwiększania priorytetu inicjatora IRP (IO_NO_INCREMENT), ponieważ przyjmuje się, że inicjator czeka na nieokreślony, ale bardzo mały interwał ukończenia żądania.

Ile pracy wykonuje procedura DispatchCreateClose , zależy częściowo od charakteru urządzenia kierowcy lub urządzenia bazowego, a częściowo od projektu sterownika. Jeśli sterownik wykonuje bardzo różne operacje na potrzeby tworzenia i zamykania żądań, powinien obsługiwać te żądania w oddzielnych procedurach DispatchCreate i DispatchClose.

Aby obsłużyć żądanie tworzenia w celu otwarcia obiektu pliku reprezentującego urządzenie logiczne lub fizyczne, sterownik najwyższego poziomu powinien wykonać następujące czynności:

  1. Wywołaj IoGetCurrentIrpStackLocation, aby uzyskać wskaźnik do lokalizacji stosu we/wy w IRP.

  2. Sprawdź obiekt FileObject. FileName w lokalizacji stosu we/wy i ukończ protokół IRP przy użyciu STATUS_SUCCESS, jeśli ciąg Unicode o nazwie FileName ma zero długości; w przeciwnym razie ukończ protokół IRP przy użyciu STATUS_INVALID_PARAMETER.

Wykonanie powyższych kroków gwarantuje, że próba otwarcia pseudopliku na urządzeniu może spowodować problemy później. Zapobiega to na przykład próbom otwarcia nieistniejącego \\device\parallel0\temp.dat.