윈도우 디바이스 드라이버 청강문화산업대 컴퓨터정보과 이 봉 석 교수
Chapter 2. 세상에서 가장 간단한 디바이스드라이버 작성하기
문맥의 의미 윈도우의 소프트웨어모듈활용에 대한 대전제 “재활용할 수 있는 소프트웨어 모듈은 반드시 재활용한다” 문맥이란 CONTEXT 를 의미한다 “코드(Code)는 공유하고 데이터(Data)는 각각 사용하는 목적에 맞도록 사용하게 하기 위하여 이를 관리하기 위한 핸들 혹은 구분자역할을 담당한다”
DEVICE_OBJECT와 DeviceExtension
DeviceExtension의 응용 Device Object(A:) Device Extension Device Object(B:) IOPort = XXX Controller Context ControllerContext
SIMPLE 드라이버와 구성파일
드라이버생성을 위한 환경창열기
환경창의 환경변수정의
환경창에서 드라이버 빌드하기
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치작업
드라이버설치결과 확인
드라이버설치결과 확인
드라이버설치결과 확인
드라이버설치결과 확인
드라이버설치결과 확인
드라이버설치결과 확인
드라이버설치결과 확인
드라이버설치결과 확인
Chapter 4. 디바이스 스택 (Device Stack)
버스구조의 추상적인 모습 Mouse CPU MEMORY Root Hub USB Host Network Card PCI BUS PCMCIA Controller PCI Bridge MEMORY PCI BUS Network Card USB Host Root Hub Mouse PCI BUS는 USB Host Controller 를 구동시킨다 USB Host Controller는 Root Hub를 구동시킨다 Root Hub는 연결된 Mouse 를 구동시킨다
USB Host Controller와 RootHub PDO Root Hub PDO Root Hub Root Hub USB Host Controller Driver(DriverObject) USB Host Controller USB Host Controller FDO
USB Host Controller와 RootHub PDO FDO Root Hub PCI Bus Network Card Audio Chip IDE Controller PCMCIA Controller DeviceStack
장치관리자의 연결순서별 보기 307-00 ACPI 다중 프로세서 PC Microsoft ACPI- Compliant System PCI 버스 Intel® 82801G … USB Host Controller USB 루트 허브 USB 휴먼 인터페이스 장치 HID 규격 마우스
디바이스스택과 연결순서별 보기의 비교 307-00 ACPI 다중 프로세서 PC Microsoft ACPI- 디바이스스택과 연결순서별 보기의 비교 PCI PDO 307-00 ACPI 다중 프로세서 PC Microsoft ACPI- Compliant System PCI 버스 Intel® 82801G … USB Host Controller USB 루트 허브 USB 휴먼 인터페이스 장치 HID 규격 마우스 PCI FDO UHost PDO UHost FDO USBHUB PDO USBHUB FDO USBHID PDO USBHID FDO HIDMOUSE PDO HIDMOUSE FDO HIDMOUSE FiDO PCI.SYS USBUHCI.SYS USBHUB.SYS HIDUSB.SYS ACPI.SYS MOUHID.SYS MOUCLASS.SYS
Microsoft UAA BusDriver For High Definition Audio PCI버스를 부모로 하는 모습 PCI PDO 307-00 ACPI 다중 프로세서 PC Microsoft ACPI- Compliant System PCI 버스 Intel® 82801G … USB Host Controller PCI FDO UHost PDO UHost FDO PCI.SYS USBUHCI.SYS ACPI.SYS Microsoft UAA BusDriver For High Definition Audio UAA BusDriver PDO UAA BusDriver FDO HDAUDBUS.SYS
“모뎀”장치와 장치인스턴스ID
서비스와 장치하위필터
“모뎀”과 디바이스스택 MODEM.SYS TOSHIBA Software Modem AMR FDO TOSHIBA Software Modem AMR FiDO TOSHIBASOFTMODEM.SYS TOSHIBA Software Modem AMR PDO PCI.SYS
“모뎀”과 시스템레지스트리 클래스상위필터
“모뎀”과 시스템레지스트리 클래스하위필터들
“다른종류”의 디바이스스택과 구성요소 제공되는 장치상위필터 ???서비스드라이버 “다른종류”의 디바이스스택과 구성요소 BusDriver Physical Device Object(PDO) Class LowerFilter Device Object(FiDO) PxHelp20 서비스드라이버 BsStor서비스드라이버 PFC서비스드라이버 기능층 Functional Device Object(FDO) ???서비스드라이버 설치파일에 의해서 제공되는 장치하위필터 제공되는 장치상위필터
“모뎀”과 시스템레지스트리 설치파일에서 기능층서비스드라이버를 제공하지 않는 경우에 사용되는 디폴트 서비스드라이버가 명시되어 있다
“PS/2 키보드”과 디바이스스택 KBDCLASS서비스드라이버 Class UpperFilter Device Object(FiDO) KBDCLASS서비스드라이버 기능층 Functional Device Object(FDO) i8042prt서비스드라이버 BusDriver Physical Device Object(PDO) ACPI서비스드라이버
“PS/2 키보드”과 디바이스스택 BusDriver Physical Device Object(PDO) 기능층 Functional Device Object(FDO) i8042prt서비스드라이버 Class UpperFilter Device Object(FiDO) ACPI서비스드라이버 KBDCLASS서비스드라이버 StackSize = 3 StackSize = 6 StackSize = 7 AttachedDevice NULL FDO->StackSize값이 PDO->StackSize값보다 크기만 하면 된다. 그 차이값은 중요하지 않다!
“PS/2 키보드”발견과 디바이스스택구성순서 BusDriver Physical Device Object(PDO) ACPI서비스드라이버 StackSize = 1 AttachedDevice NULL ACPI 버스 PS/2 컨트롤러(주포트)발견 ACPI버스드라이버 PDO 생성 PNP관리자(OS) PNP관리자에게 PDO 전달 시스템레지스트리(하드웨어키) 레지스트리정보획득 1 2 3 4 디바이스스택을 구성하기 위한 상위드라이버호출준비
“PS/2 키보드”발견과 디바이스스택구성순서 PNP관리자(OS) 디바이스스택구성을 위한 드라이버호출순서결정 시스템레지스트리 기능층서비스드라이버(i8042prt)를 먼저 호출해야한다! 클래스상위필터서비스드라이버(KBDCLASS)를 그다음 호출해야 한다! I8042prt서비스드라이버’s AddDevice()함수 KBDCLASS서비스드라이버’s AddDevice()함수 1 먼저 호출한뒤, 2 그다음 호출한다
“PS/2 키보드”발견과 디바이스스택구성순서 PNP관리자(OS) I8042prt서비스드라이버’s AddDevice()함수 BusDriver Physical Device Object(PDO) ACPI서비스드라이버 StackSize = 1 AttachedDevice 기능층 Functional Device Object(FDO) i8042prt서비스드라이버 StackSize = 2 DeviceObject생성 DeviceObject연결 NULL StackSize값 변경 1 2 3
“PS/2 키보드”발견과 디바이스스택구성순서 PNP관리자(OS) KBDCLASS서비스드라이버’s AddDevice()함수 BusDriver Physical Device Object(PDO) ACPI서비스드라이버 StackSize = 1 AttachedDevice 기능층 Functional Device Object(FDO) i8042prt서비스드라이버 StackSize = 2 DeviceObject생성 1 Class UpperFilter Device Object(FiDO) KBDCLASS서비스드라이버 StackSize = 3 NULL FDO와의 연결 2 3 StackSize 변경작업
SIMPLE 장치를 위한 디바이스스택 SIMPLE Functional Device Object(FDO) BusDriver Physical Device Object(PDO)
SIMPLE 디바이스스택 확인작업 PDO FDO StackSize
키보드 디바이스스택 확인작업 ACPI버스드라이버 PDO FDO FiDO(Class)
디스크 디바이스스택 확인작업 버스드라이버 PDO 주서비스 FDO 클래스상위필터 FiDO
디스크 디바이스스택 확인작업 ATAPI버스드라이버 PDO ??? FDO FiDO
ACPI가 개입된 디바이스스택의 특수성 NULL PARTMGR 서비스드라이버가 생성한 FiDO DISK 서비스드라이버가 생성한 FDO NULL ACPI 서비스드라이버가 생성한 FiDO ACPI 서비스드라이버가 생성한 FiDO ATAPI 버스드라이버가 생성한 PDO ATAPI 버스드라이버가 생성한 PDO 생성된 디스크드라이브DeviceStack 해제된 디스크드라이브DeviceStack