El soporte técnico para Windows Vista Service Pack 1 (SP1) finaliza el 12 de julio de 2011. Para seguir recibiendo actualizaciones de seguridad para Windows, asegúrese de ejecutar Windows Vista with Service Pack 2 (SP2). Para obtener más información, consulta esta página web de Microsoft: el soporte está finalizando para algunas versiones de Windows.

Fuente: Soporte técnico de Microsoft

PUBLICACIÓN RÁPIDA

LOS ARTÍCULOS DE PUBLICACIÓN RÁPIDA PROPORCIONAN INFORMACIÓN DIRECTAMENTE DESDE LA ORGANIZACIÓN DE SOPORTE TÉCNICO DE MICROSOFT. LA INFORMACIÓN CONTENIDA EN ESTE DOCUMENTO SE CREA EN RESPUESTA A TEMAS EMERGENTES O ÚNICOS, O ESTÁ PENSADA PARA COMPLEMENTAR OTRA INFORMACIÓN DE KNOWLEDGE BASE.

 Síntoma

Al deshabilitar un dispositivo USB que está actualmente inactivo, es posible que reciba un mensaje de error "Detener 0x44" en una pantalla azul. Este mensaje de error es similar al siguiente: STOP 0x00000044 ( parámetro1 , parámetro2 , parámetro3, parámetro4 ) MULTIPLE_IRP_COMPLETE_REQUESTS

Causa

Este problema puede ocurrir si el dispositivo USB usa un controlador escrito con el Marco de controladores de modo kernel (KMDF) versión 1.7 o anterior.El problema se produce cuando el dispositivo USB está en estado inactivo (Suspensión selectiva USB) y el dispositivo se deshabilita (por ejemplo, haciendo clic con el botón derecho en el dispositivo en Administrador de dispositivos y haciendo clic en Deshabilitar).En estas condiciones, la versión 1.7 (o anterior) del marco KMDF no espera a que se completen las Irps de suspensión selectiva USB, lo que permite quitar la pila de dispositivos antes de que se complete el Irp de suspensión selectiva USB (por ejemplo, por el controlador usbhub).

Solución

Este problema se resuelve en la versión 1.9 y posteriores del Marco de controladores del modo kernel (KMDF).  El marco de controladores de modo kernel (KMDF) versión 1.9 está disponible en la versión de Windows 7 del Kit de controladores de Windows (WDK).Un desarrollador de controladores de dispositivo USB basado en KMDF puede solucionar este problema realizando las siguientes acciones:

  1. Registra una rutina de devolución de llamada de EvtDeviceReleaseHardware en la rutina de devolución de llamada EvtDriverDeviceAdd del conductor.

  2. Asignar un objeto WDFWORKITEM en la rutina de devolución de llamada EvtDriverDeviceAdd del controlador.

  3. Asignar e inicializar un objeto KEVENT, poner en cola el elemento de trabajo en la rutina de devolución de llamada de EvtDeviceReleaseHardware del controlador, pasar este evento como parámetro Context y esperar a que se señale el evento.

  4. En la rutina de devolución de llamada de elemento de trabajo, retrase el subproceso aproximadamente 2 segundos y, a continuación, establezca el evento.  El valor de retraso exacto requerido puede diferir entre los sistemas y debe probarse antes de la implementación final.

La solución alternativa descrita tiene dos efectos principales:

  • Pone en cola un elemento de trabajo que ayuda a retrasar el desgarro de la pila de dispositivos hasta que la cola de elementos de trabajo se agote hasta este elemento de trabajo (ya que la pila de núcleos USB puede completar el Irp de suspensión selectiva USB a través de un elemento de trabajo).

  • Introduce un retraso en caso de que el elemento de trabajo de la pila de núcleos USB y el elemento de trabajo del controlador se ejecuten simultáneamente en sistemas multiprocesador/varios núcleos.

NOTA: Esta no es una solución completa.  Solo ayuda a mitigar el problema.

Más información

