다음을 통해 공유


WIA 미니드라이버 디버깅

WIA 드라이버는 WIA 서비스 프로세스 내에서 실행됩니다. 따라서 이러한 드라이버의 사용자 모드 디버깅을 수행하려면 디버거를 WIA 서비스에 연결해야 합니다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 이 항목에서는 두 가지 항목을 제공합니다. 자세한 내용은 Microsoft Windows SDK 설명서의 디버깅 서비스를 참조하세요.

디버거는 다음 두 가지 방법 중 하나로 시작할 수 있습니다.

  • 디버거에서 WIA 서비스를 자동으로 시작합니다.

  • 런타임에 적절한 프로세스에 디버거를 연결합니다.

미니 드라이버를 디버그할 때 다음 두 가지 사항에 유의하세요.

  1. 디버거 내에서 기호 및 기타 파일에 대한 네트워크 액세스가 필요한 경우 디버거에서 WIA 서비스를 자동으로 시작하면 표시되지 않을 수 있습니다. WIA는 Windows XP에서 LocalSystem 서비스로 실행되고 Microsoft Windows Server 2003 이상 운영 체제 버전에 대한 LocalService로 실행되며 네트워크에 액세스할 수 있는 적절한 권한이 없습니다. 따라서 컴퓨터가 네트워크의 모든 항목을 "볼" 수 있더라도 서비스를 실행하는 디버거가 수행할 수 없을 수 있습니다. WIA 서비스의 변경된 권한 수준에 대한 자세한 내용은 WIA 드라이버에 대한 보안 문제를 참조하세요.

  2. 드라이버의 STI 부분(예: IStiUSD::Initialize 중)을 로드하거나 초기화하는 동안 문제가 발생하는 경우 디버거가 연결될 때까지 오류가 이미 발생했으며 유용한 정보를 얻기에는 너무 늦었습니다. 이 문제의 일반적인 증상은 디바이스가 내 컴퓨터 폴더에 표시되지 않지만 장치 관리자 폴더에 표시된다는 것입니다.

디버거에서 WIA 서비스 시작

WIA 서비스가 시작되면 SCM(서비스 제어 관리자)은 서비스 제어 데이터베이스의 항목을 확인하고 해당 항목이 가리키는 실행 파일을 시작합니다. 디버거에서 WIA 서비스를 시작하는 간단한 방법은 해당 항목을 디버거를 포함하는 항목으로 바꾸는 것입니다. 항목은 레지스트리의 다음에서 찾을 수 있습니다.

HKLM\System\CurrentControlSet\Services\StiSvc\ImagePath

처음에 ImagePath 키는 다음 문자열 값으로 설정됩니다.

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

예를 들어 NTSD에서 WIA 서비스를 실행하려면 다음과 같이 이전 값을 수정합니다.

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

이 변경으로 WIA 서비스는 항상 NTSD에서 시작됩니다. 서비스가 이미 실행 중인 경우 이 변경 내용이 적용되기 전에 서비스를 중지하고 다시 시작해야 합니다. 자세한 내용은 스틸 이미지 서비스 시작 및 중지 를 참조하세요.

디버거 창을 표시하려면 다른 레지스트리 키도 변경해야 합니다. 이 레지스트리 키의 경로는 다음과 같습니다.

HKLM\System\CurrentControlSet\Services\StiSvc\Type

type 키의 초기 값인 0X20 디버거 창이 표시되지 않습니다. Type 키의 값을 0X120 DWORD 값으로 변경합니다.

런타임에 디버거 연결

대부분의 디버거는 프로세스가 이미 시작된 후 연결하기 위해 실행 중인 프로세스의 PID가 필요합니다. WIA는 svchost.exe라는 제네릭 호스팅 프로세스에서 실행되므로 올바른 svchost.exeinstance 찾는 것이 중요합니다.

Microsoft 사이트에서 디버거 패키지를 다운로드한 경우 tlist.exe라는 유틸리티 프로그램이 포함됩니다. Tlist.exe 실행 중인 모든 프로세스를 표시합니다. s 스위치를 사용하여 tlist.exe 실행하는 경우 이 유틸리티는 서비스를 호스팅하는 프로세스도 보여 줍니다. 예를 들어 tlist.exe -s 를 실행하면 다음과 유사한 출력이 생성됩니다.

   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

앞의 예제에서는 5개의 svchost.exe 인스턴스가 실행되고 있습니다. WIA 서비스인 StiSvc(스틸 이미지 서비스)는 PID가 1076인 svchost.exe instance 실행되고 있습니다. 디버거를 연결하여 1076을 처리하여 디버깅을 시작합니다.

tlist.exe 같은 유틸리티 프로그램을 사용하여 여러 svchost.exe 인스턴스의 단일 instance 식별하는 대신 svchost.exe 복사본을 만들고 이름을 바꿀 수 있습니다(예: stisvc.exe). 그런 다음, 서비스 컨트롤 항목의 ImagePath 값을 변경하여 이 svchost.exe 복사본(이름이 stisvc.exe)을 사용합니다. 예를 들어 경로가 인 키를 설정할 수 있습니다.

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

다음 문자열 값으로 바꿉니다.

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

WIA 서비스가 시작되면 svchost.exe대신stisvc.exe 에서 실행됩니다. stisvc.exe의 instance 하나만 있기 때문에 이 프로세스를 찾는 것이 더 간단합니다. PID를 찾기 위해 찾을 필요가 없습니다. 따라서 예를 들어 Microsoft Visual Studio를 사용하여 드라이버를 개발하는 경우 빌드 메뉴 아래의 디버그 시작 메뉴 항목으로 이동하여 프로세스에 연결...을 클릭하고 목록에서 stisvc.exe 선택할 수 있습니다.