Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Implementierung des Clienttreibers zum Aktualisieren des Zustands des USB-Geräts.
Syntax
EVT_UFX_DEVICE_USB_STATE_CHANGE EvtUfxDeviceUsbStateChange;
VOID EvtUfxDeviceUsbStateChange(
[in] UFXDEVICE unnamedParam1,
[in] USBFN_DEVICE_STATE unnamedParam2
)
{...}
Parameter
[in] unnamedParam1
Das Handle für ein USB-Geräteobjekt, das der Clienttreiber in einem vorherigen Aufruf des UfxDeviceCreateempfangen hat.
[in] unnamedParam2
Ein USBFN_DEVICE_STATE typisiertes Flag, das den Status des USB-Geräts angibt.
Rückgabewert
Nichts
Bemerkungen
Der Clienttreiber für den Funktionshostcontroller registriert seine EVT_UFX_DEVICE_USB_STATE_CHANGE Implementierung mit der USB-Funktionsklassenerweiterung (UFX), indem die UfxDeviceCreate-Methode aufgerufen wird.
UFX ruft diesen Ereignisrückruf auf, um den Clienttreiber über den neuen Zustand des Geräts zu informieren.
Der Clienttreiber gibt den Abschluss dieses Ereignisses an, indem die UfxDeviceEventComplete--Methode aufgerufen wird.
Beispiele
EVT_UFX_DEVICE_USB_STATE_CHANGE UfxDevice_EvtDeviceUsbStateChange;
VOID
UfxDevice_EvtDeviceUsbStateChange (
_In_ UFXDEVICE UfxDevice,
_In_ USBFN_DEVICE_STATE NewState
)
/*++
Routine Description:
EvtDeviceUsbStateChange handler for the UFXDEVICE object.
Arguments:
UfxDevice - UFXDEVICE object representing the device.
NewState - The new device state.
--*/
{
NTSTATUS Status;
PUFXDEVICE_CONTEXT Context;
PCONTROLLER_CONTEXT ControllerContext;
ULONG EpIndex;
USBFN_DEVICE_STATE OldState;
PAGED_CODE();
TraceEntry();
Context = UfxDeviceGetContext(UfxDevice);
ControllerContext = DeviceGetControllerContext(Context->FdoWdfDevice);
OldState = Context->UsbState;
TraceInformation("New STATE: %d", NewState);
Status = UfxDeviceStopOrResumeIdle(UfxDevice, NewState, Context->UsbPort);
LOG_NT_MSG(Status, "Failed to stop or resume idle");
WdfWaitLockAcquire(ControllerContext->InitializeDefaultEndpointLock, NULL);
if (ControllerContext->InitializeDefaultEndpoint == TRUE) {
//
// Reset endpoint 0. This is the last part of soft reset, which was postponed
// until now, since we need to make sure EP0 is created by UFX.
//
DeviceInitializeDefaultEndpoint(Context->FdoWdfDevice);
ControllerContext->InitializeDefaultEndpoint = FALSE;
}
WdfWaitLockRelease(ControllerContext->InitializeDefaultEndpointLock);
if (NewState == UsbfnDeviceStateConfigured && OldState != UsbfnDeviceStateSuspended) {
for (EpIndex = 1; EpIndex < WdfCollectionGetCount(Context->Endpoints); EpIndex++) {
UfxEndpointConfigure(WdfCollectionGetItem(Context->Endpoints, EpIndex));
}
//
// #### TODO: Insert code to allow the controller to accept U1/U2, if supported ####
//
}
if (NewState == UsbfnDeviceStateDetached) {
KeSetEvent(&ControllerContext->DetachEvent,
IO_NO_INCREMENT,
FALSE);
}
UfxDeviceEventComplete(UfxDevice, STATUS_SUCCESS);
TraceExit();
}
Anforderungen
| Anforderung | Wert |
|---|---|
| Zielplattform- | Fenster |
| Minimale KMDF-Version | 1.0 |
| Mindest-UMDF-Version | 2.0 |
| Header- | ufxclient.h |
| IRQL- | PASSIVE_LEVEL |