ISLab Flash Team Ch 15 Layered Drivers Part
ISLab Flash Team Ch 15. Layered Drivers PartⅠ Ch 15. Layered Drivers
ISLab Flash Team 1. Intermediate 드라이버의 개관 Ch 15. Layered Drivers
ISLab Flash Team 2. 계층 드라이버의 작성 Ch 15. Layered Drivers
계층 드라이버가 동작하는 방식 IRP For Hi 0 HIDRIVER HI 0 I/O Completion Dispatch : : Io. Call. Driver : return 바로 IRP를 하위 드라이버로 내려 보냄 LODRIVER LO 0 Dispatch or Dpc. For. Isr : Io. Complete. Request <계층 드라이버의 동작> IRP를 처리중의 상태로 유지하고 추가적으로 IRP를 생성 하위 드라이버에게 이를 보낸다. ISLab Flash Team Ch 15. Layered Drivers 10 Made By ICEUNI
ISLab Flash Team 3. I/O 완료 루틴의 작성 Ch 15. Layered Drivers
I/O 완료 콜백을 요청하기 • Io. Set. Completion. Routine 함수 • I/O 완료 루틴의 주소를 하위 레벨 드라이버의 I/O 스택 로케이션 안에 넣는 역할을 한다. VOID Io. Set. Completion. Routine IRQL <= DISPATCH_LEVEL 인자 설명 IN PIRP p. Irp 드라이버에서 추적하려는 IRP의 주소 IN PIO_COMPLETION_ROUTINE Completion. Routine 하위 드라이버가 IRP를 완료했을 때 호출 되는 루틴 IN PVOID p. Contex I/O 완료 루틴으로 전달되는 인자 IN BOOLEAN b. Invoke. On. Success IRP가 성공적으로 수행되었을 때 호출 IN BOOLEAN b. Invoke. On. Error IRP 처리에 에러가 발생했을 때 호출 IN BOOLEAN b. Invoke. On. Cancel IRP가 취소되었을 때 호출 리턴 void <Io. Set. Completion. Routine 함수 원형> ISLab Flash Team Ch 15. Layered Drivers 20 Made By ICEUNI
실행 컨텍스트 • I/O 완료 루틴이 호출되는 시점에 I/O 관리자는 I/O 스택 포인터를 스택에서 꺼낸다. NTSTATUS Io. Completion IRQL == PASSIVE_LEVEL IRQL == DISPATCH_LEVEL 인자 설명 IN PDEVICE_OBJECT p. Dev. Obj 방금 완료된 요청의 디바이스 객체 IN PIRP p. Irp 완료된 IRP IN PVOID p. Context Io. Set. Completion. Routine으로부터 전달된 컨 텍스트 리턴 STATUS_MORE_PROCESSING_REQUIRED STATUS_SUCCESS <I/O 완료 루틴의 함수 원형> ISLab Flash Team Ch 15. Layered Drivers 21 Made By ICEUNI
ISLab Flash Team 4. IRP의 추가 할당 Ch 15. Layered Drivers
IRP의 I/O 스택 재방문(Revisited) IRP 스택 포인터로 작업하기 함수 IRP 스택 포인터의 영향 Io. Get. Current. Irp. Stack. Location 변화 없음 Io. Get. Next. Irp. Stack. Location 변화 없음 Io. Set. Next. Irp. Stack. Location 스택 포인터를 한 위치 push한다 Io. Call. Driver 스택 포인터를 한 위치 push한다 Io. Complete. Request 스택 포인터를 한 위치 pop한다 <I/O 스택 포인터에 영향을 주는 함수들> ISLab Flash Team Ch 15. Layered Drivers 26 Made By ICEUNI
Io. Build. Synchronous. Fsd. Request로 IRP 생성 • Read, write, flush, shutdown IRP를 동기적으로 만드는데 사용한다. PIRP Io. Build. Synchronous. Fsd. Request IRQL == PASSIVE_LEVEL 인자 설명 IN ULONG Major. Function IRP_MJ_READ IRP_MJ_WRITE IRP_MJ_FLUSH_BUFFERS IRP_MJ_SHUTDOWN IN PDEVICE_OBJECT p. Target. Device IRP를 보낼 디바이스 객체 IN OUT PVOID p. Buffer I/O 버퍼의 주소 INULONG Length 버퍼의 바이트 크기 IN PLARGE_INTEGER starting. Offset I/O가 시작되는 디바이스의 바이트 오프셋 IN PKEVENT p. Event I/O완료의 시그널로 사용되는 이벤트 객체 OUT PIO_STATUS_BLOCK losb I/O 수행 동작의 마지막 결과를 받는다. 리턴 Non-NULL : 새로 생성된 IRP의 주소 NULL : IRP가 생성되지 않음 <Io. Build. Synchronous. Fsd. Request 함수 원형> ISLab Flash Team Ch 15. Layered Drivers 28 Made By ICEUNI
Io. Build. Asynchronous. Fsd. Request로 IRP 생성 • Read, write, flush, shutdown IRP를 비동기적으로 만드는데 사용 PIRP Io. Build. Asynchronous. Fsd. Request IRQL <= DISPATCH_LEVEL 인자 설명 IN ULONG Major. Function IRP_MJ_READ IRP_MJ_WRITE IRP_MJ_FLUSH_BUFFERS IRP_MJ_SHUTDOWN IN PDEVICE_OBJECT p. Target. Device IRP를 보낼 디바이스 객체 IN OUT PVOID p. Buffer I/O 버퍼의 주소 INULONG Length 버퍼의 바이트 크기 IN PLARGE_INTEGER starting. Offset I/O가 시작되는 디바이스의 바이트 오프셋 OUT PIO_STATUS_BLOCK losb I/O 수행 동작의 마지막 결과를 받는다. 리턴 Non-NULL : 새로 생성된 IRP의 주소 NULL : IRP가 생성되지 않음 <Io. Build. Synchronous. Fsd. Request 함수 원형> ISLab Flash Team Ch 15. Layered Drivers 29 Made By ICEUNI
Io. Build. Device. Io. Control. Request로 IRP 생성 • IOCTL IRP를 만드는 작업을 제공한다. • Custom IOCTL을 통해 어떤 특정 동작을 드라이버에서 익스포트시 킨 인터페이스를 사용하는 일반적인 방법 PIRP Io. Build. Device. Control. Request IRQL == PASSIVE_LEVEL 인자 설명 IN ULONG Io Control. Code 타겟 디바이스에 의해 인식되는 IOCTL 코드 IN PDEVICE_OBJECT p. Target. Device IRP를 보낼 디바이스 객체 IN PVOID input. Buffer 하위 드라이버로 전달되는 버퍼 IN ULONG input. Length 입력 버퍼의 바이트 길이 OUT PVOID output. Buffer 하위 드라이버에 의해 리턴된 버퍼 IN ULONG output. Length 출력 버퍼의 바이트 길이 IN BOOLEAN Internal. Device. Io. Control TRUE – Internal 요청, FALSE – External 요청 IN PKEVENT p. Event I/O 완료에 시그널로 사용되는 이벤트 객체 OUT PIO_STATUS_BLOCK losb I/O 수행동작의 마지막 결과를 받는다. 리턴 Non-NULL : 새로 생성된 IRP의 주소 NULL : IRP가 생성되지 않음 < Io. Build. Device. Control. Request 함수 원형> ISLab Flash Team Ch 15. Layered Drivers 30 Made By ICEUNI
다른 방법으로 IRP 할당하기(2) • Ex. Allocate. Pool로 IRP 할당하기 – 읽기 동작이라고 가정하고, 설정한다. – MDL 대신 커스텀 버퍼를 사용한다. – 이전 예제에서 보여주었듯이, 원래 호출자의 쓰레드 정보를 복사 한다. NTSTATUS Io. Completion( IN PDEVICE_OBJECT p. Dev. Obj, IN PIRP p. Irp, IN PVOID p. Context ) { . . . // 하위 드라이버에 의해 사용된 커스텀 버퍼를 해제한다. Ex. Free. Pool( p. Irp->Associated. Irp. System. Buffer ); // 수동으로 할당된 IRP를 해제한다. Io. Free. Irp( p. Irp ); return STATUS_MORE_PROCESSING_REQUIRED; } ISLab Flash Team Ch 15. Layered Drivers 32 Made By ICEUNI
ISLab Flash Team Part 1. Summary Ch 15. Layered Drivers
- Slides: 40