Depuração do minidriver WIA

Os drivers WIA são executados dentro do processo de serviço WIA. Portanto, para executar a depuração em 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 os serviços de depuração na documentação do SDK do Windows para obter informações adicionais).

Seu depurador pode ser iniciado de duas maneiras:

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

  • Anexando o depurador ao processo adequado durante a execução.

Mantenha os seguintes dois pontos 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. 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 do driver ou a inicialização da parte de STI do driver (por exemplo, durante IStiUSD::Initialize), o erro já terá ocorrido quando um depurador for anexado, e será 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 como 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 sob 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. Veja Iniciando e Parando o Serviço de Imagem Fixa para 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 requer 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, encontrar a instância correta de svchost.exe é essencial.

Se você baixou o pacote do depurador do site da Microsoft, ele inclui 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, a execução detlist.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 desvchost.exe cujo PID é 1076. Anexe o depurador ao processo 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 desvchost.exe , você pode fazer uma cópia de svchost.exe e renomeá-la (por exemplo, stisvc.exe). Em seguida, altere o valor do 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 de stisvc.exe. Você não precisa procurar o PID para encontrá-lo. Assim, 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.