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.
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 |
|---|---|
Wysyła żądanie odczytu |
|
Wysyła żądanie zapisu |
|
Wysyła żądanie kontroli urządzenia |
|
Wysyła wewnętrzne żądanie kontroli urządzenia |
|
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;