Udostępnij przez


Synchroniczne wysyłanie żądań we/wy

W poniższej tabeli wymieniono metody obiektów docelowych I/O, które sterownik może wywołać w celu synchronicznego wysyłania żądań I/O do celu I/O. Aby uzyskać szczegółowe informacje na temat używania tych metod, zobacz strony referencyjne metod.

Metoda Przeznaczenie

WdfIoTargetSendReadSynchronously

Wysyła żądanie odczytu

WdfIoTargetSendWriteSynchronously

Wysyła żądanie zapisu

WdfIoTargetSendIoctlSynchronously

Wysyła żądanie kontroli urządzenia

WdfIoTargetSendInternalIoctlSynchronously

Wysyła wewnętrzne żądanie kontroli urządzenia

WdfIoTargetSendInternalIoctlOthersSynchronously

Wysyła niestandardowe żądanie wewnętrznego sterowania urządzeniami

Żądania można również wysyłać synchronicznie, wywołując WdfRequestSend, ale najpierw należy sformatować żądanie, postępując zgodnie z regułami opisanymi w Wysyłanie żądań we/wy asynchronicznie.

Synchroniczne wysyłanie żądań we/wy do obiektu docelowego we/wy jest prostsze niż wysyłanie żądań we/wy asynchronicznie. Należy jednak użyć poniższych wskazówek, aby określić, czy synchroniczne operacje we/wy są odpowiednie dla sterownika:

  • Możesz użyć synchronicznego we/wy, jeśli sterownik nie wysyła wielu żądań we/wy i jeśli wydajność systemu lub urządzenia nie jest zmniejszona, ponieważ sterownik czeka na ukończenie każdego żądania we/wy.

  • Jeśli sterownik musi obsługiwać wiele żądań we/wy w krótkim czasie, prawdopodobnie nie możesz zezwolić kierowcy na oczekiwanie na ukończenie każdego żądania przed wysłaniem następnego żądania. W przeciwnym razie sterownik może utracić dane lub zmniejszyć wydajność urządzenia (i, być może, cały system). W takich przypadkach operacje we/wy asynchroniczne mogą być lepszym wyborem.

  • Synchroniczne operacje we/wy są przydatne do obsługi operacji, które muszą zostać uruchomione i zakończone bez dodatkowych współbieżnych działań. Takie operacje mogą obejmować resetowanie potoku USB lub odczytywanie rejestrów urządzeń.

  • W większości przypadków sterownik powinien określić wartość limitu czasu, gdy wywołuje metodę obiektu, która synchronicznie wysyła żądanie we/wy. Jeśli sterownik nie określi wartości limitu czasu, a urządzenie lub sterownik niższego poziomu nie odpowie, kierowca może zatrzymać się. W związku z tym użytkownik może doświadczyć aplikacji, która nie odpowiada. Ponadto inne sterowniki mogą nie być w stanie uzyskać zasobów systemowych, takich jak elementy robocze, jeśli twój sterownik ich nie zwalnia.

  • Jeśli sterowniki powyżej i poniżej Twojego w stosie wymagają, aby operacje przechodziły synchronicznie, Twój sterownik powinien używać synchronicznego I/O. W związku z tym należy dowiedzieć się więcej o wymaganiach innych sterowników, które mogą istnieć w stosie sterowników.

W poniższym przykładzie pokazano, jak wysłać synchroniczne żądanie kontroli we/wy (IOCTL):

NTSTATUS                status;
    WDF_MEMORY_DESCRIPTOR   inputDesc, outputDesc;
    PWDF_MEMORY_DESCRIPTOR  pInputDesc = NULL, pOutputDesc = NULL;
    ULONG_PTR               bytesReturned;

    UNREFERENCED_PARAMETER(FileObject);

    if (InputBuffer) {
        WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&inputDesc,
                                    InputBuffer,
                                    InputBufferLength);
        pInputDesc = &inputDesc;
    }

    if (OutputBuffer) {
        WDF_MEMORY_DESCRIPTOR_INIT_BUFFER(&outputDesc,
                                    OutputBuffer,
                                    OutputBufferLength);
        pOutputDesc = &outputDesc;
    }

    status = WdfIoTargetSendIoctlSynchronously(
                        IoTarget,
                        WDF_NO_HANDLE, // Request
                        IoctlControlCode,
                        pInputDesc,
                        pOutputDesc,
                        NULL, // PWDF_REQUEST_SEND_OPTIONS
                        &bytesReturned);
    if (!NT_SUCCESS(status)) {
         DEBUGP(MP_ERROR,
        ("WdfIoTargetSendIoctlSynchronously failed 0x%x\n",
          status));
    }

    *BytesReadOrWritten = (ULONG)bytesReturned;