Ch 7. Driver Dispatch Routines

39
ISLab Flash Team ISLab Flash Team Ch 7. Driver Dispatch Routines Ch 7. Driver Dispatch Routines

description

Ch 7. Driver Dispatch Routines. Goals. 드라이버와 드라이버 디스패치 루틴 점진적인 개발 방법론. Kernel Mode Object Type 결정 Driver 에 필요한 Context 결정 및 Store Place 결정 DriverEntry, Unload Routine 을 작성 (6 장 ) IRP_MJ_CREATE, IRP_MJ_CLOSE dispatch Routine(7 장 ) CreateFile , CloseHandle - PowerPoint PPT Presentation

Transcript of Ch 7. Driver Dispatch Routines

Page 1: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Ch 7. Driver Dispatch RoutinesCh 7. Driver Dispatch Routines

Page 2: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 2

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

GoalsGoals

• 드라이버와 드라이버 디스패치 루틴• 점진적인 개발 방법론

Kernel Mode Object Type 결정 Driver 에 필요한 Context 결정 및 Store Place 결정 DriverEntry, Unload Routine 을 작성 (6 장 ) IRP_MJ_CREATE, IRP_MJ_CLOSE dispatch Routine(7

장 )• CreateFile , CloseHandle

Hardware 검색및 자원을 할당하는 Code 추가 Unload 시 할당된 자원을 해제하는 Code 추가 IRP_MJ_XXX 함수를 처리하는 dispatch Routine 추가

• Win32 App 에서 ReadFile, WriteFile 등으로 Test 가능 실질적인 Routine 작성

• Start I/O Routine• Interrupt Service Routine• DPC Routine

DeviceIOControl Code 추가• Win32 App 가 직접 Hardware Register 를 제어할수 있음

Page 3: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 3

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

ContentsContents

• Driver Dispatch Routines• Writing Driver Dispatch Routines• Processing Read and Write Requests• Code Example : Loop-back Device• Extending the Dispatch interface• Testing Driver Dispatch Routine• Summary

Page 4: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Driver Dispatch RoutinesDriver Dispatch Routines

Page 5: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 5

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서의 디스패치 루틴에서의 I/O I/O 요청 메커니즘요청 메커니즘 (1)(1)

IRP

IoStatus

Stack

Header

IO_STATUS_BLOCK

Status

Information

IO_STACK_LOCATION

MajorFunction

MinorFunction

union { struct {…} Read; struct {…} Write; struct {…} DeviceControl} Parameters;

IO_STACK_LOCATION, *PIO_STACK_LOCATION

Filed Contents

UCHAR MajorFunction IRP_MJXXX 값이 할당되어 있다 .

UCHAR MinorFunctionFile System 이나 SCSI 드라이버에 의해서

사용되어진다 .

Union Paramenters MajorFunction Code 에 대한 Union 값들

struct Write

IRP_MJ_WRITE 에 대한 파라미터• ULONG Length• ULONG Key• LARGE_INTEGER ByteOffset

struct DeviceIOControl

IRP_MJ_DEVICE_CONTROL 대한 파라미터• ULONG OutputBufferLength• ULONG InputBufferLength• ULONG IoControlCode• PVOID Ttpe3InputBuffer

struct Others PVOID Argument1-Argument4

PDEVICE_OBJECT DeviceObject

I/O Request 의 타켓 다바이스 객체

PFILE_OBJECT FileOnject

요청을 수행한 File Object

struct Read

IRP_MJ_READ 에 대한 파라미터• ULONG Length• ULONG Key• LARGE_INTEGER ByteOffset

Driver Object

DeviceObject

DriverStatIo

DriverUnload

MajorFunction[]

……..

Start I/ORoutine

UnloadRoutine

DispatchRoutine

DispatchRoutine

DeviceObject

DeviceObject

<IRP 의 구조 >

<DriverObject 구조 ><IRP 외부로 보여지는 IRP 스택 로케이션 필드 >

Page 6: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 6

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서의 디스패치 루틴에서의 I/O I/O 요청 메커니즘요청 메커니즘 (2)(2)IRP

IRP_MJ_WRITE

드라이버 객체

:

DispatchCreate

_IopInvalidDeviceRequest

DispatchRead

DispatchWite

_IopInvalidDeviceRequest 쓰기디스패치

루틴

MajorFunction

MajorFunction[] [IRP_MJ_CREATE]

[IRP_MJ_READ]

[IRP_MJ_WRITE]

.

.

.

.

.

.

