O suporte para o Windows Vista Service Pack 1 (SP1) termina a 12 de julho de 2011. Para continuar a receber atualizações de segurança para o Windows, certifique-se de que está a executar o Windows Vista com o Service Pack 2 (SP2). Para obter mais informações, consulte esta página Web da Microsoft: O suporte está a terminar para algumas versões do Windows.

Origem: Suporte da Microsoft

PUBLICAÇÃO RÁPIDA

OS ARTIGOS DE PUBLICAÇÃO RÁPIDA FORNECEM INFORMAÇÕES DIRETAMENTE A PARTIR DA ORGANIZAÇÃO DE SUPORTE DA MICROSOFT. AS INFORMAÇÕES AQUI CONTIDAS SÃO CRIADAS EM RESPOSTA A TÓPICOS EMERGENTES OU EXCLUSIVOS OU DESTINAM-SE A COMPLEMENTAR OUTRAS INFORMAÇÕES DA BASE DE DADOS DE CONHECIMENTO.

Sintoma

Quando Desativar um dispositivo USB atualmente Inativo, poderá receber uma mensagem de erro "Parar 0x44" num ecrã azul. Esta mensagem de erro assemelha-se ao seguinte: STOP 0x00000044 ( parameter1 , parameter2 , parameter3 , parameter4 ) MULTIPLE_IRP_COMPLETE_REQUESTS

Causa

Este problema poderá ocorrer se o dispositivo USB utilizar um controlador escrito com a versão 1.7 ou anterior do Kernel Mode Driver Framework (KMDF).O problema ocorre quando o dispositivo USB está no estado Inativo (Suspensão Seletiva USB) e, em seguida, o dispositivo é Desativado (por exemplo, ao clicar com o botão direito do rato no dispositivo no Gestor de Dispositivos e clicar em Desativar).Nestas condições, a versão 1.7 (ou anterior) da arquitetura KMDF não aguarda que os Irps de Suspensão Seletiva USB sejam concluídos, permitindo assim que a pilha do dispositivo seja removida antes de o Irp de Suspensão Seletiva USB ser concluído (por exemplo, pelo controlador Usbhub).

Resolução

Este problema é resolvido na versão 1.9 e posterior do Kernel Mode Driver Framework (KMDF).  A versão 1.9 do Kernel Mode Driver Framework (KMDF) está disponível na versão do Windows 7 do Windows Driver Kit (WDK).Um programador de controlador de dispositivo USB baseado em KMDF pode contornar este problema ao realizar as seguintes ações:

  1. Registe uma rotina de chamada de retorno EvtDeviceReleaseHardware na rotina de chamada de retorno EvtDriverDeviceAdd do controlador.

  2. Aloque um objeto WDFWORKITEM na rotina de chamada de retorno EvtDriverDeviceAdd do controlador.

  3. Aloque e inicialize um objeto KEVENT, coloque o item de trabalho em fila na rotina de chamada de retorno EvtDeviceReleaseHardware do controlador, transmitindo este evento como o parâmetro De contexto e aguarde que o evento seja sinalizado.

  4. Na rotina de chamada de retorno do item de trabalho, atrase o thread em aproximadamente 2 segundos e, em seguida, defina o evento.  O valor de atraso exato necessário pode diferir entre sistemas e deve ser testado antes da implementação final.

A solução descrita tem dois efeitos principais:

  • Coloca em fila um item de trabalho que ajuda a atrasar a demolição da pilha do dispositivo até que a fila do item de trabalho seja drenada até este item de trabalho (uma vez que a pilha de núcleo USB pode concluir o Irp de Suspensão Seletiva USB através de um item de trabalho).

  • Introduz um atraso no caso de o item de trabalho da pilha de núcleo USB e o item de trabalho do controlador ser executados simultaneamente em sistemas multiprodutor/multi-núcleo.

NOTA: esta não é uma solução abrangente.  Só ajuda a mitigar o problema.

Mais Informações

Os fragmentos de código de exemplo abaixo ilustram como implementar esta solução: EvtDriverDeviceAdd( In WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) { PWORKER_ITEM_CONTEXT context;    WDF_OBJECT_ATTRIBUTES atributos;    WDF_WORKITEM_CONFIG workitemConfig;    WDFWORKITEM workItem;    ...    // Definir chamada de retorno EvtDeviceReleaseHardware // ...    pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware;    WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);    ...    // Alocar 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);    se (! NT_SUCCESS(estado)) { estado de retorno;    } devContext->WorkItem = workItem;    ...}NTSTATUSEvtDeviceReleaseHardware( IN WDFDEVICE Device, IN WDFCMRESLIST ResourcesTranslated ){ KEVENT event;    PWORKER_ITEM_CONTEXT contexto;    WDFWORKITEM workItem;     UNREFERENCED_PARAMETER(ResourcesTranslated);    workItem = GetDeviceContext(Device)->WorkItem;    context = GetWorkItemContext(workItem);        KeInitializeEvent(evento &, NotificationEvent, FALSE);    evento context->= &evento;    // Colocar em fila o workitem // WdfWorkItemEnqueue(workItem);      // Aguarde que o workitem sinalize o 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);    // Atrase o thread durante 2 segundos // intervalo. QuadPart = -2 * 10 * 1000 * 1000;    KeDelayExecutionThread(KernelMode, FALSE, intervalo de &);    // sinalize o thread 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;     

EXCLUSÃO DE RESPONSABILIDADE

A MICROSOFT E/OU OS RESPETIVOS FORNECEDORES NÃO FORNECEM QUAISQUER REPRESENTAÇÕES OU GARANTIAS RELATIVAMENTE À ADEQUAÇÃO, FIABILIDADE OU EXATIDÃO DAS INFORMAÇÕES CONTIDAS NOS DOCUMENTOS E NOS GRÁFICOS RELACIONADOS PUBLICADOS NESTE SITE (OS "MATERIAIS") PARA QUALQUER FINALIDADE. OS MATERIAIS PODERÃO INCLUIR IMPRECISÕES TÉCNICAS OU ERROS TIPOGRÁFICOS, PODENDO SER REVISTOS EM QUALQUER MOMENTO SEM AVISO PRÉVIO.ATÉ À EXTENSÃO MÁXIMA PERMITIDA PELA LEI APLICÁVEL, A MICROSOFT E/OU OS RESPETIVOS FORNECEDORES EXCLUEM TODAS AS REPRESENTAÇÕES, GARANTIAS E CONDIÇÕES EXPRESSAS, IMPLÍCITAS OU ESTATUTÁRIAS, INCLUINDO, MAS NÃO SE LIMITANDO A REPRESENTAÇÕES, GARANTIAS OU CONDIÇÕES DE TÍTULO, NÃO INFRAÇÃO, CONDIÇÃO OU QUALIDADE SATISFATÓRIA, COMERCIALIZAÇÃO E ADEQUAÇÃO A UM FIM ESPECÍFICO, NO QUE DIZ RESPEITO AOS MATERIAIS.

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.