34
ISLab Flash Team ISLab Flash Team Ch 6. Initialization and Ch 6. Initialization and Cleanup Routines Cleanup Routines

Ch 6. Initialization and Cleanup Routines

  • Upload
    ekram

  • View
    31

  • Download
    0

Embed Size (px)

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 Presentation

Citation preview

Page 1: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

Ch 6. Initialization andCh 6. Initialization andCleanup RoutinesCleanup Routines

Page 2: Ch 6. Initialization and Cleanup 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

Page 3: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

1. Writing a DriverEntry Routine1. Writing a DriverEntry Routine

Page 4: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 4

ISLab Flash TeamISLab Flash Team

Made By Povolon

DriverEntry RoutineDriverEntry Routine

• 모든 Windows 2000 의 커널 모드 드라이버나 WDM 드라이버는 그 목적에 관계없이 DriverEntry Routine 을 가짐 .

• 다양한 데이터 구조체를 초기화

• 다른 모든 드라이버의 구성 요소들을 위한 환경을 준비

Page 5: Ch 6. Initialization and Cleanup Routines

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

Page 6: Ch 6. Initialization and Cleanup Routines

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

Page 7: Ch 6. Initialization and Cleanup Routines

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;

Page 8: Ch 6. Initialization and Cleanup Routines

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

Page 9: Ch 6. Initialization and Cleanup Routines

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

Page 10: Ch 6. Initialization and Cleanup Routines

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 - 두가지 모두를 사용

Page 11: Ch 6. Initialization and Cleanup Routines

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 )

Page 12: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

2. Code Example : Driver 2. Code Example : Driver InitializationInitialization

Page 13: Ch 6. Initialization and Cleanup Routines

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;

}

Page 14: Ch 6. Initialization and Cleanup Routines

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); …

Page 15: Ch 6. Initialization and Cleanup Routines

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;

}

Page 16: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

3. Writing Reinitialize Routines3. Writing Reinitialize Routines

Page 17: Ch 6. Initialization and Cleanup 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)

Page 18: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

4. Writing an Unload4. Writing an Unload RoutineRoutine

Page 19: Ch 6. Initialization and Cleanup Routines

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)

Page 20: Ch 6. Initialization and Cleanup Routines

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 에서 수행

Page 21: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

5. Code Example : Driver Unload5. Code Example : Driver Unload

Page 22: Ch 6. Initialization and Cleanup Routines

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

}

Page 23: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

6. Writing Shutdown6. Writing Shutdown RoutinesRoutines

Page 24: Ch 6. Initialization and Cleanup Routines

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

Page 25: Ch 6. Initialization and Cleanup Routines

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 );

}

Page 26: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

7. Testing the Driver7. Testing the Driver

Page 27: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 27

ISLab Flash TeamISLab Flash Team

Made By Povolon

TestTest

• 성공적인 Compile , Link• 시스템 충돌이 없이 load & Unload 수행• Device Object 와 Win32 Symbolic Link 생성• Unload 시 자원 해제

Page 28: Ch 6. Initialization and Cleanup Routines

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 : 컴퓨터 관리 창에서 보이는 이름

Page 29: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 29

ISLab Flash TeamISLab Flash Team

Made By Povolon

TestTest

Page 30: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 30

ISLab Flash TeamISLab Flash Team

Made By Povolon

TestTest

Page 31: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 31

ISLab Flash TeamISLab Flash Team

Made By Povolon

TestTest

Page 32: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 32

ISLab Flash TeamISLab Flash Team

Made By Povolon

TestTest

Page 33: Ch 6. Initialization and Cleanup Routines

ISLab Flash TeamISLab Flash Team

SummarySummary

Page 34: Ch 6. Initialization and Cleanup Routines

Ch 6. 초기화 및 정리 루틴 34

ISLab Flash TeamISLab Flash Team

Made By Povolon

SummarySummary

• Windows 2000 의 Device Driver 초기 버전의 구현

• 드라이버의 빌드 , 설치

• 커널 모드 드라이버의 기본 구조체