EVT_UFX_DEVICE_USB_STATE_CHANGE función de devolución de llamada (ufxclient.h)
Implementación del controlador cliente para actualizar el estado del dispositivo USB.
Sintaxis
EVT_UFX_DEVICE_USB_STATE_CHANGE EvtUfxDeviceUsbStateChange;
void EvtUfxDeviceUsbStateChange(
[in] UFXDEVICE unnamedParam1,
[in] USBFN_DEVICE_STATE unnamedParam2
)
{...}
Parámetros
[in] unnamedParam1
Identificador de un objeto de dispositivo USB que el controlador cliente recibió en una llamada anterior a UfxDeviceCreate.
[in] unnamedParam2
Marca de tipo USBFN_DEVICE_STATE que indica el estado del dispositivo USB.
Valor devuelto
None
Observaciones
El controlador de cliente para el controlador host de función registra su implementación de EVT_UFX_DEVICE_USB_STATE_CHANGE con la extensión de clase de función USB (UFX) llamando al método UfxDeviceCreate .
UFX invoca esta devolución de llamada de evento para informar al controlador cliente sobre el nuevo estado del dispositivo.
El controlador cliente indica la finalización de este evento llamando al método UfxDeviceEventComplete .
Ejemplos
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();
}
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Windows |
Versión mínima de KMDF | 1.0 |
Versión mínima de UMDF | 2.0 |
Encabezado | ufxclient.h |
IRQL | PASSIVE_LEVEL |