6. 드라이버와 에이전트와의 통신

1.      윈도우에서는 커널 모드와 유저 모드간에 데이터를 주고 받기 위해 크게 두 가지 방식 제공

A.     Buffered I/O

                i.         I/O manager에서 해당 데이터의 사이즈를 먼저 체크 한 후 해당 데이터가 들어갈 만한 충분한 사이즈의 페이지 되지 않은 버퍼메모리를 성성

               ii.         드라이버에 데이터를 쓰는 작업의 경우 유저 모드 데이터를 이 버퍼에 복사

              iii.         드라이버에서 이 버퍼 메모리의 값을 참조하거나 혹은 데이터 읽기 작업일 경우 버퍼에 드라이버가 가지고 잇는 데이터를 저장

              iv.         해당 작업이 완료되면 I/O manager는 버퍼에 있는 데이터를 다시 유저 모드 메모리에 복사하고 버퍼메모리를 해제

B.     Direct I/O

                i.         데이터를 주고 받는 요청이 발생하면 I/O manager에서 해당 메모리가 스와핑 되지 않도록 일종에 잠금 장치를 함

               ii.         잠겨진(Locked) 메모리를 드라이버에서 쉽게 참조할 수 있도록 관련 정보가 저장된 MDL을 만듬

              iii.         드라이버에서는 DML을 가지고 참조 가능한 메모리 포인터를 리턴해주는 MmGetSystemAddresForMdl()이라고 하는 API를 사용하여 데이터를 주고 받을 포인터를 만들고 이 포인터를 이용해서 데이터를 처리

              iv.         I/O manager는 쓰기/읽기 동작이 완료되면 MDL을 제거하고 해당 메모리의 잠금 장치를 해제

               v.          


2.      두개의 파일 필요

A.     유저 어플인 exe

B.     디바이스 드라이버 sys

3.      유저 어플

A.     DeviceIoControl 함수

                i.         유저어플과 디바이스와 대화를 할 수 있는 함수

               ii.         양방향성을 가짐

B.     단방향성을 가지는 함수

                i.         ReadFile, WireFile

4.      디바이스 드라이버 코드

A.     DriverEntry

                i.         IoCreateDevice : 디바이스 생성

               ii.         IoCreateSymbolicLink : 이름 지정