※ _IopInvalidDeviceRequest 는 올바르지 않은 I/O 요청일 경우에 불리는 함수로써 에러를 I/O 요청자에게 리턴

Page 7: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 7

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

특정 함수 코드의 활성화특정 함수 코드의 활성화

NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDO, IN PUNICODE_STRING pRegPath){

:pDO->MajorFunction[ IRP_MJ_CREATE ] = DispCreate;pDO->MajorFunction[ IRP_MJ_CLOSE ] = DispClose;pDO->MajorFunction[ IRP_MJ_CLEANUP ] = DispCleanup;pDO->MajorFunction[ IRP_MJ_READ ] = DispRead;pDO->MajorFunction[ IRP_MJ_WRITE ] = DispWrite;

:return STATUS_SUCCESS;

}

• IRP_MJ_XXX(NTDDK.h, WDM.h) • DriverEntry 가 호출되기 전에 _IopInvalidDeviceRequest 포인터로 다채운다 .

Page 8: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 8

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

어떤 함수 코드를 지원할 지 결정하기어떤 함수 코드를 지원할 지 결정하기IRP MajorFunction 코드

함수 코드 설명

IRP_MJ_CREATE 핸들을 요청한다 .• CreateFile

IRP_MJ_CLEANUP 핸들을 닫을 때 지연된 IRP 를 취소시킨다 .• CloseHandle

IRP_MJ_CLOSE 핸들을 닫는다 .• CloseHandle

IRP_MJ_READ 디바이스로부터 데이터를 얻는다 .• ReadFile

IRP_MJ_WRITE 디바이스로 데이터를 보낸다• WriteFile

IRP_MJ_DEVICE_CONTROL Control 동작을 수행한다 .• DeviceIOControl

