EVT_UFX_DEVICE_USB_STATE_CHANGE fonction de rappel (ufxclient.h)
Implémentation du pilote client pour mettre à jour l’état du périphérique USB.
Syntaxe
EVT_UFX_DEVICE_USB_STATE_CHANGE EvtUfxDeviceUsbStateChange;
void EvtUfxDeviceUsbStateChange(
[in] UFXDEVICE unnamedParam1,
[in] USBFN_DEVICE_STATE unnamedParam2
)
{...}
Paramètres
[in] unnamedParam1
Handle vers un objet de périphérique USB reçu par le pilote client lors d’un appel précédent au UfxDeviceCreate.
[in] unnamedParam2
Indicateur USBFN_DEVICE_STATE typé qui indique l’état du périphérique USB.
Valeur de retour
Aucun
Remarques
Le pilote client du contrôleur hôte de fonction inscrit son implémentation EVT_UFX_DEVICE_USB_STATE_CHANGE avec l’extension de classe de fonction USB (UFX) en appelant la méthode UfxDeviceCreate.
UFX appelle ce rappel d’événement pour informer le pilote client du nouvel état de l’appareil.
Le pilote client indique l’achèvement de cet événement en appelant la méthode UfxDeviceEventComplete.
Exemples
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();
}
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Windows |
version minimale de KMDF | 1.0 |
version minimale de UMDF | 2.0 |
d’en-tête | ufxclient.h |
IRQL | PASSIVE_LEVEL |