ch 6. initialization and cleanup routines
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
ISLab Flash TeamISLab Flash Team
Ch 6. Initialization andCh 6. Initialization andCleanup RoutinesCleanup Routines
Ch 6. 초기화 및 정리 루틴 2
ISLab Flash TeamISLab Flash Team
Made By Povolon
ContentsContents
1. Writing a DriverEntry Routine2. Code Example : Driver Initialization3. Writing Reinitialize Routine4. Writing an Unload Routine5. Code Example : Driver Unload6. Writing Shutdown Routine7. Testing the driver8. Summary
ISLab Flash TeamISLab Flash Team
1. Writing a DriverEntry Routine1. Writing a DriverEntry Routine
Ch 6. 초기화 및 정리 루틴 4
ISLab Flash TeamISLab Flash Team
Made By Povolon
DriverEntry RoutineDriverEntry Routine
• 모든 Windows 2000 의 커널 모드 드라이버나 WDM 드라이버는 그 목적에 관계없이 DriverEntry Routine 을 가짐 .
• 다양한 데이터 구조체를 초기화
• 다른 모든 드라이버의 구성 요소들을 위한 환경을 준비
Ch 6. 초기화 및 정리 루틴 5
ISLab Flash TeamISLab Flash Team
Made By Povolon
DriverEntry Routine(1)DriverEntry Routine(1)
• Function Prototype for DriverEntry
NTSTATUS DriverEntry
IRQL == PASSIVE LEVEL
Parameter Description
IN PDRIVER_OBJECT pDriverObject
Address of driver object for this driver
IN PUNICODE_STRING pRegisterPath
Registry path string for this driver’s key
Return value• STATUS_SUCCESS• STATUS_XXX – some error code
Ch 6. 초기화 및 정리 루틴 6
ISLab Flash TeamISLab Flash Team
Made By Povolon
DriverEntry Routine(2)DriverEntry Routine(2)
• Driver Entry Routine 의 동작1. 드라이버에서 제어할 하드웨어를 획득2. Driver Object 의 다른 Routine 들의 시작점 지정3. Controller 생성 , Controller Extension 초기화
(IoCreateController)4. Device Object 생성 , Device Extension 초기화
(IoCreateDevice)5. Device Object 를 Win32 시스템에서 보이도록 함
(IoCreateSymbolicLink)6. Interrupt Object 와 연결 (DPC Object 생성 )7. 4~6 의 과정을 다른 device 에 대해 반복 수행8. Return STATUS_SUCCESS to I/O manager
Ch 6. 초기화 및 정리 루틴 7
ISLab Flash TeamISLab Flash Team
Made By Povolon
Announcing DriverEntry PointAnnouncing DriverEntry Point
• Function pointer in Driver Object– 명시적인 slot & name 을 가지는 Function– MajorFunction 배열 상에 나열된 IRP Dispatch function
• Ex) Function pointer initializepDO -> DriverStartIO = StartIO;pDO -> DrtverUnload = Unload;
//// 다른 주요 처리함수 테이블에 대한 초기화//
pDO -> MajorFunction[ IRP_MJ_CREATE ] = DispatchCreate;pDO -> MajorFunction[ IRP_MJ_CLOSE ] = DispatchClose;
Ch 6. 초기화 및 정리 루틴 8
ISLab Flash TeamISLab Flash Team
Made By Povolon
Creating Device ObjectCreating 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. 초기화 및 정리 루틴 9
ISLab Flash TeamISLab Flash Team
Made By Povolon
Creating Device Object(1)Creating Device Object(1)
NTSTATUS IoCreateDevice IRQL == PASSIVE LEVEL
Parameter Description
IN PDRIVER_OBJECT pDriverObject
Pointer to driver object
IN ULONG DeviceExtensionSize DEVICE_EXTENSION 의 요구되는 크기
IN PUNICODE_STRING pDeviceName
내부 디바이스의 이름 (internal name)
IN DEVICE_TYPE DeviceType FILE_DEVICE_XXX (NTDDK.h 참고 )
IN ULONG DeviceCharacteristics
대용량 저장 디바이스의 특성• FILE_REMOVABLE_MEDIA• FILE_READ_ONLY_DEVICE• Etc.
IN BOOLEAN Exclusive Device 가 공유가능 하지 않을 경우 True
OUT PDEVICE_OBJECT *pDeviceObject
Device object 에 대한 pointer 를 담는 변수
Return value• STATUS_SUCCESS• STATUS_XXX – some error code
• Function Prototype for IoCreateDevice
Ch 6. 초기화 및 정리 루틴 10
ISLab Flash TeamISLab Flash Team
Made By Povolon
Buffering StrategyBuffering Strategy
• Device 에서 사용할 Buffering strategy 를 I/O Manager에게 통보– Device Flags Field– DO_BUFFER_I/O – DO_DIRECT_I/O– Neither bit - 두가지 모두를 사용
Ch 6. 초기화 및 정리 루틴 11
ISLab Flash TeamISLab Flash Team
Made By Povolon
Device NameDevice Name
Root
Device ??
Xx0 XX1Symbolic Link
Object Manage
r
Name Directory Tree
Ex) 내부
“\\Device\\Minimal0”
FloppyDisk0 , FloppyDisk1
Ex) Symbolic Link Name
“\\??\\MINIMAL1”
LPT1, LPT2 , A: ~ Z:IoCreateSymbolicLink ( Device Name ,
UNICODE_STRING Symbolic Link Name )
ISLab Flash TeamISLab Flash Team
2. Code Example : Driver 2. Code Example : Driver InitializationInitialization
Ch 6. 초기화 및 정리 루틴 13
ISLab Flash TeamISLab Flash Team
Made By Povolon
Minimal driverMinimal 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. 초기화 및 정리 루틴 14
ISLab Flash TeamISLab Flash Team
Made By Povolon
Minimal driver (1)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. 초기화 및 정리 루틴 15
ISLab Flash TeamISLab Flash Team
Made By Povolon
Minimal driver (2)Minimal driver (2)status = IoCreateDevice ( pDriverObject, … );
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;pDevExt->pDevice = pDevObj; // Back pointerpDevExt->DeviceNumber = ulDeviceNumber;pDevExt->ustrDeviceName = devName;
CUString SymLinkName(“\\??\\MINI”);SymLinkName += CUString(ulDeviceNumber+1);pDevExt->ustrSymLinkName = SymLinkName;
status = IoCreateSymbolicLink( … );… // 실패할 경우 Device Object 를 반드시 삭제…return STATUS_SUCCESS;
}
ISLab Flash TeamISLab Flash Team
3. Writing Reinitialize Routines3. Writing Reinitialize Routines
Ch 6. 초기화 및 정리 루틴 17
ISLab Flash TeamISLab Flash Team
Made By Povolon
Reinitialize RoutineReinitialize Routine
• IoRegisterDriverReinitialize– 시스템의 Bootstrap 이 충분히 진행되지 않아서 초기화 과정이 제대로
끝날수 없는경우– I/O Manage 가 Bootstrap 이 끝나면 Reinitialize routine 호출– Booting 시에 자동으로 load 되는 드라이버에 한함
• 재귀호출로 초기화의 신뢰성 보장
• Function Prototype for Reinitialize
VOID Reinitialize IRQL == PASSIVE LEVEL
Parameter Description
IN PDRIVER_OBJECT pDriverObject
Pointer of driver object
IN PVOID Context 등록시 지정한 Context Block
In ULONG CountReinitialize call 에 대한 카운터(0)
Return value (void)
ISLab Flash TeamISLab Flash Team
4. Writing an Unload4. Writing an Unload RoutineRoutine
Ch 6. 초기화 및 정리 루틴 19
ISLab Flash TeamISLab Flash Team
Made By Povolon
Unload RoutineUnload Routine
• 드라이버를 Unload 가능 하게 하기 위해 Unload routine 이 반드시 필요
• I/O Manager 는 수동 , 자동으로 호출 (Unload 직전 )
• Function Prototype for Unload
VOID Unload IRQL == PASSIVE LEVEL
Parameter Description
IN PDRIVER_OBJECT pDriverObject
Pointer of driver object
Return value (void)
Ch 6. 초기화 및 정리 루틴 20
ISLab Flash TeamISLab Flash Team
Made By Povolon
Unload Routine(1)Unload Routine(1)• Unload Routine 의 동작
1. 다음 load 시에 상태 복구를 위해 Device 의 상태정보를 registry 에 저장
2. Interrupt disable, disconnect Interrupt object
3. Hardware 해제
4. Remove Symbolic Link Name from Win32 namespace
5. IoDeleteDevice : Device Object 삭제
6. 다중 Controller 를 사용한다면 4~5 과정 반복 , IoDeleteController : Controller Object 삭제
7. 4~6 의 과정을 다른 Device & Controller 에 대해 반복 수행
8. Deallocate pool memory
• WDM 의 경우 RemoveDevice 에서 수행
ISLab Flash TeamISLab Flash Team
5. Code Example : Driver Unload5. Code Example : Driver Unload
Ch 6. 초기화 및 정리 루틴 22
ISLab Flash TeamISLab Flash Team
Made By Povolon
Unload Routine(2)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
}
ISLab Flash TeamISLab Flash Team
6. Writing Shutdown6. Writing Shutdown RoutinesRoutines
Ch 6. 초기화 및 정리 루틴 24
ISLab Flash TeamISLab Flash Team
Made By Povolon
Shutdown RoutineShutdown Routine• OS 의 종료시 Driver 에서 해야 할 해제과정 있다면 제공• Shutdown 시에는 Unload routine 이 호출되지 않음• Device 를 동작하지 않도록 함• Device 의 일부 정보를 저장• OS 가 종료됨과 동시에 자원은 해제됨
• Function Prototype for Shutdown
NTSTATUS Shutdown IRQL == PASSIVE LEVEL
Parameter Description
IN PDRIVER_OBJECT pDriverObject
Pointer of driver object
IN PIRP pirp Shutdown IRP 에 대한 pointer
Return value• STATUS_SUCCESS• STATUS_XXX
Ch 6. 초기화 및 정리 루틴 25
ISLab Flash TeamISLab Flash Team
Made By Povolon
Shutdown Routine(1)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 );
…
}
ISLab Flash TeamISLab Flash Team
7. Testing the Driver7. Testing the Driver
Ch 6. 초기화 및 정리 루틴 27
ISLab Flash TeamISLab Flash Team
Made By Povolon
TestTest
• 성공적인 Compile , Link• 시스템 충돌이 없이 load & Unload 수행• Device Object 와 Win32 Symbolic Link 생성• Unload 시 자원 해제
Ch 6. 초기화 및 정리 루틴 28
ISLab Flash TeamISLab Flash Team
Made By Povolon
Tool 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(DWOR
D)– 또는 Minimal.reg 를 실행함– DisplayName : 컴퓨터 관리 창에서 보이는 이름
Ch 6. 초기화 및 정리 루틴 29
ISLab Flash TeamISLab Flash Team
Made By Povolon
TestTest
Ch 6. 초기화 및 정리 루틴 30
ISLab Flash TeamISLab Flash Team
Made By Povolon
TestTest
Ch 6. 초기화 및 정리 루틴 31
ISLab Flash TeamISLab Flash Team
Made By Povolon
TestTest
Ch 6. 초기화 및 정리 루틴 32
ISLab Flash TeamISLab Flash Team
Made By Povolon
TestTest
ISLab Flash TeamISLab Flash Team
SummarySummary
Ch 6. 초기화 및 정리 루틴 34
ISLab Flash TeamISLab Flash Team
Made By Povolon
SummarySummary
• Windows 2000 의 Device Driver 초기 버전의 구현
• 드라이버의 빌드 , 설치
• 커널 모드 드라이버의 기본 구조체