IRP_MJ_INTERNAL_DEVICE_CONTROL 커널 모드 클라이언트에 대해서만 Control 동작을 수행한다 (Win32 호출에서는 수행할 수 없다 .

IRP_MJ_FLUSH_BUFFERS 버퍼에 쓰거나 버퍼를 비운다 .• FlushFileBuffers• FlushConsoleInputBuffer• PurgeComm

IRP_MJ_SHUTDOWN 시스템이 셧다운될 때• InitiateSystemShutdown

Page 9: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Writing Driver Dispatch RoutinesWriting Driver Dispatch Routines

Page 10: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 10

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

실행 컨텍스트실행 컨텍스트

NTSTATUS 디스패치 IRQL == PASSIVE_LEVEL

인자 설명

IN PDEVICE_OBJECT pDevObject 요청을 위한 타겟 디바이스의 포인터

IN PIRP pIrp 요청을 서술하는 IRP 의 포인터

리턴 값 • STATUS_SUCCESS – 요청 완료• STATUS_PENDING – 지연 요청• STATUS_XXX – 적당한 에러 코드

• 디스패치 루틴은 비슷한 형태를 가진다 .• PASSIVE_LEVEL IRQL

< 디스패치 루틴의 함수 원형 >

• Buffered I/O 와 Direct I/O 문제• IRP 와 IRP 이외의 구조체의 사용에 대한 문제• 공유 데이터 구조 IRP 에 따른 문제

Page 11: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 11

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서 수행하는 동작디스패치 루틴에서 수행하는 동작

• IoGetCurrentIrpStackLocation• IRP 에 대한 유효성 체크• 하부 드라이버로 전달• 에러발생시 _IopInvalidDeviceRequest 를 리턴하고

수행중지

Page 12: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 12

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서 빠져나오기디스패치 루틴에서 빠져나오기 (1)(1)

• 에러 통보• 요청 완료• 디바이스 동작을 스케줄링

Page 13: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 13

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서 빠져나오기디스패치 루틴에서 빠져나오기 (2)(2)

• 에러의 통보

NTSTATUS DispatchWrite(IN PDEVICE_OBJECT pDO, IN PIRP pIrp){

:// 만약 해당 요청이 이 디바이스에서 지원되지 않는 것이라면// 결과를 보고하고 요청을 거절한다 .pIrp->IoStatus.Status = STATUS_NOT_INCREMENT_SUPPORTED;// 전송된 데이터가 없음을 보고한다 .pIrp->IoStatus.Information = 0;// 우선순위의 증가 없이 IRP 를 완료시킨다 .IoCompleteRequest(pIrp, IO_NO_INCREMENT);return STATUS_NOT_SUPPORTED;

}

Page 14: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 14

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서 빠져나오기디스패치 루틴에서 빠져나오기 (3)(3)

• 요청의 완료

NTSTATUS DispatchClose(IN PDEVICE_OBJECT pDO, IN PIRP pIrp){

:pIrp->IoStatus.Status = STATUS_SUCCESS;// 전송된 데이터가 0 바이트라고 지정한다 .pIrp->IoStatus.Information = 0;// IRP 를 완료로 지정한다 . – 더 이상의 처리를 수행하지 않는다 .IoCompleteRequest(pIrp, IO_NO_INCREMENT);return STATUS_SUCCESS;

}

Page 15: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 15

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 루틴에서 빠져나오기디스패치 루틴에서 빠져나오기 (4)(4)

• 디바이스 동작을 스케줄링

NTSTATUS DispatchWrite(IN PDEVICE_OBJECT pDO, IN PIRP pIrp){

:// IRP 를 진행중으로 설정한다 .IoMarkIrpPending(pIrp);// 드라이버의 Start I/O 루틴을 통해 이벤트 처리의 // IRP 를 큐잉 ( 스케줄링 ) 한다 .// 세 번째 매개변수는 해당 I/O 요청을 큐의 끝에 삽입되도록 한다 .// 네 번째 매개변수는 Cancel 루틴에 대한 지점이다 .IoStartPacket(pDO, pIrp, 0, NULL);return STATUS_PENDING;

}

Page 16: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Processing Read and Write RequestsProcessing Read and Write Requests

Page 17: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 17

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

사용자 버퍼로의 접근사용자 버퍼로의 접근

• 디바이스 객체의 Flags 필드 (DO_BUFFERED_IO, DO_DIRECT_IO)

• BUFFERED I/O - Non-paged 풀 (pool) 버퍼를 할당 - IRP 의 AssociatedIrp.SystemBuffer 필드에 위치

• DIRECT I/O - 사용자 버퍼에 해당하는 물리 메모리 페이지를 잠근다 (lock) - MDL(Memory Descriptor List) - IRP 의 MdlAddress 필드에 저장

• NEITHER Method - Flags 필드 세팅이 되지 않았을 경우 - I/O 관리자는 어떤 버퍼 관리도 처리하지 않는다 .

Page 18: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Code ExampleCode Example

loop-back routine

Page 19: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 19

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

Code Example : Code Example : 루프백 디바이스루프백 디바이스 (1)(1)

NTSTATUS DispatchWrite ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp ) {

NTSTATUS status = STATUS_SUCCESS;PVOID userBuffer;ULONG xferSize;// 스택 로케이션은 사용자 버퍼의 정보를 갖고 있다 .PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp );

// 현재 버퍼의 포인터는 디바이스 객체 내에 포함된 DEVICE_EXTENSION 안에 저장된다 .PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;

// 버퍼가 이미 할당되어 있다면 해제한다 .if (pDevExt->deviceBuffer != NULL) {

ExFreePool(pDevExt->deviceBuffer);pDevExt->deviceBuffer = NULL;pDevExt->deviceBufferSize = 0;

}

xferSize = pIrpStack->Parameters.Write.Length;

// 이 예제에서는 디바이스가 Buffered I/O 를 사용하고 있다고 가정userBuffer = pIrp->AssociatedIrp.SystemBuffer;

Write 요청에 대한 디스패치 루틴 (1)

Page 20: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 20

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

Code Example : Code Example : 루프백 디바이스루프백 디바이스 (2)(2)

pDevExt->deviceBuffer = ExAllocatePool( PagedPool, xferSize );

if (pDevExt->deviceBuffer == NULL) {// 버퍼 할당에 실패status = STATUS_INSUFFICIENT_RESOURCES;xferSize = 0;

} else {// 버퍼를 복사pDevExt->deviceBufferSize = xferSize;RtlCopyMemory( pDevExt->deviceBuffer, userBuffer, xferSize );

}

// 디바이스 동작을 수행하지 않고 IRP 를 완료한다 .pIrp->IoStatus.Status = status;pIrp->IoStatus.Information = xferSize; // bytes xferedIoCompleteRequest( pIrp, IO_NO_INCREMENT );return status;

}

Write 요청에 대한 디스패치 루틴 (2)

Page 21: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 21

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

Code Example : Code Example : 루프백 디바이스루프백 디바이스 (3)(3)