Los fragmentos de código de ejemplo siguientes muestran cómo implementar esta solución alternativa:EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT contexto;    WDF_OBJECT_ATTRIBUTES atributos;    WDF_WORKITEM_CONFIG workitemConfig;    WDFWORKITEM workItem;    ...    // Set EvtDeviceReleaseHardware callback // ...    pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware;    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);    ...    // Asignar WDFWORKITEM // WDF_OBJECT_ATTRIBUTES_INIT(atributos &);    WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(atributos &,WORKER_ITEM_CONTEXT);    atributos. ParentObject = dispositivo;    WDF_WORKITEM_CONFIG_INIT(&workitemConfig, EvtWorkItem);    status = WdfWorkItemCreate(&workitemConfig, atributos &, &workItem);    if (! NT_SUCCESS(estado)) { estado de devolución;    } devContext->WorkItem = workItem;    ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ evento KEVENT;    PWORKER_ITEM_CONTEXT contexto;    WDFWORKITEM workItem;     UNREFERENCED_PARAMETER(ResourcesTranslated);    workItem = GetDeviceContext(Device)->WorkItem;    context = GetWorkItemContext(workItem);        KeInitializeEvent(&evento, NotificationEvent, FALSE);    context->Event = &evento;    // Poner en cola el elemento de trabajo // WdfWorkItemEnqueue(workItem);      // Espera a que workitem señale el evento // KeWaitForSingleObject(&evento, Executive, KernelMode, FALSE, NULL);    devolver STATUS_SUCCESS;}VOIDEvtWorkItem( IN WDFWORKITEM WorkItem ){ PWORKER_ITEM_CONTEXT contexto;    intervalo de LARGE_INTEGER;    context = GetWorkItemContext(WorkItem);    // Retrasar la rosca durante 2 segundos // intervalo. QuadPart = -2 * 10 * 1000 * 1000;    KeDelayExecutionThread(KernelMode, FALSE, intervalo de &);    // señale el hilo de espera // KeSetEvent(context->Event, IO_NO_INCREMENT, FALSE);    context->Event = NULL;}in header filetypedef struct _WORKER_ITEM_CONTEXT { PKEVENT Event;} WORKER_ITEM_CONTEXT, * PWORKER_ITEM_CONTEXT;WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WORKER_ITEM_CONTEXT, GetWorkItemContext)EVT_WDF_DEVICE_RELEASE_HARDWARE EvtDeviceReleaseHardware;EVT_WDF_WORKITEM EvtWorkItem;     

DECLINACIÓN DE RESPONSABILIDADES

NI MICROSOFT NI SUS PROVEEDORES GARANTIZAN LA IDONEIDAD, FIABILIDAD O EXACTITUD DE LA INFORMACIÓN CONTENIDA EN LOS DOCUMENTOS Y GRÁFICOS RELACIONADOS PUBLICADOS EN ESTE SITIO WEB (LOS "MATERIALES") PARA CUALQUIER PROPÓSITO. LOS MATERIALES PUEDEN CONTENER IMPRECISIONES TÉCNICAS O ERRORES TIPOGRÁFICOS Y PUEDEN MODIFICARSE EN CUALQUIER MOMENTO SIN PREVIO AVISO.EN LA MÁXIMA MEDIDA PERMITIDA POR LA LEGISLACIÓN APLICABLE, MICROSOFT Y/O SUS PROVEEDORES RENUNCIAN Y EXCLUYEN TODAS LAS REPRESENTACIONES, GARANTÍAS Y CONDICIONES, EXPRESAS, IMPLÍCITAS O ESTATUTARIAS, INCLUIDAS, ENTRE OTRAS, LAS REPRESENTACIONES, GARANTÍAS O CONDICIONES DE TÍTULO, AUSENCIA DE INFRACCIÓN, CONDICIÓN SATISFACTORIA O CALIDAD, COMERCIABILIDAD Y IDONEIDAD PARA UN FIN PARTICULAR, CON RESPECTO A LOS MATERIALES.

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.