Partilhar via


Depuração do minidriver WIA

Os drivers WIA são executados dentro do processo de serviço WIA. Portanto, para executar a depuração do modo de usuário desses drivers, você deve conectar o depurador ao serviço WIA. Há várias maneiras diferentes de fazer isso; este tópico apresenta dois deles. (Consulte Serviços de Depuração na documentação do SDK do Microsoft Windows para obter informações adicionais).

Seu depurador pode ser iniciado de duas maneiras:

  • Iniciar automaticamente o serviço WIA em um depurador.

  • Anexando o depurador ao processo apropriado em tempo de execução.

Tenha os dois pontos a seguir em mente ao depurar seu minidriver:

  1. Se você precisar de acesso de rede a símbolos e outros arquivos de dentro do depurador, eles poderão não estar visíveis se você iniciar automaticamente o serviço WIA no depurador. O WIA é executado como um serviço LocalSystem no Windows XP e como um LocalService para o Microsoft Windows Server 2003 e versões posteriores do sistema operacional e não tem os privilégios apropriados para acessar a rede. Portanto, mesmo que seu computador possa "ver" tudo em sua rede, o depurador que executa o serviço pode não ser capaz de fazer isso. Para obter mais informações sobre o nível de privilégio alterado do serviço WIA, consulte Problemas de segurança para drivers WIA.

  2. Se ocorrer um problema durante o carregamento ou inicialização do driver da parte de STI do driver (por exemplo, durante IStiUSD::Initialize), quando um depurador é anexado, o erro já ocorreu e é tarde demais para obter informações úteis. Um sintoma comum desse problema é que o dispositivo não aparece na pasta Meu Computador, mas aparece na pasta Gerenciador de Dispositivos.

Iniciando o serviço WIA em um depurador

Quando o serviço WIA é iniciado, o SCM (gerenciador de controle de serviço) examina a entrada no banco de dados de controle de serviço e inicia o arquivo executável apontado por essa entrada. Uma maneira simples de iniciar o serviço WIA em um depurador é substituir essa entrada por uma que inclua o depurador. A entrada pode ser encontrada no registro em:

HKLM\System\CurrentControlSet\Services\StiSvc\ImagePath

Inicialmente, a chave ImagePath é definida com o seguinte valor de cadeia de caracteres:

"%SystemRoot%\System32\svchost.exe -k imgsvc"

Para executar o serviço WIA em NTSD, por exemplo, modifique o valor anterior da seguinte maneira:

"ntsd -g -G %SystemRoot%\System32\svchost.exe -k imgsvc"

Com essa alteração, o serviço WIA sempre é iniciado em NTSD. Observe que, se o serviço já estiver em execução, ele deverá ser interrompido e reiniciado antes que essa alteração entre em vigor. Consulte Iniciando e parando o Serviço de Imagem Parada para obter detalhes.

Para tornar a janela do depurador visível, você também precisa alterar outra chave do Registro. O caminho para essa chave do Registro é:

HKLM\System\CurrentControlSet\Services\StiSvc\Type

O valor inicial da chave Type , 0X20, impede que a janela do depurador seja exibida. Altere o valor da chave Type para o valor DWORD 0X120.

Anexando o depurador em tempo de execução

A maioria dos depuradores exige o PID do processo em execução para anexá-lo após o processo já ter sido iniciado. Como o WIA é executado em um processo de hospedagem genérico chamado svchost.exe, localizar a instância correta do svchost.exe é essencial.

Se você baixou o pacote do depurador do site da Microsoft, ele incluirá um programa utilitário chamado tlist.exe. Tlist.exe exibe todos os processos em execução. Se você executar tlist.exe usando a opção s, esse utilitário também mostrará quais processos estão hospedando quais serviços. Por exemplo, executar tlist.exe -s produz uma saída semelhante à seguinte:

   0 System Process
   4 System
 160 smss.exe
 216 csrss.exe       Title:
 208 winlogon.exe    Title: NetDDE Agent
 268 services.exe    Svcs:  Eventlog,PlugPlay
 280 lsass.exe       Svcs:  Netlogon,PolicyAgent,ProtectedStorage,SamSs
 416 svchost.exe     Svcs:  RpcSs
 444 svchost.exe     Svcs:  AudioSrv,CryptSvc,Dhcp,EventSystem,FastUserSwitching,CompatibilityServices,helpsvc,Irmon,lanmanserver,lanmanworkstation,Netman,Nla,Schedule,SENS,ShellHWDetection,srservice,TapiSrv,TermService,ThemeService,uploadmgr,W32Time,winmgmt,WmdmPmSp
 504 svchost.exe     Svcs:  Dnscache
 372 svchost.exe     Svcs:  LmHosts,Messenger,RemoteRegistry,SSDPSRV,WebClient
 616 spoolsv.exe     Svcs:  Spooler
 680 inojobsv.exe    Svcs:  Cheyenne InocuLAN Anti-Virus Server
 700 emsvc.exe       Svcs:  EMSVC
 912 fxssvc.exe      Svcs:  Fax
 192 explorer.exe    Title: Program Manager
1076 svchost.exe     Svcs:  stisvc
22824 tlist.exe

No exemplo anterior, cinco instâncias de svchost.exe estão em execução. O serviço WIA, StiSvc (serviço Still Image), está em execução na instância svchost.exe cujo PID é 1076. Anexe o depurador para processar o 1076 para iniciar a depuração.

Em vez de usar um programa utilitário, como tlist.exe, para identificar uma única instância de várias instâncias svchost.exe , você pode fazer uma cópia de svchost.exe e renomeá-la (por exemplo, stisvc.exe). Em seguida, altere o valor imagepath da entrada de controle de serviço para usar essa cópia de svchost.exe (aquela cujo nome agora está stisvc.exe). Por exemplo, você pode definir a chave cujo caminho é

HKLM\System\CurrentControlSet\Control\Services\Stisvc\ImagePath

para o seguinte valor de cadeia de caracteres:

%SystemRoot%\System32\stisvc.exe -k imgsvc"

Quando o serviço WIA é iniciado, ele é executado em stisvc.exe em vez de svchost.exe. Encontrar esse processo é mais simples, pois há apenas uma única instância do stisvc.exe. Você não precisa procurar o PID para encontrá-lo. Portanto, por exemplo, se você estiver desenvolvendo o driver usando o Microsoft Visual Studio, poderá acessar o item de menu Iniciar Depuração no menu Compilar , clicar em Anexar ao Processo... e selecionar stisvc.exe na lista.