NTSTATUS DispatchRead (IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp){

NTSTATUS status = STATUS_SUCCESS;PVOID userBuffer;ULONG xferSize;

// 스택 로케이션은 사용자 버퍼의 정보를 가지고 있다 .PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation( pIrp );

// 현재 버퍼의 포인터는 디바이스 객체 내에 포함된 DEVICE_EXTENSION 안에 저장PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;xferSize = pIrpStack->Parameters.Read.Length;userBuffer = pIrp->AssociatedIrp.SystemBuffer;

// 사용자의 요청에 대해 더 이상 전송을 수행하지 않는다 .xferSize = (xferSize < pDevExt->deviceBufferSize) ?

xferSize : pDevExt->deviceBufferSize;

Read 요청에 대한 디스패치 루틴 (1)

Page 22: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 22

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

Code Example : Code Example : 루프백 디바이스루프백 디바이스 (4)(4)

// 현재 버퍼를 사용자 공간으로 복사한다 .RtlCopyMemory( userBuffer, pDevExt->deviceBuffer, xferSize );

// 현재 paged 풀 버퍼를 해제한다 .ExFreePool( pDevExt->deviceBuffer );pDevExt->deviceBuffer = NULL;pDevExt->deviceBufferSize = 0;

// 그리고 I/O 요청을 완료한다 .pIrp->IoStatus.Status = status;pIrp->IoStatus.Information = xferSize;IoCompleteRequest( pIrp, IO_NO_INCREMENT );return status;

}

Read 요청에 대한 디스패치 루틴 (1)

Page 23: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 23

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

Code Example : Code Example : 루프백 디바이스루프백 디바이스 (5)(5)

Page 24: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Extending the Dispatch InterfaceExtending the Dispatch Interface

Page 25: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 25

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

디스패치 인터페이스의 확장디스패치 인터페이스의 확장

• read/write 동작 이외에 다른 동작( 예 : 디스크 포맷 , 파티션 )

• IRP_MJ_DEVICE_CONTROL- IoControl(IOCTL 디바이스 컨트롤 값 )

• IRP_MJ_INTERNAL_DEVICE_CONTROL- 커널 모드에서의 확장- IRP_MJ_DEVICE_CONTROL 와 유사

Page 26: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 26

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

개별적인 개별적인 IOCTL IOCTL 값에 대한 정의값에 대한 정의 (1)(1)

31-16 15-14 13-2 1-0

디바이스 타입

요청된 접근

컨트롤 코드

전송 타입<IOCTL 코드 구조체의 레이아웃>

031

Page 27: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 27

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

개별적인 개별적인 IOCTL IOCTL 값에 대한 정의값에 대한 정의 (2)(2)

CTL_CODE 매크로

인자 설명DeviceType IoCreateDevice 에 제공되는 FILE_DEVICE_XXX 의 값

• 0x0000~0x7fff – Microsoft 에 의해 예약된 값• 0x8000~0xffff – 사용자 정의 값

ControlCode 드라이버에서 정의된 IOCTL 코드• 0x00~0x7ff – Microsoft 에 의해 예약된 값• 0x8000~0xfff – 사용자 정의 값

TransferType 해당 컨트롤 코드를 위한 버퍼 전송 매커니즘• METHOD_BUFFERED• METHOD_IN_DIRECT• METHOD_OUT_DIRECT• METHOD_NEITHER

RequiredAccess 요청자의 접근 요청• FILE_ANY_ACCESS• FILE_READ_DATA• FILE_WRITE_DATA• FILE_READ_DATA | FILE_WRITE_DATA

<CTL_CODE 매크로 인자 >

Page 28: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 28

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

IOCTL IOCTL 인자 전달 방법인자 전달 방법

• CTL_CODE 의 TransferType(2bit)

• METHOD_BUFFERED• METHOD_IN_DIRECT• METHOD_OUT_DIRECT• METHOD_NEITHER

Page 29: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 29

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

IOCTL IOCTL 헤더 파일 작성하기헤더 파일 작성하기

#define IOCTL_MISSLEDEVICE_AIM CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ACCESS_ANY)

// IOCTL_MISSLEDEVICE_AIM 에서 사용된 구조체Typedef struct _AIM_IN_BUFFER {

ULONG Longitude;ULONG Latitude;

} AIM_IN_BUFFER, *PAIM_IN_BUFFER;

Typedef struct _AIM_OUT_BUFFER {ULONG ExtendedStatus;

} AIM_OUT_BUFFER, *PAIM_OUT_BUFFER;

#define IOCTL_MISSLEDEVICE_LAUNCH CTL_CODE( \FILE_DEVICE_UNKNOWN, \0x802, \METHOD_NEITHER, \FILE_ACCESS_ANY)

Page 30: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 30

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

