ISLab Flash Team Ch 9 Hardware Initialization Ch
ISLab Flash Team Ch 9. Hardware Initialization Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
Contents 1. 2. 3. 4. 5. 6. 7. 8. Plug and Play Architecture The Role of the Registry for Legacy Drivers Detecting Devices with Plug and Play The Role of Driver Layers in Plug and Play New WDM IRP Dispatch Functions Device Enumeration Device Interface Summary ISLab Flash Team Ch 6. 초기화 및 정리 루틴 2 Made By Povolon
ISLab Flash Team 1. Plug and Play Architecture 2. The Role of the Registry for Legacy Driver Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
Goals of Plug and Play • Automatic detection of installed and removed hardware. • Device must allow for software configuration • Automatically load as needed by the OS • Support Hot plugging of device ISLab Flash Team Ch 6. 초기화 및 정리 루틴 4 Made By Povolon
Components of Plug and Play Setup & Config Component Pn. P Mgr User Mode Kernel Mode I/O Mgr Pn. P Mgr Power Mgr Registry & INF Files Executive WDM Drivers NT Pn. P Drivers HAL ISLab Flash Team Ch 6. 초기화 및 정리 루틴 5 Made By Povolon
ISLab Flash Team 3. Detecting Devices with Plug and Play 4. The Role of Driver Layers in Plug and Play Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
Detecting Devices with Plug and Play • Driver. Entry는 초기 진입점 이지만, 드라이버 내의 다른 루틴의 주소 만 알려주는 역할을 함 -> 나머지는 Add. Device에서 생성 • Funtion Prototype for an Add. Device Routine NTSTATUS Add. Device IRQL == PASSIVE_LEVEL Parameter Description IN PDRIVER_OBJECT p. Driver. Object Pointer to Driver Object IN PDEVICE_OBJECT pdo Pointer to Physical Device Object Return value • STATUS_SUCCESS • STATUS_XXX – some error code ISLab Flash Team Ch 6. 초기화 및 정리 루틴 8 Made By Povolon
The Role of Driver Layers in Plug and Play Nunbu s FDO Device PDO Filter DO FDO … Filter DO … Nunbu s FDO PDO Device Stack ISLab Flash Team Ch 6. 초기화 및 정리 루틴 10 Made By Povolon
Add. Device Routine을 호출하는 알고리즘 1. 2. 3. 4. System Registry에 있는 모든 버스를 탐색 , 열거 버스 드라이버가 load 버스에 존재하는 디바이스 열거 및 PDO 생성 드라이버를 정의한 Registry에서 Filter DO 와 FDO를 위한 Device Class를 찾음 5. Filter Driver나 Function Driver가 Load되지 않았으면 Driver를 load하고 Driver. Entry호출 6. FDO및 다른 디바이스 계층을 위한 Add. Device를 호출 디바이스 스택 구성 (Io. Create. Device , Io. Attach. Device. To. Device. Stack) ISLab Flash Team Ch 6. 초기화 및 정리 루틴 11 Made By Povolon
Device Stack • Funtion Prototype for Io. Attach. Device. To. Device. Stack PDEVICE_OBJECT Io. Attach. Device. To. Device. Stack IRQL == PASSIVE_LEVEL Parameter Description IN PDEVICE_OBJECT p. This. Device Push할 DO pointer IN PDEVICE_OBJECT pdo Pointer to Physical Device Object Return value Top에 있는 DO pointer • • • 디바이스 스택의 요소는 각 드라이버의 디바이스 Extension구조체 에 연관관계를 유지 or pointer공간을 예약 하위 디바이스가 초기화 하는 동안 상위 디바이스 포인터는 하위 디 바이스가 알려진 디바이스 타입이어야 안정적인 초기화가 가능함 디바이스 스택에서는 어떤 드라이버도 자신의 하위 드라이버보다 우 선할 수 없다 ISLab Flash Team Ch 6. 초기화 및 정리 루틴 12 Made By Povolon
Add. Device NTSTATUS Add. Device ( IN PDRIVER_OBJECT p. Driver. Object, IN PDEVICE_OBJECT pdo ) { NTSTATUS status; PDEVICE_OBJECT pfdo; PDEVICE_EXTENSION p. Dev. Ext; static int ul. Device. Number = 0; // 내부 디바이스 이름 초기화 CUString dev. Name("\Device\MINPNP"); dev. Name += CUString(ul. Device. Number); // 새로운 디바이스 객체 생성 status = Io. Create. Device( p. Driver. Object, sizeof(DEVICE_EXTENSION), &(UNICODE_STRING)dev. Name, FILE_DEVICE_UNKNOWN, 0, FALSE, &pfdo ); if (!NT_SUCCESS(status)) return status; // Device Extension 초기화 p. Dev. Ext = (PDEVICE_EXTENSION)pfdo->Device. Extension; p. Dev. Ext->p. Device = pfdo; // back pointer p. Dev. Ext->Device. Number = ul. Device. Number; p. Dev. Ext->ustr. Device. Name = dev. Name; p. Dev. Ext->p. Int. Obj = NULL; p. Dev. Ext->b. Interrupt. Expected = FALSE; p. Dev. Ext->state = Stopped; Ch 6. 초기화 및 정리 루틴 ISLab Flash Team 13 Made By Povolon
Add. Device(Cont. ) // 새로 생성한 fdo를 스택 레이어의 맨 위에 쌓는다 (Push) p. Dev. Ext->p. Lower. Device = // downward pointer Io. Attach. Device. To. Device. Stack( pfdo, pdo); // // // 상위 디바이스 객체의 포인터를 초기화 하기 위하여 상위 디바이스의 오프셋을 알아내고 하위 디바이스 익스텐션의 형변환을 수행 PLOWER_DEVEXT p. Lower. Dev. Ext = (PLOWER_DEVEXT) p. Dev. Ext->p. Lower. Device->Device. Extension; p. Lower. Dev. Ext->p. Upper. Device = pfdo; // Symbolic Link Name의 초기화 및 생성 CUString sym. Link. Name("\? ? \MPNP"); sym. Link. Name += CUString(ul. Device. Number+1); // 1 부터 시작함 p. Dev. Ext->ustr. Sym. Link. Name = sym. Link. Name; status = Io. Create. Symbolic. Link( &(UNICODE_STRING)sym. Link. Name, &(UNICODE_STRING)dev. Name ); if (!NT_SUCCESS(status)) { // 생성에 실패하면 디바이스 객체를 삭제 Io. Delete. Device( pfdo ); return status; } // 완료 return STATUS_SUCCESS; } ISLab Flash Team Ch 6. 초기화 및 정리 루틴 14 Made By Povolon
ISLab Flash Team 5. The New WDM IRP Dispatch Function Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
IRP Minor subcode • Major Function Dispatch Routine p. Driver. Object->Major. Fuction[ IRP_MJ_PNP ] = Disp. Pnp; • Minor Function Dispatch Routine NTSTATUS Disp. Pnp ( IN PDEVICE_OBJECT p. DO, IN PIRP p. Irp // IRP Stack location을 획득 ( Indexing ) PIO_STACK_LOCATION p. Irp. Stack; p. Irp. Stack = Io. Get. Current. Irp. Stack. Location ( p. Irp ); ){ switch (p. Irp. Stack->Minor. Function) { case IRP_MN_START_DEVICE : … case IRP_MN_STOP_DEVICE : … default : // 지원하지 않는 기능을 하위로 내려보냄 return Pass. Down. P( p. DO , p. Irp ); } // switch 구문 각각의 모든 경우는 호출된 결과로 리턴함 } ISLab Flash Team Ch 6. 초기화 및 정리 루틴 17 Made By Povolon
Prestart device states Device not present Device Physically inserted Device is present Bus driver enumerates Device is enumerated Pn. P Manager loads driver & invokes Driver. Entry Drives loaded & initialized Add. Device() FDO & Filter DOs created & stacked Device Enumerated ISLab Flash Team Ch 6. 초기화 및 정리 루틴 20 Made By Povolon
Post-start device states Device not present Stopped state IRP_MN_REMOVE_DEVICE IRP_MN_STOP_DEVICE Remove pending IRP_MN_CANCEL IRP_MN_QUERY _REMOVE_DEVICE Surprise removal Stop pending IRP_MN_QUERY IRP_MN_CANCEL _STOP_DEVICE IRP_MN_START_DEVICE IRP_MN_SURPRISE_REMOVAL Device started ISLab Flash Team Ch 6. 초기화 및 정리 루틴 21 Made By Povolon
Passing Down Pn. P Requests • Pn. P Manager는 항상 Device Stack의 최상단에 위치한 디바이스의 드라이버로 Pn. P요청을 보냄 • 요청의 처리가 될때까지 스택을 따라 내려보냄 • Io. Copy. Current. Stack. Location. To. Next 와 Io. Call. Driver를 호출하여 디바이스 스택을 따라 내려감 • 상위 드라이버에서 하위 드라이버의 처리를 기다릴 필요 가 없을 경우 현재 IRP스택 로케이션을 Skip하고 완료 루 틴으로 IRP처리의 신뢰성을 보장 NTSTATUS Pass. Down. P( IN PDEVICE_OBJECT p. DO, IN PIRP p. Irp) { Io. Skip. Current. Irp. Stack. Location( p. Irp ); PDEVICE_EXTENSION p. Dev. Ext = (PDEVICE_EXTENSION) p. DO>Device. Extension; return Io. Call. Driver(p. Dev. Ext-> p. Lower. Device, p. Irp); } ISLab Flash Team Ch 6. 초기화 및 정리 루틴 22 Made By Povolon
I/O Completion Routines • • • Io. Set. Completion. Routine을 사용하여 상위레벨의 드라이버에 등록 하위레벨 드라이버에서 완료하면 Io. Complete. Request호출 하부에서 상부로 차례로 올라오면서 완료루틴이 호출됨 VOID Io. Set. Completion. Routine IRQL <= PASSIVE_LEVEL Parameter Description IN PIRP p. Irp IRP의 포인터 IN PIO_COMPLETION_ROUTINE Completion. Routine IRP완료시에 제어권을 받을 수 있는 함수 포인터 IN PVOID p. Context 완료 루틴으로 전달될 인자 IN BOOLEAN b. Invoke. On. Success IRP가 성공하면 호출하도록 지정 IN BOOLEAN b. Invoke. On. Error IRP가 실패하면 호출하도록 지정 IN BOOLEAN b. Invoke. On. Cancel IRP가 취소되면 호출하도록 지정 Return value void • Funtion Prototype for Io. Set. Completion. Routine ISLab Flash Team Ch 6. 초기화 및 정리 루틴 23 Made By Povolon
I/O Completion Routines (cont. ) • • 가장 하위의 드라이버만 예외 완료루틴 (On. Io. Completion) 의 IRQL은 예측 불가능 함 NTSTATUS On. Io. Completion IRQL == ? ? ? Parameter Description IN PDEVICE_OBJECT p. Dev. Obj 디바이스 객체 포인터 IN PIRP p. Irp 완료된 IRP의 포인터 IN PVOID p. Context Io. Set. Completion. Routine 에서 전달받은 인자 Return value • STATUS_MORE_PROCESSING_REQUIRED • STATUS_SUCCESS • • Funtion Prototype for I/O Completion Routine Pn. P 핸들러를 PASSIVE_LEVEL에서 수행시키기 위해 커널 이벤트 객체를 사용함 ISLab Flash Team Ch 6. 초기화 및 정리 루틴 24 Made By Povolon
Bus Driver Plug and Play Requests • 버스 드라이버에서 지원하는 Pn. P IRP Minor Code Meaning IRP_MN_QUERY_RESOURCES 부팅 설정 자원을 요청 IRP_MN_QUERY_RESOURCE_ REQUIREMENT 디바이스를 위한 자원 정보를 요청 IRP_MN_QUERY_ID 디바이스의 인스턴스 ID를 요청 IRP_MN_QUERY_DEVICE_TEXT 디바이스에 대한 설명이나 위치를 요청 IRP_MN_QUERY_BUS_INFORMATION 버스의 정보를 요청 IRP_MN_READ_CONFIG 버스의 설정영역을 읽는 요청 IRP_MN_WRITE_CONFIG 버스의 설정영역에 쓰는 요청 ISLab Flash Team Ch 6. 초기화 및 정리 루틴 25 Made By Povolon
ISLab Flash Team 6. Device Enumeration Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
Hardware Resource Descriptors • IRP_MN_START_DEVICE를 받으면 IRP스택 내의 두개의 필드에 하드웨어 자원을 리스트와 한다 (Parameters. Start. Device. Allocated. Resources. Translated, Parameters. Start. Device. Allocated. Resources) CM_RESOURCE_LIST Count LIST[] Port Interrupt Drive r Ext. CM_PARTIAL_RESOURCE_LIST Version Revision Count Partial Descriptors[] … … FDO Driver CM_RESOURCE_DESCRIPTOR Interface Type Bus. Number Partial. Resource. List Memory DMA … CM_PARTIAL_RESOURCE_DESCRIPTOR Type Share. Disposition Flags Union u ISLab Flash Team Ch 6. 초기화 및 정리 루틴 28 Made By Povolon
Using Hardware Resources Within the Driver • Raw resource (원본 그대로의 자원) – 버스의 상대적인 주소(port, IRQLs, DMA Channel) – Translate resource와 1: 1 대응 관계를 가짐(해석된 자원) – HAL 매크로들은 Translate resource를 인자로 받음 • 자원의 제한 – IRP_MN_FILTER_RESOURCE_REQUIREMENTS 를 호출 – Pn. P Manager에서 할당 받은 자원 리스트를 수정(삭제)가능 ISLab Flash Team Ch 6. 초기화 및 정리 루틴 29 Made By Povolon
ISLab Flash Team 7. Device Interface Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
Interface Construction • 적당한 ID가 생성되면, 명세를 위한 함수 포인터를 가지 는 구조체로 생성함 • C++에서는 상속기법으로 정의 가능 Typedef VOID (*PINTERFACE_REFERENCE)(PVOID p. Context); Typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID p. Context); Typedef struct _INTERFACE { USHORT Size; USHORT Version; PVOID Context; PINTERFACE_REFERENCE Interface. Reference; PINTERFACE_DEREFERENCE Interface. Dereference; // 인터페이스 명세 엔트리를 여기에 작성함 } INTERFACE, *PINTERFACE ISLab Flash Team Ch 6. 초기화 및 정리 루틴 32 Made By Povolon
Registering and Enabling an Interface • 인터페이스 생성 후 Add. Device내의 Io. Register. Device. Interface 함 수를 통해 Registering • 시스템에 생성된 Symbolic Link Name은 System Registry에 보존됨 , Device Extension에도 저장 NTSTATUS Io. Register. Device. Interface Parameter IN PDEVICE_OBJECT p. DO IN CONST GUID *p. Interface. Class. Guid IN PUNICODE_STRING ref. String OUT PUNICODESTRING Symbolic. Link. Name IRQL == PASSIVE_LEVEL Description 물리 디바이스 객체 포인터 Interface의 ID 포인터 ID의 혼동을 피하기위한 추가 문자열 드라이버와사용자 모드 코드를 interface하 기 위해 지정한 이름 • STATUS_SUCCESS • STATUS_INVALID_DEVICE_REQUEST Return value • Function Prototype for Io. Register. Device. Interface ISLab Flash Team Ch 6. 초기화 및 정리 루틴 33 Made By Povolon
Registering and Enabling an Interface(cont. ) • IRP_MV_START_DEVICE의 routine이 호출되면 활성화 시킴 • Io. Set. Device. Interface. State함수로 Enable or Disable • Function Prototype for Io. Set. Device. Interface. State NTSTATUS Io. Set. Device. Interface. State Parameter IN PUNICODESTRING Symbolic. Link. Name IN BOOLEAN b. Enable. Interface Return value IRQL == PASSIVE_LEVEL Description 등록시 사용된 참조이름 • TRUE - Enable • FALSE - Disable • STATUS_SUCCESS • STATUS_OBJECT_NAME_NOT_FOUND ISLab Flash Team Ch 6. 초기화 및 정리 루틴 34 Made By Povolon
Registering and Enabling an Interface(cont. ) • IRP_MN_QUERY_INTERFACE를 통해서 kernel Mode로 사용 • Parameters. Query. Interface field에 호출자에 할당된 구조체 • Interface를 구현한 함수의 pointer or Data는 드라이버 가 책임을 지고 유효한 값으로 채움 ISLab Flash Team Ch 6. 초기화 및 정리 루틴 35 Made By Povolon
ISLab Flash Team Summary Ch 6. 초기화 및 정리 루틴Windows 2000 Device Driver
- Slides: 37