- HOME
- Post in | and so on/윈도우서비스
- Post at | 2013. 3. 11. 10:02 | by 밀크빵.
- View comment
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 : 이름 지정
'and so on > 윈도우서비스' 카테고리의 다른 글
서비스 - 프로그램 IPC (0) | 2013.03.20 |
---|---|
7.드라이버에서 라이브러리 사용하기 (0) | 2013.03.11 |
5. 드라이버의 설치 및 확인 방법 (0) | 2013.03.11 |
서비스 프로그램에서 ShellExecute 사용법 (0) | 2013.03.08 |
4. Admin 권한으로 실행되는 프로그램에 대한 정리 (0) | 2013.02.28 |