340 likes | 479 Views
Ch 6. Initialization and Cleanup Routines. Contents. Writing a DriverEntry Routine Code Example : Driver Initialization Writing Reinitialize Routine Writing an Unload Routine Code Example : Driver Unload Writing Shutdown Routine Testing the driver Summary.
E N D
Contents • Writing a DriverEntry Routine • Code Example : Driver Initialization • Writing Reinitialize Routine • Writing an Unload Routine • Code Example : Driver Unload • Writing Shutdown Routine • Testing the driver • Summary Ch 6. 초기화 및 정리 루틴
DriverEntry Routine • 모든 Windows 2000의 커널 모드 드라이버나 WDM드라이버는 그 목적에 관계없이 DriverEntry Routine을 가짐. • 다양한 데이터 구조체를 초기화 • 다른 모든 드라이버의 구성 요소들을 위한 환경을 준비 Ch 6. 초기화 및 정리 루틴
DriverEntry Routine(1) • Function Prototype for DriverEntry Ch 6. 초기화 및 정리 루틴
DriverEntry Routine(2) • Driver Entry Routine 의 동작 • 드라이버에서 제어할 하드웨어를 획득 • Driver Object의 다른 Routine들의 시작점 지정 • Controller 생성 , Controller Extension 초기화 (IoCreateController) • Device Object 생성, Device Extension 초기화 (IoCreateDevice) • Device Object를 Win32시스템에서 보이도록 함 (IoCreateSymbolicLink) • Interrupt Object와 연결(DPC Object생성) • 4~6의 과정을 다른 device에 대해 반복 수행 • Return STATUS_SUCCESS to I/O manager Ch 6. 초기화 및 정리 루틴
Announcing DriverEntry Point • Function pointer in Driver Object • 명시적인 slot & name을 가지는 Function • MajorFunction배열 상에 나열된 IRP Dispatch function • Ex) Function pointer initialize pDO -> DriverStartIO = StartIO; pDO -> DrtverUnload = Unload; // // 다른 주요 처리함수 테이블에 대한 초기화 // pDO -> MajorFunction[ IRP_MJ_CREATE ] = DispatchCreate; pDO -> MajorFunction[ IRP_MJ_CLOSE ] = DispatchClose; Ch 6. 초기화 및 정리 루틴
Creating Device Object • IoCreateDevice • Driver Object에 의해 관리되는 Device List에 새로운 Device Object를 연결 • AddDevice Routine에서 호출하는 경우 • WDM 을 지원하는 Device • DriverEntry Routine의 1,3~6과정을 제외함 (하드웨어 획득 및 컨트롤러 디바이스 객체의 생성) • Dispatch Routine에서 IoCreateDevice 가 불리는 경우 • Device의 Flags Field중 DO_DEVICE_INITIALIZING bit을 reset • Device의 추가 or Reinitializing Ch 6. 초기화 및 정리 루틴
Creating Device Object(1) • Function Prototype for IoCreateDevice Ch 6. 초기화 및 정리 루틴
Buffering Strategy • Device에서 사용할 Buffering strategy 를 I/O Manager에게 통보 • Device FlagsField • DO_BUFFER_I/O • DO_DIRECT_I/O • Neither bit - 두가지 모두를 사용 Ch 6. 초기화 및 정리 루틴
?? Device Symbolic Link Xx0 XX1 Device Name Name Directory Tree Object Manager Root Ex) Symbolic Link Name “\\??\\MINIMAL1” LPT1, LPT2 , A: ~ Z: Ex) 내부 “\\Device\\Minimal0” FloppyDisk0 , FloppyDisk1 IoCreateSymbolicLink ( Device Name , UNICODE_STRING Symbolic Link Name ) Ch 6. 초기화 및 정리 루틴
Minimal driver • Device Name : MINIMAL0 • Symbolic Link Name : MINI • DriverEntry • 다른 함수의 진입점을 지정(Announcing) • Logical Device 생성 NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { … NTSTATUS status; … pDriverObject->DriverUnload = DriverUnload; … status = CreateDevice ( pDriverObject, … ); return status; } Ch 6. 초기화 및 정리 루틴
Minimal driver (1) • CreateDevice • Device Name initialization • Device Object 생성, Device Extension size 지정 • Device Extension initialization • Symbolic Link Name initialization & Link NTSTATUS CreateDevice ( IN PDRIVER_OBJECT pDriverObject, IN ULONG ulDeviceNumber) { … NTSTATUS status; PDEVICE_OBJECT pDevObj; PDEVICE_EXTENSION pDevExt; … CUString devName(“\\Device\\MINIMAL”); devName += CUString(ulDeviceNumber); … Ch 6. 초기화 및 정리 루틴
Minimal driver (2) status = IoCreateDevice ( pDriverObject, … ); pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; pDevExt->pDevice = pDevObj; // Back pointer pDevExt->DeviceNumber = ulDeviceNumber; pDevExt->ustrDeviceName = devName; CUString SymLinkName(“\\??\\MINI”); SymLinkName += CUString(ulDeviceNumber+1); pDevExt->ustrSymLinkName = SymLinkName; status = IoCreateSymbolicLink( … ); … //실패할 경우 Device Object를 반드시 삭제 … return STATUS_SUCCESS; } Ch 6. 초기화 및 정리 루틴
Reinitialize Routine • IoRegisterDriverReinitialize • 시스템의 Bootstrap이 충분히 진행되지 않아서 초기화 과정이 제대로 끝날수 없는경우 • I/O Manage가 Bootstrap이 끝나면 Reinitialize routine 호출 • Booting시에 자동으로 load되는 드라이버에 한함 • 재귀호출로 초기화의 신뢰성 보장 • Function Prototype for Reinitialize Ch 6. 초기화 및 정리 루틴
Unload Routine • 드라이버를 Unload가능 하게 하기 위해 Unload routine이 반드시 필요 • I/O Manager는 수동, 자동으로 호출(Unload 직전) • Function Prototype for Unload Ch 6. 초기화 및 정리 루틴
Unload Routine(1) • Unload Routine 의 동작 • 다음 load시에 상태 복구를 위해 Device의 상태정보를 registry에 저장 • Interrupt disable, disconnect Interrupt object • Hardware 해제 • Remove Symbolic Link Name from Win32 namespace • IoDeleteDevice : Device Object 삭제 • 다중 Controller를 사용한다면 4~5과정 반복, IoDeleteController : Controller Object 삭제 • 4~6의 과정을 다른 Device & Controller에 대해 반복 수행 • Deallocate pool memory • WDM의 경우 RemoveDevice에서 수행 Ch 6. 초기화 및 정리 루틴
Unload Routine(2) • Driver Entry Routine의 동작을 반대로 수행 • Symbolic Link Name 과 Device Object를 삭제 VOID DriverUnload ( IN PDRIVER_OBJECT pDriverObject ) { PDEVICE_OBJECT pNextObj; … pNextobj = pDriverObject->DeviceObject; while ( pNextObj != NULL ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pNextObj->DeviceExtension; UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName; IoDeleteSymbolicLink( &pLinkName ); pNextObj = pNextObj -> NextDevice; IoDeleteDevice ( pDevExt->pDevice ); } //IoReportResourceUsage } Ch 6. 초기화 및 정리 루틴
Shutdown Routine • OS의 종료시 Driver에서 해야 할 해제과정 있다면 제공 • Shutdown시에는 Unload routine이 호출되지 않음 • Device를 동작하지 않도록 함 • Device의 일부 정보를 저장 • OS가 종료됨과 동시에 자원은 해제됨 • Function Prototype for Shutdown Ch 6. 초기화 및 정리 루틴
Shutdown Routine(1) • 별도의 I/O요구 • MajorFunction 코드 배열의내부요소에 지정 • IoRegisterShutdownNotification : Shutdown 통지 NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject , IN PUNICODE_STRING pRegistryPath) { … pDriverObject->MajorFunction [ IRP_MJ_SHUTDOWN ] = Shutdown; IoCreateDevice( pDriverObject , … , pDeviceObject); IoRegisterShutdownNotification ( pDriverObject ); … } Ch 6. 초기화 및 정리 루틴
Test • 성공적인 Compile , Link • 시스템 충돌이 없이 load & Unload 수행 • Device Object 와 Win32 Symbolic Link 생성 • Unload시 자원 해제 Ch 6. 초기화 및 정리 루틴
Tool 사용 • 예제 소스 코드 Minimal.dsw의 컴파일 및 링크 • 생성된 Minimal.sys를 \winnt\system32\drivers에 복사 • Regedit로 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service에 드라이버 이름( ex – Minimal )로 키생성 • 드라이버내에 서브키생성 • ErrorControl=1(DWORD),Start=3(DWORD),Type=1(DWORD) • 또는 Minimal.reg를 실행함 • DisplayName : 컴퓨터 관리 창에서 보이는 이름 Ch 6. 초기화 및 정리 루틴
Test Ch 6. 초기화 및 정리 루틴
Test Ch 6. 초기화 및 정리 루틴
Test Ch 6. 초기화 및 정리 루틴
Test Ch 6. 초기화 및 정리 루틴
Summary • Windows 2000의 Device Driver 초기 버전의 구현 • 드라이버의 빌드 , 설치 • 커널 모드 드라이버의 기본 구조체 Ch 6. 초기화 및 정리 루틴