2011. 9. 26. 16:46, 유용한 지식 자료들/드라이버, 커널 관련
1. IRP(I/O Request Packet) : 통신의 주체이며 데이터 버퍼를 포함하는 데이터 구조체, 드라이버는 IRP를 처리하는 함수를 가지고 있어야 한다.
2. IOCTL(I/O Control) : 유저 에플리케이션과 커널 드라이브간 통신을 위해 프로그래머가 정의하는 명령
#드라이버의 생성 절차(http://gogil.tistory.com/9)
DriverEntry -> IoCreateDevice -> IoCreateSymbolicLink -> MajorFunction과 DriverUnload 등록
#App와 통신 절차(http://guimong.tistory.com/66)
IRP_MJ_CREATE -> IRP_MJ_DEVICE_CONTROL(APP에서 드라이버로 입력이 있을 경우) -> IRP_MJ_CLOSE
User App에서 DeviceIoControl()에 전달될 IoCotrolCode의 정의(#예)는 다음과 같다.
#define IOCTL_EXAMPLE_SAMPLE_DIRECT_IN_IO CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_IN_DIRECT, FILE_READ_DATA | FILE_WRITE_DATA)
특히 CTL_CODE 부분은 다음과 같은 구조로 되어있다.
출처 : http://luckey.tistory.com/122
Method는 다음과 같다.
METHOD_IN_DIRECT
METHOD_IOUT_DIRECT
METHOD_BUFFERED
METHOD_NEITHER : 3(11b), App 메모리 주소를 사용(?)
METHOD_IOUT_DIRECT
METHOD_BUFFERED
METHOD_NEITHER : 3(11b), App 메모리 주소를 사용(?)
IOCTL에 대한 다른 정보!~
http://ezbeat.tistory.com/341
보충~(http://ezbeat.tistory.com/286)
User에서 I/O Control을 위해 DeviceIoControl()함수를 호출하면 디바이스에 IRP가 전달되는데, 디바이스에서 해당 IRP를 처리하기 위해 IoGetCrurrentirpStackLocation을 사용하여 IRP에 존재하는 IO 스택 포인터 위치를 전달 받는다. 전달 받은 구조체는 IO_STACK_LOCATION(24byte)이고 그안에 DeviceIoControl()함수 호출시 파라미터로 넘긴 IoControlCode를 처리한다.
pStack->Parameters.DeviceIoControl.IoControlCode
와우!! DDK 모든 Ref!!!!
http://www.perisoft.net/engineer/wdmcard.htm
------------------
맞는지 모르겠지만 일단 나름대로 하면!
드라이버는 최초 디바이스와 심볼링링크, MajorFunction을 미리 생성한다. 이후 App는 미리 생성된 MajorFunction을 호출하여 원하는 행위를 할 수 있는데 이때 IoControlCode라는 것이 핵심으로 User App에서 보내는 IRP를 확인하면 어떤 행위를 하려는 것인지 알 수가 있다. 따라서 Control Code의 구조를 알고 호출하는 Function이 무엇인지 확인하는 것이 주요하다. 해당 Function은 IRP_MJ_DEVICE_CONTROL(0x0e)에서 확인한다.
'유용한 지식 자료들 > 드라이버, 커널 관련' 카테고리의 다른 글
SCSI REQUEST BLOCK의 CDB[0].OperationCode Commands (1) | 2011.10.11 |
---|---|
atapi object +74h hook (0) | 2011.09.28 |
atapi의 특정 Major Function 후킹 (0) | 2011.09.28 |
IoControl 정보 제공 툴 (0) | 2011.09.26 |
후킹을 통한 프로세스 및 파일 보호 (0) | 2011.09.22 |
Comments, Trackbacks