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:
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.
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.