IOCTL IOCTL 요청의 처리요청의 처리 (1)(1)

• I/O 관리자가 아닌 드라이버의 책임NTSTATUS DispatchIoControl(IN PDEVICE_OBJECT pDO, IN PIRP pIrp) {

NTSTATUS status = STATUS_SUCCESS;PDEVICE_EXTENSION pDE;PVOID userBuffer;ULONG inSize;ULONG outSize;ULONG controlCode; // IOCTL 요청 변수

// 스택 로케이션은 사용자 버퍼의 정보를 담고 있다 .PIO_STACK_LOCATION pIrpStack;pIrpStack = IoGetCurrentIrpStackLocation(pIrp);// IOCTL 요청을 뽑아낸다 .controlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;

// 그리고 요청된 전송 크기도 알아낸다 .inSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;outSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;

Page 31: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 31

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

//// 두 번째 Switch 문을 구현한다 .switch (controlCode) {case IOCTL_MISSLEDEVICEAIM :

// 각 case 에서 항상 매개변수의 유효함을 확인하다 .if(inSize < sizeof(AIM_IN_BUFFER) ||

outSize < sizeof(AIM_OUT_BUFFER)){

status = STATUS_INVALID_BUFFER_SIZE;break;

}// 유효한 IRP 이므로 디바이스를 구동한다 .IoMarkIrpPending(pIrp);IoStartPacket(pDO, pIrp, 0, NULL);return STATUS_PENDING;

case IOCTL_DEVICE_LAUNCH :if(inSize > 0 || outSize >0)

// 진짜 에러는 아니다 . 그러나 호출자에게 해당 호출의 //목적에 대해 다시 생각하도록 주의를 준다 .

{status = STATUS_INVALID_PARAMETER;break;

}// 디바이스를 구동하게 하는 동일한 코드를 넣는다 .// :return STATUS_PENDING;

default :// 드라이버에서 인식할 수 없는 요청을 받았다 .status = STATUS_INVALID_DEVICE_REQUEST;break;

}

IOCTL IOCTL 요청의 처리요청의 처리 (2)(2)

Page 32: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 32

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

IOCTL IOCTL 요청의 처리요청의 처리 (3)(3)

// 유효한 컨트롤 코드의 경우는 상위 계층으로 리턴된다 .// 이 부분에서의 실행은 에러가 발생했을 경우이다 .// IRP 요청을 실패 처리한다 . pIrp->IoStatus.Status = status;pIrp->IoStatus.Information = 0; // 아무런 데이터가 없음을 지정한다 .IoCompleteRequest(pIrp, IO_NO_INCREMENT);return status;

}

Page 33: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 33

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

IOCTL IOCTL 버퍼 관리버퍼 관리

• 독립적인 버퍼 전송 메커니즘• 입력과 출력의 2 개의 버퍼

METHOD_BUFFERED METHOD_IN_DIRECT METHOD_OUT_DIRECT

METHOD_NEITHER

Page 34: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

Testing Driver Dispatch RoutinesTesting Driver Dispatch Routines

Page 35: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 35

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

테스트 과정테스트 과정

• 디바이스의 핸들을 제대로 열고 닫을 수 있는지• 비록 데이터의 전송은 수행하지 않는다 하더라도 ,

Win32 I/O 함수의 호출이 성공적인지• 다수의 I/O 요청에 대해 정상동작을 하는지

Page 36: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 36

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

예제 테스트 프로그램예제 테스트 프로그램

#include <windows.h>#include <stdio.h>

Void main() {HANDLE hDevice;BOOL status;hDevice = CreateFile(\\\\.\\LBK1 ...);:status = ReadFile(hDevice, ...);:status = WriteFile(hDevice, ...);:status = DeviceIoControl(hDevice, ...);:status = CloseHandle(hDevice, ...);

}

<Win32 콘솔 테스트 프로그램>

Page 37: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 37

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

예제 테스트 프로그램 결과예제 테스트 프로그램 결과

Page 38: Ch 7. Driver Dispatch Routines

ISLab Flash TeamISLab Flash Team

SummarySummary

Page 39: Ch 7. Driver Dispatch Routines

Ch 7. Driver Dispatch Routines 39

ISLab Flash TeamISLab Flash Team

Made By ICEUNI

SummarySummary

• 드라이버 디스패치 루틴은 드라이버와 I/O 요청자 간의 인터페이스를 제공한다 .

• 드라이버는 읽기 , 쓰기 그리고 디바이스 I/O 컨트롤을 지원한다 .